# 家庭服务器搭建 **(一定不要用MAC系统搭建,服了)软件** 解决运营商上传限速问题: 1、在域名中添加speedtest 2、使用流量保镖脚本,平衡上传、下载流量 ```bash #!/bin/bash # =================配置区域================= MAIL_TO="hitmickeyq@qq.com" MONTHLY_LIMIT_GB=1000 # 将阈值修改为 1TB (1000GB) URL="https://officecdn.microsoft.com/pr/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-cn/ProPlus2021Retail.img" STATUS_FILE="$(dirname "$0")/.netkeep_service.log" # 状态文件,存放在脚本同级目录 # ========================================== echo "流量保镖服务已启动..." echo "状态记录文件位置: $STATUS_FILE" MONTHLY_LIMIT_MB=$(( MONTHLY_LIMIT_GB * 1000 )) # 1. 状态文件初始化 (格式: 年-月 累计流量MB 邮件是否已发送) if [ ! -f "$STATUS_FILE" ]; then echo "$(date +'%Y-%m') 0 0" > "$STATUS_FILE" fi while true; do # 2. 每次外层循环第一步:从本地文件读取绝对真实状态 read SAVED_MONTH MONTHLY_TOTAL_MB EMAIL_SENT < "$STATUS_FILE" CURRENT_MONTH=$(date +'%Y-%m') # 3. 跨月检测(绝对可靠,无惧重启) if [ "$CURRENT_MONTH" != "$SAVED_MONTH" ]; then echo ">>> 检测到自然跨月 ($SAVED_MONTH -> $CURRENT_MONTH),状态重置。" SAVED_MONTH=$CURRENT_MONTH MONTHLY_TOTAL_MB=0 EMAIL_SENT=0 echo "$SAVED_MONTH $MONTHLY_TOTAL_MB $EMAIL_SENT" > "$STATUS_FILE" fi # 4. 阈值拦截与单层休眠逻辑 if [ "$MONTHLY_TOTAL_MB" -ge "$MONTHLY_LIMIT_MB" ]; then # 保证满 1TB 后只发一次邮件 if [ "$EMAIL_SENT" -eq 0 ]; then echo ">>> 本月累计流量已达 ${MONTHLY_LIMIT_GB}GB (1TB),发送通知邮件..." Subject="流量保镖通知:本月累计流量已达 ${MONTHLY_LIMIT_GB}GB" msg="您的流量保镖服务本月累计下载已达 ${MONTHLY_LIMIT_GB}GB。\n时间:$(date +'%F %T')\n下载任务已自动暂停,将在下个月自动重置并恢复运行。" { echo "To: $MAIL_TO" echo "Subject: $Subject" echo "Date: $(date -R)" echo "Content-Type: text/plain; charset=UTF-8" echo echo -e "$msg" } | msmtp -a default "$MAIL_TO" EMAIL_SENT=1 echo "$SAVED_MONTH $MONTHLY_TOTAL_MB $EMAIL_SENT" > "$STATUS_FILE" fi echo "$(date +'%T') 任务挂起:本月已达标。1小时后再次检测月份..." sleep 3600 continue # 直接跳过下方下载,进入下一轮 while 循环重新核对月份 fi # ------------------ 以下为核心下载逻辑 ------------------ RANDOM_RATE=$(( (RANDOM % 3) + 1 )) RANDOM_TIME=$(( (RANDOM % 301) + 600 )) RANDOM_MB=$(( (RANDOM % 2001) + 2000 )) SIZE_BYTES=$(( RANDOM_MB * 1024 * 1024 )) echo "------------------------------------------------" echo -e "$(date +'%F %T'): 新一轮任务开始。\n计划速度:${RANDOM_RATE}MB/s,计划下载: ${RANDOM_MB}MB。\n该轮结束休息时间:${RANDOM_TIME}s。" # 将 -s 改为了 -#,这样你可以直观看到下载进度条,防止以为脚本卡死 RESULT=$(curl -L -o /dev/null \ -# \ --limit-rate "${RANDOM_RATE}M" \ -r 0-$((SIZE_BYTES - 1)) \ -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36" \ --connect-timeout 20 \ -w "%{http_code} %{size_download}" \ "$URL") read HTTP_CODE BYTES_DOWNLOADED <<< "$RESULT" if ! [[ "$BYTES_DOWNLOADED" =~ ^[0-9]+$ ]]; then BYTES_DOWNLOADED=0 fi ACTUAL_MB=$(( BYTES_DOWNLOADED / 1024 / 1024 )) if [[ "$HTTP_CODE" -eq 200 || "$HTTP_CODE" -eq 206 ]]; then MONTHLY_TOTAL_MB=$(( MONTHLY_TOTAL_MB + ACTUAL_MB )) # 每次成功下载后,立刻将最新流量写入硬盘 echo "$SAVED_MONTH $MONTHLY_TOTAL_MB $EMAIL_SENT" > "$STATUS_FILE" echo "结果: 任务完成 | HTTP $HTTP_CODE | 实际获取: ${ACTUAL_MB}MB | 本月累计: ${MONTHLY_TOTAL_MB}MB" else echo "结果: 任务失败 | HTTP $HTTP_CODE | 流量未计入" Subject="流量保镖警告:下载任务失败 (HTTP $HTTP_CODE)" msg="流量保镖检测到一次下载异常:\n\n状态码:$HTTP_CODE\n时间:$(date +'%F %T')\n\n该轮流量未计入统计,系统将按计划进入休息阶段。" { echo "To: $MAIL_TO" echo "Subject: $Subject" echo "Date: $(date -R)" echo "Content-Type: text/plain; charset=UTF-8" echo echo -e "$msg" } | msmtp -a default "$MAIL_TO" fi echo "本轮结束,休息 ${RANDOM_TIME} 秒..." sleep ${RANDOM_TIME} done ``` 3、使用fakehttp,fakesip(没用) 教程:[fakehttp](https://github.com/MikeWang000000/FakeHTTP/wiki),[fakesip](https://github.com/MikeWang000000/FakeSIP/wiki) 下载安装压缩包,解压即可运行 创建systemd服务(fakesip服务依次类推) ```bash [Unit] Description=fakehttp service After=network.target [Service] Type=simple ExecStart=/home/mickey/APP/fakehttp/fakehttp -h www.apple.com -i enp2s0 Restart=on-failure RestartSec=10 User=root [Install] WantedBy=multi-user.target ``` 这3个步骤应该是目前稍微有点效果的方法了,不一定有用,只能说能提高一点是一点吧。 --- ## 监听端口 ### 家庭服务器 ~~83 内网访问typora_documents~~ ~~84 外网访问typora_documents~~ 999 主页 ~~1000 nginx-ui password:lmqCQM,YSZGAYRty!nginx~~ 2000 openlist password:lmqCQM,YSZGAYRty!openlist ~~2001 openlist-ftp控制端口~~ 2002 Filebrowser Quantum password:lmqCQM,YSZGAYRty!filebrowser 2100 copyparty ~~40000-40100 openlist ftp被动传输模式端口~~ 2700 meilisearch 3000 ddns-go password:lmqCQM,YSZGAYRty!ddns-go 4000 jellyfin password:lmqCQM,YSZGAYRty!jellyfin 5000 qbittorrent_enhanced password:lmqCQM,YSZGAYRty!qbittorrent 5800 mkvtoolnix password: lmqCQM,YSZGAYRty!mkvtoolnix ~~5055 thunder~~(已启用) 6001 ssh ~~6002 smb~~(已弃用) 6003 TMM password:lmqCQM,YSZGAYRty!tmm 6005 docker版迅雷 password:lmqCQM,YSZGAYRty!xunlei 6006 beszel 账号: password:lmqCQM,YSZGAYRty!beszel 6007 pdf2zh 6033 preview ~~6055 open-notebook REST API~~ ~~6100 open-notebook surrealdb~~ ~~6502 open-notebook webui~~ 6660 resilio_sync password:lmqCQM,YSZGAYRty!resiliosync 7000 百度网盘 password:lmqCQM,YSZGAYRty!baidunetdisk 8000 speedtest 8002 rustdesk password:lmq666CQM,YSZGAYRty!rustdesk 9000 clash-ui password:lmqCQM,YSZGAYRty!clash ~~9001 url-converter~~ 9002 sub-store api 9003 sub-store http-meta ~~62108 glances password:lmqCQM,YSZGAYRty!glances~~(弃用) **列出所有开机自启的服务** ```bash systemctl list-unit-files --type=service | grep enabled ``` ### 雨云服务器 | **动作** | **源地址** | **业务端口** | **协议** | **启用** | **描述** | | -------- | ---------- | ------------ | -------- | -------- | --------------- | | 允许 | | 443 | tcp | 是 | | | 允许 | | 80 | tcp | 是 | | | 允许 | | 8002:8005 | tcp | 是 | rustdesk | | 允许 | | 21116 | udp | 是 | rustdesk | | 允许 | | 21115:21117 | tcp | 是 | rustdesk | | 允许 | | 7000 | tcp | 是 | frp | | 允许 | | 9993 | udp | 是 | zerotier_moon | | 允许 | | 5201 | udp | 是 | iperf3 | | 允许 | | 5201 | tcp | 是 | iperf3 | | 允许 | | 11010 | tcp | 是 | easytier_core | | 允许 | | 22020 | udp | 是 | easytier_server | | 允许 | | 22 | tcp | 是 | ssh | | 允许 | | 全部 | icmp | 是 | ping | | 丢弃 | | 全部 | 全部 | 是 | 兜底拦截规则 | ## 硬件 铁威马D4-320,pdd价格:711 山克upsSP1000A,tb价格:175 西数HC550 16T,入手价格:1642 ## 系统 ### Ubuntu22.04(改用ubuntu24.04) * 通电自启和翻盖自启需要到BIOS主板界面设置,苹果电脑可现在mac系统上设置好再重装ubuntu系统,仍然有效 * ubuntu系统下设置关盖不息屏 #### 配置文件 ``` sudo gedit /etc/systemd/logind.conf ``` #### 配置说明 ``` HandlePowerKey`: 按下电源键后的行为,默认`power off` `HandleSleepKey`: 按下[挂起](https://so.csdn.net/so/search?q=挂起&spm=1001.2101.3001.7020)键后的行为,默认`suspend` `HandleHibernateKey`: 按下休眠键后的行为,默认`hibernate` `HandleLidSwitch`: 合上笔记本盖后的行为,默认`suspend ``` 只监视带有 “power-switch” 标签的 输入设备的 key(按下按钮)/lid(合上盖子) 事件。 如果主机插入了一个扩展坞(docking station) 或者连接了多个显示器, 那么"合上盖子"将执行 HandleLidSwitchDocked= 动作; 如果主机使用外部电源, 并且 HandleLidSwitchExternalPower= 不是默认值(“ignore”), 那么"合上盖子"将执行 HandleLidSwitchExternalPower= 动作; 否则将执行 HandleLidSwitch= 动作。 **参数说明** `ignore`(无操作), `poweroff`(关闭系统并切断电源), `reboot`(重新启动), `halt`(关闭系统但不切断电源), `kexec`(调用内核"kexec"函数), `suspend`(休眠到内存), `hibernate`(休眠到硬盘), `hybrid-sleep`(同时休眠到内存与硬盘), `suspend-then-hibernate`(先休眠到内存超时后再休眠到硬盘), `lock`(锁屏) #### 设置笔记本合并盖子不休眠 编辑文件`/etc/systemd/logind.conf` 将 ```bash #HandleLidSwitch=suspend ``` > 注意前面的 # 也要去掉 修改为(无操作) ```bash HandleLidSwitch=ignore ``` 或(锁屏) ```bash HandleLidSwitch=lock ``` 重启服务 ```bash sudo service systemd-logind restart ``` ## 设置ubuntu系统关闭临时ipv6地址生成 ### 1. 临时关闭隐私扩展(立即生效,重启后失效) 在终端执行: ``` # 关闭所有网卡的 IPv6 临时地址 sudo sysctl -w net.ipv6.conf.all.use_tempaddr=0 sudo sysctl -w net.ipv6.conf.default.use_tempaddr=0 ``` 然后针对你的网卡(比如 `enx98fc84e707ac`): ``` sudo sysctl -w net.ipv6.conf.enx98fc84e707ac.use_tempaddr=0 ``` 执行后,用 `ip -6 addr` 查看,你会发现 **temporary dynamic** 那些地址不再新增,只剩下稳定地址。 ### 2. 永久关闭隐私扩展(重启也生效) 编辑配置文件: ``` sudo vim /etc/sysctl.conf ``` 在文件末尾添加以下内容: ``` # 禁用 IPv6 临时地址(privacy extension) net.ipv6.conf.all.use_tempaddr = 0 net.ipv6.conf.default.use_tempaddr = 0 net.ipv6.conf.enx98fc84e707ac.use_tempaddr = 0 ``` ### 3. 让配置生效 ``` sudo sysctl -p ``` ### 4. 验证结果 重启电脑再次查看 IPv6 地址: ``` ip -6 addr show dev enx98fc84e707ac ``` 这时你应该只会看到: * `global dynamic mngtmpaddr noprefixroute`(稳定 IPv6) * `fe80::...`(链路本地地址) 不会再有一堆 `global temporary dynamic` 地址了。 ### 注意事项 1. **如果你用桌面系统 (NetworkManager)** 有时候 NetworkManager 会覆盖 `sysctl`,可以在对应连接配置里禁用 IPv6 隐私扩展。 1. 在`/etc/netplan`下查找文件 2. 依次打开每个文件查找其中内容是否有`ipv6.ip6-privacy`或`ipv6-privacy`等内容(不同版本命名不一样),如果有,修改赋值,改为`false`或`0` ``` ipv6.ip6-privacy: "0" 或 ipv6-privacy: false ``` ## 设置文件权限 通过ACL设置文件权限,防止后续docker容器或者网盘挂载没有权限访问,由于服务器上只有我1个账户,不用担心其他账户访问数据的问题,所以,可以直接设置为777(常用权限:755,666,777) ```bash sudo setfacl -R -m u::rwx,d:g::rwx,d:o::rwx /home/mickey sudo setfacl -R -m d:u::rwx,d:g::rwx,d:o::rwx /home/mickey sudo chmod 755 /home/mickey # 排除已经属于mickey组,root组和docker组的文件,对不属于的文件进行赋权mickey:mickey,仅限于/home/mickey文件夹 find /home/mickey ! \( -user mickey -group mickey \) ! \( -user root -group root \) ! -group docker -ls sudo find /home/mickey ! \( -user mickey -group mickey \) ! \( -user root -group root \) ! -group docker -exec chown mickey:mickey {} + ``` 后续的文件如果需要更严格的权限,可以单独设置,不影响,例如ssh,msmtp 如果遇到有应用还是不能更改文件的,修改其systemd服务,将user和group都改为mickey,如果找不到systemd服务,可以通过systemctl status <服务名称>来查看服务配置文件位置 需要注意的是,ACL继承对于docker容器内修改的文件不适用,这个时候需要用的inotify-tools ```bash sudo apt update sudo apt install -y inotify-tools vim /home/mickey/APP/sh/inotify-nas.sh ## 内容开始 #!/bin/bash WATCH_DIR="/home/mickey/nas" inotifywait -m -r -e create -e moved_to "$WATCH_DIR" --format '%w%f' | while read NEW_FILE do if [ -d "$NEW_FILE" ]; then # 如果是目录,检查权限 PERM=$(stat -c "%a" "$NEW_FILE") if [ "$PERM" -ne 777 ]; then echo "目录权限不是 777,修改权限: $NEW_FILE" sudo chmod 777 "$NEW_FILE" fi elif [ -f "$NEW_FILE" ]; then # 如果是文件,检查权限 PERM=$(stat -c "%a" "$NEW_FILE") if [ "$PERM" -ne 666 ]; then echo "文件权限不是 666,修改权限: $NEW_FILE" chmod 666 "$NEW_FILE" fi fi done ## 内容结束 sudo chmod +x /home/mickey/APP/sh/inotify-nas.sh sudo vim /etc/systemd/system/inotify-nas.service ## 内容开始 [Unit] Description=inotify /home/mickey/nas and auto chmod 777 After=network.target [Service] ExecStart=/home/mickey/APP/sh/inotify-nas.sh Restart=always User=root [Install] WantedBy=multi-user.target ## 内容结束 sudo systemctl daemon-reload sudo systemctl start inotify-nas.service sudo systemctl enable inotify-nas.service sudo systemctl status inotify-nas.service ``` ## 设置交换空间大小 ### 1. 查看当前交换空间状态 在开始之前,先确认系统中当前的交换空间大小和路径。 ```bash swapon --show NAME TYPE SIZE USED PRIO /swap.img file 32G 2.2G -2 ``` ### 2. 停用当前的交换文件 在修改文件之前,必须先禁用它。通常默认路径为 `/swapfile`。 ```bash # 根据自己的路径进行修改,之后命令同理 sudo swapoff /swap.img ``` ### 3. 创建新的交换文件 你可以根据需要设定大小(例如将 `4G` 替换为你想要的大小,如 `8G` 或 `16G`)。 **方法 A:使用 `fallocate`(推荐,速度最快)** ``` sudo fallocate -l 16G /swap.img ``` **方法 B:如果 `fallocate` 报错,请使用 `dd` 命令** ``` sudo dd if=/dev/zero of=/swap.img bs=1G count=16 ``` *(注意:`bs=1G count=16` 表示 16GB)* ### 4. 设置正确的权限 为了安全起见,交换文件只能由 root 用户读写。 ``` sudo chmod 600 /swap.img ``` ### 5. 格式化为交换格式 将该文件初始化为交换空间。 ``` sudo mkswap /swap.img ``` ### 6. 启用交换文件 Bash ``` sudo swapon /swap.img ``` ### 7. 设置永久生效 检查 `/etc/fstab` 文件,确保系统重启后依然加载该交换文件。 1. 打开文件: ``` sudo vim /etc/fstab ``` 2. 确认文件中包含以下行(如果没有则添加): ``` /swapfile none swap sw 0 0 ``` ## 设置系统日志大小 ```bash sudo vim /etc/systemd/journald.conf ``` ```bash SystemMaxUse=1G RuntimeMaxUse=64M MaxRetentionSec=1month ``` ```bash # 重启服务 sudo systemctl restart systemd-journald # 查看当前日志占用的实际大小,以及配置的限制 journalctl --disk-usage ``` 其他操作命令: ```bash # 1. 强制轮转日志,把当前的活跃日志文件变成“归档”状态 sudo journalctl --rotate # 2. 现在清理掉所有归档日志 sudo journalctl --vacuum-time=1s # 查看 9000 端口是否有程序在监听 sudo ss -tulpn | grep :9000 # 查看过去5分钟的报错 sudo journalctl -u frpc.service --since "5 minutes ago" | grep -i "error" sudo journalctl -u frps -n 100 --no-pager sudo journalctl -u frps -f | grep -E "error|warn" ``` ----- ## 个人主页 windows端git clone下来,在本地编译修改即可,这样最好 ## 1、[ddns-go](https://github.com/jeessy2/ddns-go) * mac 动态域名解析,安装命令: ``` sudo ./ddns-go -s install -l localhost:3000 -f 10 -cacheTimes 180 -c /Users/name/.ddns_go_config.yaml ``` 其中监听端口和最后的配置文件路径根据需求修改就行 相关配置文件位置: /Library/LaunchDaemons/ddns-go.plist 使用以上命令安装后会自动在mac的系统上注册为服务,开机自启。该文件主要存储ddns-go的端口信息以及一些相关参数,如果后续需要修改可以直接在该文件中进行修改,然后重启服务即可,命令如下: ``` sudo launchctl unload ~/Library/LaunchAgents/com.ddns.go.plist sudo launchctl load ~/Library/LaunchAgents/com.ddns.go.plist ``` * ubuntu 安装命令同上,自动注册为服务,开机自启,可通过```sudo systemctl status ddns``` 查看状态。 获取ip地址时最好使用以下命令获取, ```bash # ipv6 ip -6 addr show dev ppp0 | grep 'scope global' | grep -v 'deprecated' | grep -v 'temporary' | awk '{print $2}' | cut -d'/' -f1 | head -n1 # ipv4 ip -4 addr show dev ppp0 | grep 'scope global' | grep -v 'deprecated' | grep -v 'temporary' | awk '{print $2}' | cut -d'/' -f1 | head -n1 # 补充:查看ip地址详细信息命令 ip -6 addr show dev enx98fc84e707ac # ipv6 ip -4 addr show dev enx98fc84e707ac # ipv4 ``` 这样就可以获取到永久ip地址,并且在ip地址变更时能及时切换到新的永久地址,而不是仍然解析到旧地址 **域名解析最好使用cloudflare,TTL可以设置为1min,解析更快** * cloudflare创建用户API令牌模板 1. 访问 2. 点击创建令牌,选择编辑区域DNS模板 3. 名称任意填写 4. 令牌权限选择编辑区域DNS,令牌的权限务必选择 * 区域-区域-读取 * 区域-dns-编辑 5. 区域资源,选择需要用于ddns的域名 6. 客户端IP(可选),这个用于区别调用客户端的白名单,由于本文讲解ddns,本身访问的公网IP就是动态的,所以这里最好不要填写 7. TTL,定义此令牌将保持活动状态的时间长度。这个不需要填写 ![创建令牌](./Picture/家庭服务器/000134.png) 完成后点击创建令牌,并拷贝token ![创建令牌](./Picture/家庭服务器/000303.png) * ddns-go查询域名信息发生异常 解决办法:**关闭ipv6临时地址(见上)**并且配置**只用ipv4访问cloudflare(如下)** ```bash # 获取 Cloudflare API 的 IPv4 地址 nslookup api.cloudflare.com # 看到的输出 Server: 127.0.0.53 Address: 127.0.0.53#53 Non-authoritative answer: Name: api.cloudflare.com Address: 104.19.192.174 Name: api.cloudflare.com Address: 104.19.192.176 Name: api.cloudflare.com Address: 104.19.193.29 Name: api.cloudflare.com Address: 104.19.192.29 Name: api.cloudflare.com Address: 104.19.192.177 Name: api.cloudflare.com Address: 104.19.192.175 Name: api.cloudflare.com Address: 2606:4700:300a::6813:c0af Name: api.cloudflare.com Address: 2606:4700:300a::6813:c0b0 Name: api.cloudflare.com Address: 2606:4700:300a::6813:c01d Name: api.cloudflare.com Address: 2606:4700:300a::6813:c11d Name: api.cloudflare.com Address: 2606:4700:300a::6813:c0b1 Name: api.cloudflare.com Address: 2606:4700:300a::6813:c0ae ``` 编辑hosts文件,在最后一行添加: ```bash sudo vim /etc/hosts # 添加 104.19.192.174 api.cloudflare.com ``` 重启ddns-go服务 ```bash sudo systemctl restart ddns-go.service ``` * 循环检测监本 由于ddns-go经常出现“查询域名信息发生异常”,故可以写一个监控脚本再检测到错误时重启服务即可正常 ```bash #!/bin/bash MailTo="hitmickeyq@qq.com" SERVICE_NAME="ddns-go.service" KEYWORD="查询域名信息发生异常" # 检测时间窗口 TIME_WINDOW="1 minutes ago" THRESHOLD=1 # 循环检查间隔 (秒) - 正常状态下的检测频率 CHECK_INTERVAL=55 # 重启后的冷却时间 (秒) - 防止频繁重启 RESTART_WAIT=65 # ========================================= echo "DDNS-Go 监控脚本已启动,每 $CHECK_INTERVAL 秒检测一次..." while true; do ERROR_LOGS=$(sudo journalctl -u "$SERVICE_NAME" --since "$TIME_WINDOW" --no-pager | grep "$KEYWORD") if [ -z "$ERROR_LOGS" ]; then ERROR_COUNT=0 else ERROR_COUNT=$(echo "$ERROR_LOGS" | wc -l) fi echo "正在检查... 周期内错误数: $ERROR_COUNT" if [ "$ERROR_COUNT" -ge "$THRESHOLD" ]; then echo "⚠️ 错误次数 ($ERROR_COUNT) 超过阈值,执行重启..." sudo systemctl restart "$SERVICE_NAME" RESTART_STATUS=$? MY_HOSTNAME=$(hostname) CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S") if [ $RESTART_STATUS -eq 0 ]; then Subject="[✅自动恢复] DDNS-Go 服务已重启" msg="服务器: ${MY_HOSTNAME}\n时间: ${CURRENT_TIME}\n\n检测到 ${ERROR_COUNT} 次连接异常,脚本已成功重启 ddns-go 服务。\n\n=== 错误日志详情 ===\n${ERROR_LOGS}\n\n==================\n\n系统将进入 ${RESTART_WAIT} 秒冷却时间,等待服务稳定。" else Subject="[❌严重报警] DDNS-Go 重启失败" msg="服务器: ${MY_HOSTNAME}\n时间: ${CURRENT_TIME}\n\n检测到 ${ERROR_COUNT} 次连接异常,且尝试自动重启失败!\n\n=== 错误日志详情 ===\n${ERROR_LOGS}\n\n请立即手动检查:sudo systemctl status ddns-go" fi { echo "To: $MailTo" echo "Subject: $Subject" echo "Date: $(date -R)" echo "Content-Type: text/plain; charset=UTF-8" echo echo -e "$msg" } | msmtp -a default "$MailTo" echo "邮件通知已发送 (包含错误详情)。" echo "⏳ 进入冷却模式:等待 ${RESTART_WAIT} 秒让服务启动..." sleep "$RESTART_WAIT" continue fi # --- 正常情况等待 60 秒 --- sleep "$CHECK_INTERVAL" done ``` 再注册为systemd服务即可 ## 2、nginx和nginx-ui安装(已弃用,改用caddy) 先安装nginx,再安装nginx-ui * **nginx安装** ```sudo apt install nginx```,安装完后输入以下命令 ``` sudo systemctl start nginx sudo systemctl enable nginx ``` nginx.conf路径:```/etc/nginx/nginx.conf``` 生成自签名证书: ```bash sudo mkdir -p /etc/nginx/ssl cd /etc/nginx/ssl sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout localhost.key \ -out localhost.crt \ -subj "/CN=localhost" \ -addext "subjectAltName=DNS:localhost,IP:127.0.0.1" ``` * **[nginx-ui](https://nginxui.com/zh_CN/guide/about.html)安装**(不要用docker) 配置文件放置位置:/etc/nginx/sites-available/,放在该位置下nginx-ui会自动检测,然后可以在nginx-ui中进行操作启动,也可以通过下面的软链接方法进行启动 nginx配置文件:nginx-mingfan.zip,已存入nas中 创建你的默认兜底配置文件: ``` sudo vim /etc/nginx/sites-available/default ``` 然后创建软链接启用它:(链接到/etc/nginx/sites-enabled/) ``` sudo ln -s /etc/nginx/sites-available/00-default.conf /etc/nginx/sites-enabled/ ``` * 反向代理模板 针对家庭网络端口80和443端口被封的情况,对下面的端口进行了修改 ```html server { listen 1080; listen [::]:1080; server_name ; rewrite ^(.*)$ https://$host:1443$1 permanent; } map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 1443 ssl; listen [::]:1443 ssl; server_name ; ssl_certificate /path/to/ssl_cert; ssl_certificate_key /path/to/ssl_cert_key; location / { #使用$http_host可以保留端口号,而$host则不保留端口号,对于非标准端口服务来说,最好使用$http_host,防止app无法网址 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_pass http://:/; #改为自己的目标地址 proxy_buffering off; } } ``` * 兜底域名拦截模板 启用方法: ``` # 添加Nginx用户到您的用户组(替换mickey为您的用户名) whoami # 查看用户名 sudo usermod -aG mickey www-data # Debian/Ubuntu # 设置目录权限 # 对照着替换为自己的路径 sudo chmod 755 /home/mickey sudo chmod 755 /home/mickey/APP sudo chmod 755 /home/mickey/APP/nginx-ui sudo chmod 644 /home/mickey/APP/nginx-ui/error.html # 设置所有权(保留您的所有权,添加组权限) sudo chown -R mickey:www-data /home/mickey/APP/nginx-ui # Debian/Ubuntu # 重载Nginx sudo systemctl restart nginx ``` ```html # 默认兜底 HTTP 配置 server { listen 1080; listen [::]:1080; server_name mingqian.space *.mingqian.space; # 根目录设置 root /home/mickey/APP/nginx-ui; # 安全设置 autoindex off; disable_symlinks on; # 错误页面处理 error_page 403 404 500 502 503 504 /error.html; # 错误页面访问控制 location = /error.html { internal; # 仅允许内部访问 access_log off; } # 主处理逻辑 location / { # 强制返回404状态码(触发错误页) return 404; # 访问日志(可选) access_log /var/log/nginx/default_access.log; } } # 默认兜底 HTTPS 配置 server { listen 1443 ssl; listen [::]:1443 ssl; server_name mingqian.space *.mingqian.space; # SSL证书配置(请替换为实际路径) ssl_certificate /etc/nginx/ssl/specific_domain.cer; # 替换为实际证书文件 ssl_certificate_key /etc/nginx/ssl/specific_domain.key; # 替换为实际密钥文件 # SSL安全设置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 根目录设置 root /home/mickey/APP/nginx-ui; # 安全设置 autoindex off; disable_symlinks on; # 错误页面处理 error_page 403 404 500 502 503 504 /error.html; # 错误页面访问控制 location = /error.html { internal; # 仅允许内部访问 access_log off; } # 主处理逻辑 location / { # 强制返回404状态码(触发错误页) return 404; # 访问日志(可选) access_log /var/log/nginx/default_ssl_access.log; } } ``` error.html: ```html 出错啦

nginx反向代理出错啦(。ŏ_ŏ)

``` ## 2.1、caddy [带插件模块的caddy下载页面](https://caddyserver.com/download),本教程用到的[带cloudflare模块的caddy下载链接](https://caddyserver.com/api/download?os=linux&arch=amd64&p=github.com%2Fcaddy-dns%2Fcloudflare&idempotency=39684754847865): cf密钥: mingqian.online:cfut_ZJPizvdiVjihsYfOesd7Xl6vLvanHk9oZPYAN1I37c8453c0 mingqian.space:cfut_AjLT9nfXquOfuX9RU3XhWh3D4mkfOE5EBIv9FaZJ17199be6 **caddy不用像nginx一样需要配置额外的东西** 家庭服务器Caddyfile: ```txt (cloudflare_tls) { tls { dns cloudflare {$CF_API_TOKEN} } } (my_proxy) { reverse_proxy {args[0]} { } } (port_redir) { redir https://{host}:1443{uri} permanent } # 主页 http://mingqian.space:1080 { import port_redir } https://mingqian.space:1443 { import cloudflare_tls root * /var/www/html/dist file_server } # Filebrowser (2002) http://filebrowser-speedtest.mingqian.space:1080 { import port_redir } https://filebrowser-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:2002 } # DDNS-Go (3000) http://ddns-speedtest.mingqian.space:1080 { import port_redir } https://ddns-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:3000 } # Jellyfin (4000) http://jellyfin-speedtest.mingqian.space:1080 { import port_redir } https://jellyfin-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:4000 } # qBittorrent (5000) http://qbittorrent-speedtest.mingqian.space:1080 { import port_redir } https://qbittorrent-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:5000 } # mkvtoolnix (5800) http://mkvtoolnix-speedtest.mingqian.space:1080 { import port_redir } https://mkvtoolnix-speedtest.mingqian.space:1443 { import cloudflare_tls reverse_proxy https://127.0.0.1:5800 { transport http { tls_insecure_skip_verify } } } # TinyMediaManager (6003) http://tmm-speedtest.mingqian.space:1080 { import port_redir } https://tmm-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:6003 } # Xunlei (6005) http://xunlei-speedtest.mingqian.space:1080 { import port_redir } https://xunlei-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:6005 } # Beszel (6006) http://beszel-speedtest.mingqian.space:1080 { import port_redir } https://beszel-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:6006 } # PDF2ZH (6007) http://pdf2zh-speedtest.mingqian.space:1080 { import port_redir } https://pdf2zh-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:6007 } # Web Preview (6033) http://preview-speedtest.mingqian.space:1080 { import port_redir } https://preview-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:6033 } # Resilio Sync (6660) http://resiliosync-speedtest.mingqian.space:1080 { import port_redir } https://resiliosync-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:6660 } # BaiduNetdisk (7000) http://baidunetdisk-speedtest.mingqian.space:1080 { import port_redir } https://baidunetdisk-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:7000 } # Clash Dashboard (9000) http://clash-speedtest.mingqian.space:1080 { import port_redir } # Clash Dashboard (9000) https://clash-speedtest.mingqian.space:1443 { import cloudflare_tls redir / /ui/ 308 import my_proxy 127.0.0.1:9000 } # 订阅转换 (9002) http://sub-speedtest.mingqian.space:1080 { import port_redir } # 订阅转换 (9002) https://sub-speedtest.mingqian.space:1443 { import cloudflare_tls import my_proxy 127.0.0.1:9002 } ``` 公网服务器caddyfile: ```txt (cloudflare_tls) { tls { dns cloudflare {$CF_API_TOKEN} } } (my_proxy) { reverse_proxy {args[0]} { } } # 主页 mingqian.online { import cloudflare_tls root * /var/www/html/dist file_server } # s-ui sui-speedtest.mingqian.online { import cloudflare_tls redir / /app/ 308 import my_proxy 127.0.0.1:2095 } # easytier board easytierdashboard-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:11211 } # Filebrowser filebrowser-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # DDNS-Go ddns-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # Jellyfin jellyfin-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # qBittorrent qbittorrent-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # mkvtoolnix mkvtoolnix-speedtest.mingqian.online { import cloudflare_tls reverse_proxy https://127.0.0.1:7002 { transport http { tls_insecure_skip_verify tls_server_name mkvtoolnix-speedtest.mingqian.online } header_up Host mkvtoolnix-speedtest.mingqian.online } } # TinyMediaManager tmm-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # Xunlei xunlei-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # Beszel beszel-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # PDF2ZH pdf2zh-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # Web Preview preview-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # Resilio Sync resiliosync-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # BaiduNetdisk baidunetdisk-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # Clash Dashboard clash-speedtest.mingqian.online { import cloudflare_tls redir / /ui/ 308 import my_proxy 127.0.0.1:7001 } # 订阅转换 sub-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # open-notebook web-ui notebook-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # open-notebook api notebook-api-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } # anythingllm anythingllm-speedtest.mingqian.online { import cloudflare_tls import my_proxy 127.0.0.1:7001 } ``` caddy.service: ```bash [Unit] Description=Caddy Documentation=https://caddyserver.com/docs/ After=network.target network-online.target Requires=network-online.target [Service] Type=notify User=mickey Group=mickey Environment="CF_API_TOKEN= " ExecStart=/home/mickey/APP/caddy/caddy run --environ --config /home/mickey/APP/caddy/Caddyfile ExecReload=/home/mickey/APP/caddy/caddy reload --config /home/mickey/APP/caddy/Caddyfile --force TimeoutStopSec=5s LimitNOFILE=1048576 PrivateTmp=true ProtectSystem=full AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE [Install] WantedBy=multi-user.target ``` ## 3、kodbox(弃用,改用openlist) **通过docker-compose方法安装,[官方安装教程](https://docs.kodcloud.com/setup/docker/)** 可以通过RaiDrive挂载到本地,很好用 * db.env ``` MYSQL_PASSWORD=200184LMQ MYSQL_DATABASE=kodbox MYSQL_USER=kodbox ``` * docker-compose.yml: ``` services: db: image: registry.cn-hangzhou.aliyuncs.com/kodcloud/mariadb:lts command: --transaction-isolation=READ-COMMITTED restart: always volumes: - "./db:/var/lib/mysql" #./db是数据库持久化目录,可以修改 # - "./etc/mysql/conf.d:/etc/mysql/conf.d" #增加自定义mysql配置 environment: - MYSQL_ROOT_PASSWORD=200184LMQ - MARIADB_AUTO_UPGRADE=1 - MARIADB_DISABLE_UPGRADE_BACKUP=1 env_file: - db.env app: image: registry.cn-hangzhou.aliyuncs.com/kodcloud/kodbox restart: always ports: - 2000:80 #左边80是使用端口,可以修改 volumes: - "./site:/var/www/html" #./site是站点目录位置,可以修改 #- "./etc:/usr/local/etc" environment: - MYSQL_HOST=db - REDIS_HOST=redis env_file: - db.env depends_on: - db - redis redis: image: registry.cn-hangzhou.aliyuncs.com/kodcloud/redis:alpine restart: always ``` QQ邮箱授权码:mlspgfzzizuceicf **优化教程** * [配置优化](https://doc.kodcloud.com/#/others/options?id=%e4%b8%80%e3%80%81%e4%b8%8a%e4%bc%a0%e4%b8%8b%e8%bd%bd%e9%80%9f%e5%ba%a6%e4%bc%98%e5%8c%96) php.ini路径:```./etc/php/php.ini/``` 官方的配置优化进行了以下修改: ```php # 在nginx的kod配置中需要单独添加的内容 client_max_body_size 0; client_header_timeout 3600s; client_body_timeout 3600s; # php.ini中需要修改的内容 post_max_size = 512M; upload_max_filesize = 512M; memory_limit = 512M; max_execution_time = 3600; max_input_time = 3600; # php中设置set_time_limit无效(safe_mode=on时php代码中修改超时无效) php.ini safe_mode = off # php-fpm.conf 配置优化(超时时间; 4G内存推荐如下子进程配置) request_terminate_timeout 3600 pm.max_children = 50 pm.start_servers = 10 pm.min_spare_servers = 10 pm.max_spare_servers = 30 pm.max_requests = 500 ``` * [opcache缓存配置](https://doc.kodcloud.com/v2/#/help/update-cache) 在php.ini中修改 ```php ; 开启或关闭编译缓存 opcache.enable=1 opcache.enable_cli=1 ; Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB) ; 推荐 128 opcache.memory_consumption=128 ; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB) ; 推荐 8 opcache.interned_strings_buffer=8 ; 最大缓存的文件数目 200 到 100000 之间 ; 推荐 4000 opcache.max_accelerated_files=4000 ; 内存“浪费”达到此值对应的百分比,就会发起一个重启调度. opcache.max_wasted_percentage=5 ; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上, ; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能, ; 但是会对已存在的应用造成破坏. opcache.use_cwd=0 ; 开启文件时间戳验证 opcache.validate_timestamps=1 ; 2s检查一次文件更新 注意:0是一直检查不是关闭 ; 可以修改自动检测文件更新时间; 推荐设置为5; opcache.revalidate_freq=5 ``` ## 4、jellyfin * 安装 ```bash curl -s https://repo.jellyfin.org/install-debuntu.sh | sudo bash ``` * 更改默认监听端口 ```bash # 需要先运行以便jellyfin才有network.xml文件 sudo gedit /etc/jellyfin/network.xml 8096 8920 8096 8920 # 以上内容改为: 4000 4020 4000 4020 # 重启服务 sudo systemctl restart jellyfin # 开机自启 sudo systemctl enable jellyfin ``` * 配置 * 媒体库扫描设置 由于cpu和内存的限制,需要手动设置扫描并发任务数量 ![image-20250915214102671](./Picture/家庭服务器/image-20250915214102671.png) * 转码设置 按照图中设置即可,其余均保持默认即可 ![image-20250915214252744](./Picture/家庭服务器/image-20250915214252744.png) * 进度条预览图设置 ![image-20250915214528222](./Picture/家庭服务器/image-20250915214528222.png) * 字幕设置 首先将windows下的字体打包,已经打包好放在nas的backup文件夹中,将字体安装到ubuntu中,安装步骤: 1. 将字体解压到```/usr/share/fonts/```目录中,更新字体缓存 2. ``` # 查看所有字体 fc-list # 查看安装的中文字体 fc-list :lang=zh # 更新字体缓存 fc-cache ``` 接下来如下图操作,其余设置保持默认即可: ![image-20250809223754657](./Picture/家庭服务器/image-20250809223754657.png) ![image-20250809223903698](./Picture/家庭服务器/image-20250809223903698.png) * 调用potplayer脚本,根据[embylaunchpotplayer脚本](https://greasyfork.org/zh-CN/scripts/514529-embylaunchpotplayer)修改,保存在nas中,即:[Jellyfin Enhanced with Potplayer](https://openlist.mingqian.online/@s/zwKM7DVh)。只保留了potplayer和复制串流地址这2个选项(其他的播放器就算有也需要额外配置,麻烦)。 * TMM设置 jellyfin搭配TMM刮削,但是使用过程中发现有些时候正常刮削的nfo信息jellyfin无法识别,导致有些剧集没有信息,原因在于TMM设置问题。 * 通用选项→其他设置→取消勾选”启用垃圾/备份文件夹“ * 通用选项→系统→代理设置 * 电影→NFO设置 ![image-20251214010017356](./Picture/家庭服务器/image-20251214010017356.png) * 电视节目→NFO设置 ![image-20251214011622924](./Picture/家庭服务器/image-20251214011622924.png) ## 5、局域网共享教程 **以下几种方法均不推荐使用公网访问** [windows作为发送端](https://www.youtube.com/watch?v=Y648UtRBjSk&list=PLdYCEoTXr8oudg9BH1P-5Nuq7iKgzBu5l&index=3)、[MAC作为发送端](https://www.youtube.com/watch?v=wDMxV58_i4E&list=PLdYCEoTXr8oudg9BH1P-5Nuq7iKgzBu5l&index=2) ubuntu作为发送端 * ubuntu22.04 [Ubuntu22.04设置与Windows共享文件夹.html](https://openlist-speedtest.mingqian.online/@s/xIc4DRmK/Ubuntu22.04%E8%AE%BE%E7%BD%AE%E4%B8%8EWindows%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6%E5%A4%B9.html) * ubuntu24.04 ```sudo apt install samba``` 编辑```/etc/samba/smb.conf``` ``` sudo vim /etc/samba/smb.conf [global] # 设置服务器接受的最小SMB协议版本为 SMB3 # 这将拒绝所有 SMB1/NT1 协议的连接 server min protocol = SMB3 [home] comment= Network Shared Folder by Samba Server on Ubuntu path = /data/share browseable = yes create mask = 0666 directory mask = 0777 read only = no ``` 添加用户:```sudo smbpasswd -a mickey``` 搞定! 需要开启端口: 137/udp 138/udp 139/tcp 445/tcp ```bash for port in 137 138; do sudo ufw allow from 192.168.5.0/24 to any port $port proto udp done for port in 139 445; do sudo ufw allow from 192.168.5.0/24 to any port $port proto tcp done ``` samba服务常用命令 ````bash # 设置开机自启 sudo systemctl enable smbd # 常用命令 sudo smbpasswd -a users # 增加用户users sudo smbpasswd -d users # 冻结用户users,这个用户不能再登录 sudo smbpasswd -e users # 恢复冻结的用户users,让冻结的用户可以再使用 sudo smbpasswd -x users # 删除用户users sudo pdbedit -L # 查看用户列表 ```` ``` windwos端访问格式:\\\<共享的文件夹名> android访问格式:使用ES文件浏览器,添加网络,局域网 /<共享的文件名> ``` **关闭smb1** * windows ```bash # 检测是否启用SMB1 Get-SmbServerConfiguration | Select EnableSMB1Protocol # 禁用SMB1 Set-SmbServerConfiguration -EnableSMB1Protocol $false # 启用SMB1: Set-SmbServerConfiguration -EnableSMB1Protocol $true ``` * ubuntu 可通过以下命令检查 Linux 发行版是否支持 `disable_legacy_dialects` 模块参数: ```bash sudo modinfo -p cifs | grep disable_legacy_dialects output disable_legacy_dialects: To improve security it may be helpful to restrict the ability to override the default dialects (SMB2.1, SMB3 and SMB3.02) on mount with old dialects (CIFS/SMB1 and SMB2) since vers=1.0 (CIFS/SMB1) and vers=2.0 are weaker and less secure. Default: n/N/0 (bool) # 删除 SMB 1 # 在禁用 SMB 1 之前,请确认 SMB 模块当前未加载到系统中(如果已装载 SMB 共享,则会 自动发生这种情况)。 运行以下命令。如果未加载 SMB,则此命令不会输出任何信息: lsmod | grep cifs # 若要卸载该模块,请先使用 `umount` 命令卸载所有 SMB 共享。 可使用以下命令识别系 统上所有已装载的 SMB 共享: mount | grep cifs # 卸载所有 SMB 文件共享后,可以安全地卸载该模块。 运行 `modprobe` 命令: sudo modprobe -r cifs # 可以使用 `modprobe` 命令手动加载已卸载 SMB 1 的模块: sudo modprobe cifs disable_legacy_dialects=Y # 最后,可以通过查看 `/sys/module/cifs/parameters` 中加载的参数,来检查是否已 使用相应参数加载了 SMB 模块: cat /sys/module/cifs/parameters/disable_legacy_dialects # 若要在 Ubuntu 和基于 Debian 的分发版上永久禁用 SMB 1,必须创建一个名为 `/etc/modprobe.d/local.conf` 且包含相应设置的新文件(如果尚未对其他模块使用 自定义选项)。 运行以下命令: echo "options cifs disable_legacy_dialects=Y" | sudo tee -a /etc/modprobe.d/local.conf > /dev/null # 可以通过加载 SMB 模块来验证上述操作是否成功: sudo modprobe cifs cat /sys/module/cifs/parameters/disable_legacy_dialects ``` ```bash sudo gedit /etc/samba/smb.conf # 在global段中添加 [global] # 禁用 SMB1 min protocol = SMB2 sudo systemctl restart smbd # 验证是否禁用了SMB1 testparm -s ``` ### 解决家宽SMB端口被封,无法通过公网访问 1. **服务端**:修改服务器侧 Samba 端口配置。 2. **Linux 客户端**:可以使用 `smbclient` 增加 `-p` 参数指定端口连接。 3. **Windows 客户端**:因为 Windows 默认 Samba 端口为 445 且不可直接修改,所以需要将本地 445 的端口数据转发到服务端修改后的端口上。 #### 1. 服务端配置 修改配置文件 `/etc/samba/smb.conf`,在 `[global]` 部分加入下面这两句: ``` [global] smb ports = 6002 # 改变samba端口 server min protocol = LANMAN1 # 关键配置 ``` > **注意**:`server min protocol = LANMAN1` 如果不加,客户端可能会连接失败。这句配置虽然跟 445 被运营商禁用无直接关系,但不加这句可能会报以下错误: `protocol negotiation failed: NT_STATUS_INVALID_NETWORK_RESPONSE` 这次使用并未添加```server min protocol = LANMAN1```,但是先留在这里,以作预防 配置完重启 Samba 服务,**切记要在云服务器的安全组/防火墙放行该端口**。 ``` sudo systemctl restart smbd.service nmbd.service ``` #### 2. 客户端配置 ##### 2.1 Ubuntu 客户端 可以使用 `smbclient` 访问 samba 目录,增加 `-p` 参数指定端口,`-U` 参数后面跟用户名。 ``` # 格式: smbclient //IP地址/共享名 -U 用户名 -p 端口 smbclient //123.239.12.223/axs -U axs -p 6002 ``` ##### 2.2 Windows 客户端 配置 445 端口转发到 6002。需要在**管理员权限**打开 CMD(命令提示符)增加映射关系。 **常用指令如下:** 1. **增加映射关系** 发给本地 `127.0.0.1` 445 端口的数据都会转到 `mingqian.space` 的 6002 端口发出。 ``` # v4tov6 netsh interface portproxy add v4tov6 listenport=445 listenaddress=127.0.0.1 connectport=6002 connectaddress=mingqian.space # v4tov4 netsh interface portproxy add v4tov6 listenport=445 listenaddress=127.0.0.1 connectport=6002 connectaddress= ``` 2. **查看映射列表** ``` netsh interface portproxy show all ``` 3. **删除映射关系** ``` # 这里的v4tov4需要与之前的命令对应,如果之前用的是v4tov6,则应改为v4tov6 netsh interface portproxy delete v4tov4 listenport=445 listenaddress=127.0.0.1 ``` **检查是否生效:** 输入以下指令查看端口占用情况: ``` netstat -ano | findstr 445 ``` * **成功状态**:LISTENING 状态对应的 PID(进程ID)**不能为 4**。 * **失败状态**:如果 LISTENING 对应的 PID 为 **4**(System 进程),说明 Windows 自带的 Server 服务占用了 445 端口。 **解决 PID 为 4 占用的问题:** 你需要禁用 Windows 的 Server 服务并重启。 1. 右键“此电脑” -> “管理” -> “服务和应用程序” -> “服务”。 2. 找到 **Server** 服务。 3. 右键选择“禁用”,并停止该服务。 4. **重启电脑**。 ![image-20251123171050202](./Picture/家庭服务器/image-20251123171050202.png) **最终访问:** 配置完成并重启后,即可通过 Windows 资源管理器访问 Samba 了。 访问路径需要使用本地回环地址: ``` \\127.0.0.1\axs ``` (其中 `axs` 是你的共享文件夹名称),然后输入用户名密码即可登录。 --- 本次虽然成功通过公网访问家庭NAS,但是由于运营商上传限速,即使在域名中添加speedtest,速度仍然特别慢。 ## 6、lvm使用 参考链接: 1. 2. * 创建lvm ```bash fdisk -l # 查看已有的磁盘 # 将物理磁盘设备初始化为物理卷 pvcreate /dev/sdb /dev/sda # 需要替换为自己的硬盘 # 创建卷组,并将pv加入卷组中 vgcreate linuxcast /dev/sdb /dev/sda # linux为vg卷组名字,可根据需要自行修改 # 基于卷组创建逻辑卷 # 参数介绍 # -n 逻辑卷名字 # -L 逻辑卷大小 lvcreate -n mylv -L 2G linuxcast # 为创建好的逻辑卷创建文件系统 mkfs.ext4 /dev/linuxcast/mylv # 将格式好的逻辑卷挂载使用 mount /dev/linuxcast/mylv /mnt ``` * 查看lvm ```bash # 查看物理卷信息 pvdisplay # 详细 pvs # 查看卷组信息 vgdisplay # 详细 vgs # 查看逻辑卷信息 lvdisplay # 详细 lvs ``` * 删除lvm ```bash # 删除逻辑卷 lvremove /dev/linuxcast/mylv # 删除卷组 vgremove linuxcast # 删除物理卷 pvremove /dev/sdb ``` * 扩充逻辑卷 ```bash # 保证卷组中有足够的控件 vgdisplay # 扩充逻辑卷 lvextend -L +1G /dev/linuxcast/mylv # 可根据自己需要修改需要增加的容量大小 # 查看扩充后LV大小 lvdisplay # 更新文件系统 resize2fs /dev/linuxcast/mylv # 查看更新后的文件系统 df -hl # 或 df -h ``` * 扩充卷组 ```bash fdisk -l # 将要添加到vg的硬盘格式化为pv pvcreate /dev/sdd # 将新的pv添加到指定卷组中 vgextend linux /dev/sdd # 查看扩充后vg的大小 vgdisplay ``` ***以下操作存在风险*** * 缩小逻辑卷 **逻辑卷的缩小操作必须离线执行,要卸载逻辑卷** ```bash # 卸载逻辑卷 umount /dev/linuxcast/mylv # 缩小文件系统(会提示需要运行fsck检查文件系统) resize2fs /dev/linuxcast/mylv 1G # 这里是指将逻辑卷的大小缩小 到 1G # 缩小逻辑卷 lvreduce -L -1G /dev/linuxcast/mylv # 这里缩小的容量值应该为缩小到1G需要的容量值 # 查看缩小后的lv lvdisplay # 挂在逻辑卷 mount /dev/linuxcast/mylv /mnt ``` * 缩小卷组 **一定要保证卷组中的剩余空间比拿走的硬盘容量大** ```bash # 先用vgdisplay查看 vgdisplay # 将一个pv从卷组中移除 vgreduce linuxcast /dev/sdd # 查看缩小后的卷组大小 vgdisplay ``` ## 7、配置msmtp邮箱服务 ```sudo apt-get update``` ```sudo apt-get install msmtp msmtp-mta ca-certificates bsd-mailx``` 修改~/.msmtprc文件,配置如下: ```bash defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.log account default host smtp.qq.com port 587 from 1975392257@qq.com user 1975392257@qq.com password ocdzjriljvhqdbgd ``` ```chmod 600 /home/mickey/.msmtprc``` 测试:```echo "Test email body" | msmtp -a default 1975392257@qq.com``` ## 8、检测是否断电以及自动关机命令 ```bash #!/bin/bash # ================= 配置参数 ================= MonitorIP="192.168.5.1" DelayBetweenRetries=30 RetryTimes=3 CheckInterval=60 # 日志配置 LogFile="/home/mickey/APP/sh/server-monitor/log/server_monitor.log" LOG_DIR=$(dirname "$LogFile") mkdir -p "$LOG_DIR" MailTo="1975392257@qq.com" Hostname=$(hostname) NetInterface="enp2s0" # 状态变量 LastIPv6s=() PowerLossDetected=0 PowerLossTime="" # 心跳配置 HEARTBEAT_HOURS=("00" "06" "12" "18") LAST_HEARTBEAT_TAG="" # ================= 辅助函数:获取当前 IPv6 ================= get_current_ipv6s() { ip -6 addr show dev "$NetInterface" scope global | awk '/inet6/ { ip=$2; sub(/\/[0-9]+$/,"",ip); if (ip ~ /^f[cde]/) next; if ($0 ~ /deprecated/) next; if ($0 ~ /temporary/) next; print ip }' | sort } # 发送邮件的通用函数 send_mail() { local subject="$1" local content="$2" { echo "To: $MailTo" echo "Subject: $subject" echo "Date: $(date -R)" echo "Content-Type: text/plain; charset=UTF-8" echo echo "$content" } | msmtp -a default "$MailTo" } echo "[$(date)] Starting Server Monitor on $Hostname..." # ========================================== # [启动初始化] 第一次运行的逻辑 # ========================================== mapfile -t LastIPv6s < <(get_current_ipv6s) if [ ${#LastIPv6s[@]} -gt 0 ]; then # 场景1:启动时直接获取到了 IP -> 发送“首次获取”邮件 now_time=$(date "+%F %T") # 将数组转为字符串显示 current_ip_str=$(printf "%s\n" "${LastIPv6s[@]}") msg="[$now_time] 脚本启动,首次获取到 IPv6 地址:"$'\n'"$current_ip_str" echo "$msg" | tee -a "$LogFile" send_mail "IPv6 地址首次获取" "$msg" else # 场景2:启动时没网 -> 记录日志,不做处理,等待循环中获取 echo "[Init] 启动时暂无 IPv6 地址,等待获取..." | tee -a "$LogFile" fi # ================= 主循环 ================= while true; do now_hour=$(date +%H) now_date=$(date +%F) now_time=$(date "+%F %T") # ========================================== # 1. 路由器 Ping 检测 # ========================================== failure_count=0 for ((i=1; i<=RetryTimes; i++)); do if ping -c 1 -W 3 "$MonitorIP" &> /dev/null; then failure_count=0 break else if [ "$i" -eq "$RetryTimes" ]; then echo "[$now_time] Ping failed #$i" | tee -a "$LogFile" fi ((failure_count++)) sleep "$DelayBetweenRetries" fi done if [ "$failure_count" -ge "$RetryTimes" ]; then if [ "$PowerLossDetected" -eq 0 ]; then PowerLossDetected=1 PowerLossTime="$now_time" echo "[$now_time] 路由器断电(Ping 不通),记录断电时间,已安排5分钟后关机。" | tee -a "$LogFile" sudo /usr/sbin/shutdown -h +5 "路由器断电,系统将在5分钟后自动关机" fi else if [ "$PowerLossDetected" -eq 1 ]; then echo "[$now_time] 网络恢复,发送断电和恢复邮件。" | tee -a "$LogFile" msg_off="路由器断电事件通知:断电时间为 $PowerLossTime 。" msg_on="路由器网络已恢复,恢复时间为 $now_time ,系统关机任务已取消。" send_mail "路由器断电与恢复通知" "$msg_off"$'\n'"--------------------------------"$'\n'"$msg_on" sudo /usr/sbin/shutdown -c PowerLossDetected=0 PowerLossTime="" fi fi # ========================================== # 2. 心跳邮件 # ========================================== current_tag="${now_date}_${now_hour}" should_send=0 for h in "${HEARTBEAT_HOURS[@]}"; do if [[ "$now_hour" == "$h" ]]; then should_send=1; break; fi done if [[ "$should_send" -eq 1 && "$LAST_HEARTBEAT_TAG" != "$current_tag" ]]; then msg="[$now_time] 服务器 $Hostname 正常运行,未断电。" echo "$msg" | tee -a "$LogFile" send_mail "服务器运行状态" "$msg" LAST_HEARTBEAT_TAG="$current_tag" fi # ========================================== # 3. IPv6 地址变化检测 # ========================================== # 3.1 获取当前 IP mapfile -t AllIPv6s < <(get_current_ipv6s) # 3.2 【防空逻辑】 # 如果当前没有 IP (正在重拨),什么都不做,直接跳过。 # 这样旧 IP (LastIPv6s) 就会保留在内存里,等待新 IP 出现。 if [ ${#AllIPv6s[@]} -eq 0 ]; then sleep "$CheckInterval" continue fi # 3.3 对比逻辑 # 将数组转为字符串进行比较 current_str=$(printf "%s\n" "${AllIPv6s[@]}") last_str=$(printf "%s\n" "${LastIPv6s[@]}") if [[ "$current_str" != "$last_str" ]]; then # 场景 A: 之前没有IP (Last为空),现在突然有了 (从启动无网状态恢复) if [ ${#LastIPv6s[@]} -eq 0 ]; then msg="[$now_time] 检测到 IPv6 地址上线:"$'\n'"$current_str" echo "$msg" | tee -a "$LogFile" send_mail "IPv6 地址首次获取" "$msg" # 场景 B: 之前有IP,现在变了 (正常变更) else # 构造你想要的 "旧 -> 新" 格式 # 注意:如果有多个IP,这里会直接全部打印出来 changes="$last_str"$'\n'" ↓"$'\n'"$current_str" msg="[$now_time] 服务器 $Hostname IPv6 地址变更:"$'\n'"$changes" echo "$msg" | tee -a "$LogFile" send_mail "IPv6 地址变更" "$msg" fi # 3.4 更新缓存 LastIPv6s=("${AllIPv6s[@]}") fi sleep "$CheckInterval" done ``` 注册为systemd服务 ```bash [Unit] Description=Power Failure Monitor Service After=network.target [Service] Type=simple ExecStart=/home/mickey/APP/power-monitor/server-monitor.sh Restart=on-failure RestartSec=10 User=mickey [Install] WantedBy=multi-user.target ``` ## 9、mergerfs 安装: 通过mergerfs将多块硬盘组合成一块,同时可以做到即插即用 用```sudo blkid```查看磁盘UUID 修改/etc/fstab文件: ```bash #NAS UUID=c3f32d81-40f1-d640-addb-ae58777f34ea /home/mickey/hdd1 ext4 defaults 0 0 UUID=3fbc4426-7199-3d42-b1d8-2589672f4e4f /home/mickey/hdd2 ext4 defaults 0 0 UUID=e1b9ffdd-7e30-814b-97f2-fa598ef607b7 /home/mickey/hdd3 ext4 defaults 0 0 /home/mickey/hdd1:/home/mickey/hdd2:/home/mickey/hdd3 /home/mickey/nas mergerfs defaults,allow_other,use_ino,minfreespace=64G,ignorepponrename=true,cache.files=off,category.create=pfrd,func.getattr=newest,dropcacheonclose=false 0 0 ``` ``` # 需要提前创建好相对应的文件夹,否则挂载不上 sudo mkdir -p /media/hdd1 sudo mkdir -p /media/hdd2 sudo mkdir -p /media/hdd3 sudo mkdir -p /media/nas ``` 一定不能使用umask=000参数,否则系统开机会进入救援模式 挂载好后如图所示 ![image-20250731201701658](./Picture/家庭服务器/image-20250731201701658.png) ## 10、qbittorrent-enhanced 在国内的环境下只有下载最新的种子才有用,例如那种当天发布的种子效果最好,其余老种子还是只有用迅雷 **安装图形界面软件:** 添加PPA仓库(自动) ``` sudo add-apt-repository ppa:poplite/qbittorrent-enhanced sudo apt update ``` 安装qb ``` sudo apt install qbittorrent-enhanced ``` **安装web软件:** 下载[qbittorrent-enhanced-nox_x86_64-linux-musl_static.zip](https://github.com/c0re100/qBittorrent-Enhanced-Edition/releases/download/release-5.1.2.10/qbittorrent-enhanced-nox_x86_64-linux-musl_static.zip) 新建配置文件 ```bash sudo gedit /etc/systemd/system/qbittorrent-nox.service ``` 添加内容 ```bash [Unit] Description=qBittorrent Command Line Client After=network.target [Service] Type=simple User=root Group=root UMask=007 ExecStart=/home/mickey/APP/qbittorrent-enhanced/qbittorrent-nox --webui-port=5000 --profile=/home/mickey/APP/qbittorrent-enhanced/qBittorrent.conf Restart=on-failure [Install] WantedBy=multi-user.target ``` 重载 ```bash sudo systemctl daemon-reload ``` 开机自启 ```bash sudo systemctl enable qbittorrent-nox ``` 启动 ```bash sudo systemctl start qbittorrent-nox ``` 查看状态 ```bash sudo systemctl status qbittorrent-nox ``` **反向代理的问题** 在使用nginx反向代理后可能会出现unauthorized报错,解决办法如图所示,打开1,关闭2和3 ![image-20260102153830089](./Picture/家庭服务器/image-20260102153830089.png) **邮箱发送的问题** 在配置好邮箱后一定要先**保存**再点击发送测试邮件 基本配置参考[ubuntu24.04配置qbittorrent-enhanced-nox.html](https://openlist-speedtest.mingqian.online/@s/xIc4DRmK/ubuntu24.04%E9%85%8D%E7%BD%AEqbittorrent-enhanced-nox.html) ## 11、安装迅雷 ### 方法一: 使用其中的docker-compose方法安装,该方法因为将nas目录映射进了容器里,所以在迅雷下载时可以直接选择nas目录作为下载路径,比下面的方法更方便;同时云盘缓存路径在当前目录的downloads目录下,更方便删除。 docker-compose.yml ```yaml services: xunlei: container_name: xunlei image: cnk3x/xunlei:latest restart: unless-stopped # 宿主机名,迅雷远程控制的名称与此相关,一般是 `群晖-${hostname}` hostname: home-xunlei # 必须, cap_add: [SYS_ADMIN] 和 privileged: true 二选一 # cap_add: [ SYS_ADMIN ] privileged: true ports: [ 6005:2345 ] # 面板访问端口,如需更改,替换前面的2345即可 environment: # 如果需要指定多个下载目录,手动指定XL_DIR_DOWNLOAD # 多个以冒号`:`隔开,都必须以 /xunlei 开头,迅雷面板选择保存路径显示会去掉/xunlei前缀 # 指定后可以在 volumes 中绑定宿主机实际目录 # 迅雷云盘的缓存会使用第一个目录会缓存 # /xunlei/后面可以用中文 # 不设置默认一个目录 /xunlei/downloads - XL_DIR_DOWNLOAD=/xunlei/downloads:/xunlei/nas # 设置用户身份,请确保该用户对 XL_DIR_DOWNLOAD 指定的目录或者默认的 /xunlei/downloads 有读写权限 - XL_UID=1000 # 用户ID - XL_GID=1000 # 用户组ID # 是否开启调试日志 - XL_DEBUG=false volumes: # 对应 XL_DIR_DOWNLOAD 指定的目录, 请替换冒号前面的路径为实际路径 - ./downloads:/xunlei/downloads - /home/mickey/nas:/xunlei/nas # - 实际【软件】文件夹路径:/xunlei/apps # 数据目录,必须,迅雷运行时,插件,升级,包括登录数据都在这 - ./data:/xunlei/data # 可选,不配置每次启动都会从远程下载spk - ./cache:/xunlei/var/packages/pan-xunlei-com ``` ------ ### ~~方法二: 常用命令: ```bash # 安装迅雷,默认在线下载安装,如果需要设置更多参数请带上`-h`,查看说明 sudo thunder install # 卸载迅雷 sudo thunder uninstall # 前台运行迅雷,如果需要设置更多参数请带上`-h`,查看说明 sudo thunder run # 后台运行迅雷,如果需要设置更多参数请带上`-h`,查看说明 sudo thunder start # 停止运行迅雷 sudo thunder stop # 查看运行状态 sudo thunder ps # 查看运行日志 sudo thunder log ``` 注册为systemd服务: * thunder.sh ```bash #! /bin/bash sudo thunder run ``` 需要为thunder开启sudo免密码,详见102 * /etc/systemd/system/thunder.service ```bash [Unit] Description=Run thunder via systemd After=network.target [Service] Type=simple ExecStart=/home/mickey/APP/thunder/thunder.sh Restart=on-failure User=mickey [Install] WantedBy=multi-user.target ``` **一定不要开启迅雷云盘的开机自启,会偷上传** 清理迅雷云盘缓存 `sudo vim /home/mickey/.local/bin/clean_thunder` ```bash #!/bin/bash # clean_thunder - 清理迅雷云盘缓存内容(保留主目录) dirs=( "/thunder/云盘缓存文件" "/opt/thunder/downloads/云盘缓存文件" ) echo "开始清理迅雷云盘缓存内容..." for dir in "${dirs[@]}"; do if [ -d "$dir" ]; then echo "正在清理: $dir" sudo rm -rf "${dir:?}/"* "${dir:?}/".* 2>/dev/null else echo "未找到目录: $dir" fi done echo "清理完成!" ``` ```sudo chmod +x /usr/local/bin/clean_thunder``` ## 12、配置ssh远程连接终端 ```bash # ubuntu安装ssh作服务端 sudo apt update sudo apt install openssh-server # windows中直接使用git自带的ssh即可,一定不要下载openssh,否则后面如果有多个id_rsa文件通过config来管理的话会有权限问题 # 没有git就安装git # ubuntu修改ssh默认端口 sudo gedit /etc/ssh/sshd_config # 找到以下行,取消注释并修改 # port 22 port 6001 # 防火墙放行端口 sudo ufw allow 6001/tcp # 重启服务 sudo systemctl restart ssh # 测试 ssh -p 6001 user@ip(user和ip自行更改) # 配置密钥登录并禁止密码登录,记得对生成的文件重命名 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f C:\Users\Mickey\.ssh\id_rsa # 修改权限 chmod 600 C:\Users\Mickey\.ssh\id_rsa # 拷贝公钥到ubuntu系统上 mkdir -p ~/.ssh gedit ~/.ssh/authorized_keys # 设置权限 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys # 测试密钥登录,如果不需要密码这说明配置成功 ssh -p 6001 user@ip(user和ip自行更改) # 禁止密码登录 sudo gedit /etc/ssh/sshd_config # 找到以下几行,修改 PasswordAuthentication no ChallengeResponseAuthentication no PubkeyAuthentication yes #(可选)禁止 root 登录: PermitRootLogin no # 重启服务 sudo systemctl daemon-reload sudo systemctl restart ssh.socket # 退出ssh ctrl-D或者exit ``` > ubuntu中如果配置了`/etc/ssh/sshd_config`发现没达到预期效果,还需要查看`/etc/ssh/sshd_config.d`目录下的配置文件是否需要修改 windows管理多个id_rsa密钥方法: 使用命令```ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f C:\Users\Mickey\.ssh\id_rsa```需要注意对```id_rsa```重命名,否则文件会覆盖,然后使用config文档来管理 在```C:\Users\Mickey\.ssh```文件夹下新建config文档,模版如下: ```config # Keep Alive Host * ServerAliveInterval 40 # Host可以自定义名称,HostName为ip地址 # 配置github.com Host github.com HostName github.com IdentityFile C:\Users\Mickey\.ssh\id_rsa_git PreferredAuthentications publickey User git # 配置ssh到服务器终端 Host home_server_ipv6 Port 6001 HostName ssh-speedtest.mingqian.space IdentityFile C:\Users\Mickey\.ssh\id_rsa_server PreferredAuthentications publickey User mickey Host home_server_ipv4 Port 6001 HostName ssh-speedtest.mingqian.online IdentityFile C:\Users\Mickey\.ssh\id_rsa_server PreferredAuthentications publickey User mickey Host home_server_easytier Port 6001 HostName 10.2.1.2 IdentityFile C:\Users\Mickey\.ssh\id_rsa_server PreferredAuthentications publickey User mickey Host home_server_at_home Port 6001 HostName 192.168.5.2 IdentityFile C:\Users\Mickey\.ssh\id_rsa_server PreferredAuthentications publickey User mickey # 配置ssh到实验室ubuntu Host lab_ubuntu Port 22 HostName 10.2.1.4 IdentityFile C:\Users\Mickey\.ssh\id_rsa_lab_ubuntu PreferredAuthentications publickey User mickey # 配置ssh到雨云服务器终端 Host rainyun Port 22 HostName rainyun.mingqian.online IdentityFile C:\Users\Mickey\.ssh\id_rsa_rainyun PreferredAuthentications publickey User root ``` 这里也是说为什么不要下openssh,因为用openssh一直提示config文件无权限,懒得整,直接用git自带的ssh轻松搞定 问题: 1、使用ssh登录时没有自动加载~/.bashrc 解决方法:检查系统内是否存在\~/.bash_profile,如果存在,说明环境发生了冲突,需要将\~/.bash_profile里的内容复制到\~/.bashrc中,并删除\~/.bash_profile 2、ssh连接保活 方法一:客户端添加以下代码: ``` # Keep Alive Host * ServerAliveInterval 10 ServerAliveCountMax 5 ``` 方法二:服务端添加以下代码: 如果你用多台本地机器连接服务器,可以考虑把服务器端的配置作修改路径是:`/etc/ssh/sshd_config`.在其中添加两行内容: ![sshd_config.png](./Picture/家庭服务器/k0JKKO.png) `ClientAliveInterval 10`表示每10秒向客户端发送一次保持连接的信号。` ClientAliveCountMax 5`表示客户端如果5次没有响应,就断开连接。 ## 13、resilio sync 1、安装(Ubuntu系统) 有两种方式,一种是直接下载[压缩包](https://www.resilio.com/sync/download/),解压,另一种是下载[deb文件](https://help.resilio.com/hc/en-us/articles/206178924-Installing-Sync-package-on-Linux),推荐使用下载deb文件的方式。 * deb文件的配置 1. ```sudo apt install *.deb``` 2. 更改服务权限: 您需要同时更改 `User`、`Group` **和** `Environment` 变量。 ``` sudo vim /usr/lib/systemd/system/resilio-sync.service ``` ``` ... User=mickey Group=mickey Environment="SYNC_USER=mickey" Environment="SYNC_GROUP=mickey" ... ``` 步骤 2:更改现有目录的所有权 ``` # 停止服务 sudo systemctl stop resilio-sync # 更改数据、运行和配置目录的所有权 sudo chown -R mickey:mickey /var/lib/resilio-sync sudo chown -R mickey:mickey /var/run/resilio-sync sudo chown -R mickey:mickey /etc/resili-sync ``` 步骤3:重启服务 ``` sudo systemctl daemon-reload sudo systemctl start resilio-sync ``` 3. ~~按照[官方操作手册](https://help.resilio.com/hc/en-us/articles/204762449-Guide-to-Linux-and-Sync-peculiarities)进行配置,即:~~ ```bash sudo usermod -aG user_group rslsync sudo usermod -aG rslsync user_name sudo chmod -R g+rw synced_folder # 针对resilio sync无法更改文件timestamps sudo chown -R rslsync:rslsync synced_folder sudo systemctl daemon-reload ``` 3. 配置完后即可正常使用,可通过以下命令进行使用: ```bash sudo systemctl start resilio-sync sudo systemctl stop resilio-sync sudo systemctl restart resilio-sync sudo systemctl enable resilio-sync #开机自启 sudo systemctl enable resilio-sync #取消开机自启 systemctl status resilio-sync #查看服务状态,可以看到配置文件所在路径 ``` 4. 配置文件所在路径:```/etc/resilio-sync/config.json``` ```bash { "storage_path" : "/var/lib/resilio-sync/", "pid_file" : "/var/run/resilio-sync/sync.pid", "webui" : { "force_https": false, "listen" : "0.0.0.0:6660", "login": "mickey-resiliosync", "password": "lmqCQM,YSZGAYRty!resiliosync" } } ``` * 压缩包方式的配置 1. 通过配置文件启动resilio-sync,这样之后可以直接修改配置文件,例如修改端口 ```bash ./rslsync --dump-sample-config > sync.conf ./rslsync --config sync.conf ``` 其它启动参数可通过[官方文档](https://help.resilio.com/hc/en-us/articles/204762449-Guide-to-Linux-and-Sync-peculiarities)查看。 2. 添加到自启动 ```bash sudo gedit /etc/rc.d/rc.local #在rc.local中加入以下代码: cd ./rslsync --config sync.conf ``` 压缩包方式无法通过systemctl启动,在网上查阅了相关文章操作后均不能得到良好效果,且自行添加的systemctl服务文件容易造成resilio sync下载的文件只可读,表现为ubuntu下文件上了锁。 **一定不要设置所有者权限,否则同步会出现错误** 2、IgnoreList文件中需添加: ```text node_modules build ``` 3、resilio sync配合easytier异地组网,同时使用frp配置内网穿透,预定义主机配置如下: **ip段:10.2.1.0/24** 家庭服务器节点: 192.168.5.2:30624 10.2.1.2:30624 resiliosync-speedtest.mingqian.space:30624 resiliosync-speedtest.mingqian.online:30624 mickey-dell节点: 192.168.5.3:40948 10.2.1.3:40948 resiliosync-speedtest.mingqian.online:40948 实验室ubuntu节点: 10.2.1.4:12496 resiliosync-speedtest.mingqian.online:12496 实验室win节点: 10.2.1.8:44115 resiliosync-speedtest.mingqian.online:44115 手机节点: 10.2.1.6:8484 --- **ip段:172.25.0.0/16** 手机:172.25.0.1:8484 谦谦的Dell:172.25.0.2:40948 实验室Ubuntu:172.25.0.3:12496 实验室电脑win:172.25.0.4 **ip段:172.22.0.0/16** 服务器节点: 192.168.5.3:11553 172.22.0.1:11553 mingqian.space:11553 mickey-dell节点: 192.168.5.4:40948 172.22.0.2:40948 实验室ubuntu节点: 172.22.0.3:12496 手机节点: 172.22.0.5:8484 平板节点: 172.22.0.6:8585 **ip段:10.8.4.0/24** 服务器节点: 192.168.5.3:11553 10.8.4.1:11553 mingqian.space:11553 mickey-dell节点: 192.168.5.4:40948 10.8.4.2:40948 实验室ubuntu节点: 10.8.4.3:12496 手机节点: 10.8.4.5:8484 **ip段:10.1.1.0/24** 服务器节点: 192.168.5.3:11553 10.1.1.2:11553 mingqian.space:11553 mickey-dell节点: 192.168.5.4:40948 10.1.1.3:40948 实验室ubuntu节点: 10.1.1.4:12496 手机节点: 10.1.1.6:8484 [民间使用手册](https://www.tonyhead.com/book/resilio-sync) * 同步的文件夹: mickey_sync ├── important ├── music ├── picture └── project ## 14、百度网盘 ### docker部署 docker部署百度网盘,镜像地址: docker-compose.yml: ```yaml services: baidunetdisk: image: johngong/baidunetdisk:latest container_name: baidunetdisk ports: - 7000:5800 volumes: - ./config:/config - ./downloads:/downloads - /media/nas:/nas restart: unless-stopped ``` 该方法可以通过网页访问,但是会使用p2p跑上传,同时还会引发系统ufw防火墙阻拦卡死,不用的时候需关闭。 如果下载速度慢的话,可以尝试清除`./config/.config/baidunetdisk/baiduyunkernel`,清理脚本: ```bash #!/bin/bash # 百度网盘内核文件夹清理脚本 TARGET="/home/mickey/APP/baidunetdisk/config/.config/baidunetdisk/BaiduYunKernel" if [ -d "$TARGET" ]; then sudo rm -rf "$TARGET" echo "清理成功: $TARGET 已删除。" else echo "提示: 文件夹不存在,无需清理。" fi ``` ### 使用ubuntu客户端 在官网下载deb包安装,需要通过远程桌面访问使用,下载速度比VNC版本稳定且更快,不会用p2p上传。 ## 15、内网穿透 ## ~~zerotier~~(已废弃不用,改用easytier和frp) zerotier虚拟局域网组网后网速有问题,故抛弃,改用easytier #### ubutnu下zerotier命令 * 手动启动zerotier服务: ```javascript sudo systemctl start zerotier-one.service ``` * 开机启动: ```javascript sudo systemctl enable zerotier-one.service ``` * 加入网络 ```bash sudo zerotier-cli join 网络ID ``` * 查看本机连接的网络: ```javascript sudo zerotier-cli listnetworks ``` * 断开当前加入的网络: ```javascript sudo zerotier-cli leave 网络ID ``` #### zerotier高级玩法:自建MOON服务器和节点控制器 * 前提条件:有公网ipv4的服务器 * 原因:解决部分场所没有公网ipv6时打洞不成功,速度慢,如果所在的场所都有公网ipv6的话,就不用自建服务器了 * MOON服务器安装方法: ```bash # 安装zerotier curl -s https://install.zerotier.com | sudo bash # 在云服务器控制台打开9993端口,udp协议 sudo su cd /var/lib/zerotier-one zerotier-idtool initmoon identity.public >>moon.json vim moon.json ``` ![image-20250905190057945](./Picture/家庭服务器/image-20250905190057945.png) ```bash # 如上图所示,在框中位置添加公网ip地址和9993,格式为:ip/9993,有ipv6可以再加一个ipv6地址,用,隔开 # 创建MOON服务器文件,生成一个前面是0的文件 zerotier-idtool genmoon moon.json mkdir /var/lib/zerotier-one/moons.d cp ./moons.d/ # 重启zerotier,MOON服务器搭建完成 systemctl restart zerotier-one ``` * 加入MOON的方法 ```bash # 终端命令加入(windows、linux通用) zerotier-cli orbit systemctl restart zerotier-one # 文件添加法 # 把MOON服务器文件(前面是0的文件)下载下来,直接放入各个系统的文件夹,没有就创建文件夹,路径如下: linux:/var/lib/zerotier-one/moons.d/ windows:C:\ProgramData\ZeroTier\One\moons.d\ macos:/Library/Application Support/ZeroTier/One/zerotier-one/moons.d/ android:使用第三方软件zerotier fix直接导入即可 # 然后重启zerotier,加入成功 ``` ![image-20250905191142934](./Picture/家庭服务器/image-20250905191142934.png) * 监测MOON节点状态 由于家庭带宽都有公网ipv6,所以理论上来说跟MOON节点的连接状态应该是DIRECT,但是在实际使用过程中却出现了RELAY的情况,不清楚是ubuntu的原因还是macbook设备硬件的原因,因此写了一个脚本来监测MOON节点状态 ```bash #!/bin/bash # ===== ZeroTier MOON 状态检测和处理 ===== LogFile="/home/mickey/APP/sh/log/zerotier-moon.log" MailTo="1975392257@qq.com" MOON_LAST_STATUS="" while true; do ZT_STATUS=$(sudo zerotier-cli peers | grep "MOON" | awk '{print $5}') echo "[$(date '+%F %T')] ZeroTier MOON status: $ZT_STATUS" | tee -a "$LogFile" # ===== 如果为 RELAY 就不断重启,直到 DIRECT ===== if [[ "$ZT_STATUS" == "RELAY" ]]; then echo "[$(date '+%F %T')] MOON 节点为 RELAY,正在尝试重启 zerotier-one..." | tee -a "$LogFile" sudo systemctl restart zerotier-one.service sleep 10 # 重启后等待 10 秒再检测 # ===== 状态从 RELAY → DIRECT 时,发邮件通知 ===== elif [[ "$ZT_STATUS" == "DIRECT" && "$MOON_LAST_STATUS" == "RELAY" ]]; then echo "[$(date '+%F %T')] MOON 节点恢复 DIRECT,发送邮件通知..." | tee -a "$LogFile" msg="[$(date '+%F %T')] ZeroTier MOON 节点已恢复 DIRECT 连接。" { echo "To: $MailTo" echo "Subject: [NOTICE] ZeroTier MOON 连接恢复" echo "Date: $(date -R)" echo "Content-Type: text/plain; charset=UTF-8" echo "Content-Transfer-Encoding: 8bit" echo echo "$msg" } | msmtp -a default "$MailTo" fi # 记录上一次状态 MOON_LAST_STATUS="$ZT_STATUS" # 每 60 秒检查一次 sleep 60 done ``` 注册为systemd服务 ```bash sudo vim /etc/systemd/system/zerotier-moon-monitor.service ``` ```bash [Unit] Description=Zerotier Moon Monitor Service After=network.target [Service] Type=simple ExecStart=/home/mickey/APP/sh/zerotier-moon-monitor.sh Restart=on-failure RestartSec=10 User=mickey StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target ``` ```bash sudo systemctl start zerotier-moon-monitor.service sudo systemctl status zerotier-moon-monitor.service sudo systemctl enable zerotier-moon-monitor.service ``` * 报错```zerotier-cli: missing port and zerotier-one.port not found in /var/lib/zerotier-one``` 解决方法:可能是zerotier-one.port中的内容被删除,补上9993就好,如下图 ![image-20250915215639232](./Picture/家庭服务器/image-20250915215639232.png) **真是服了,什么奇葩的问题都能碰到╮(╯_╰)╭** * 节点控制器安装方法: 使用的是第三方webui:ztncui,[安装包下载地址](https://key-networks.com/ztncui/) ```bash curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb sudo apt install ./ztncui_0.8.14_amd64.deb sudo sh -c "echo ZT_TOKEN=`sudo cat /var/lib/zerotier-one/authtoken.secret` > /opt/key-networks/ztncui/.env" sudo sh -c "echo HTTPS_PORT=3443 >> /opt/key-networks/ztncui/.env" sudo sh -c "echo NODE_ENV=production >> /opt/key-networks/ztncui/.env" sudo chmod 400 /opt/key-networks/ztncui/.env sudo chown ztncui.ztncui /opt/key-networks/ztncui/.env sudo systemctl restart ztncui systemctl enable ztncui ``` 放行tcp协议3000端口 打开网址::3000 默认登录账户:admin 默认登录密码:password 配置好的节点控制器 **无意中发现的bug,ztncui里面ip段必须以10开头,否则ip地址之间无法联通** ### easytier [官方文档](https://easytier.cn/guide/introduction.html) #### ubuntu 下载 配置systemd服务,注意需要修改```ExecStart```部分 ```bash [Unit] Description=EasyTier Service After=network.target [Service] Type=simple ExecStart=/home/mickey/APP/easytier/easytier-core --config-server udp://mingqian.online:22020/mickey-easytier --machine-id mickey-server --hostname mickey-server Restart=on-failure RestartSec=10 User=root [Install] WantedBy=multi-user.target ``` 然后去配置网络,按下图红色框选配置,注意虚拟ipv4地址自定义,其余保持相同即可,网络白名单需要设置成当前网络 ![image-20251119161336513](./Picture/家庭服务器/image-20251119161336513.png) **服务端搭建共享节点** 安装,以及配置均同ubutnu,只有systemd服务需要修改一下,同理,注意```ExecStart```需要进行修改 ```bash [Unit] Description=EasyTier Service After=network.target Wants=network.target [Service] Type=simple ExecStart=/root/APP/easytier/easytier-core --config-server udp://mingqian.online:22020/mickey-easytier --machine-id mickey-rainyun --hostname mickey-rainyun Restart=always RestartSec=3 LimitNOFILE=1048576 Environment=TOKIO_CONSOLE=1 [Install] WantedBy=multi-user.target ``` **服务端搭建web控制台** 官方的web控制台特别不稳定,于是在雨云服务器上搭建web控制台,但是需要注意的是雨云服务器明面上是禁止udp访问的,但是实际使用过程中是可以连上的,应该只封杀了部分ip地址访问udp端口,参考[easytier中心化部署.html](https://preview-speedtest.mingqian.online/typora_documents/easytier%E4%B8%AD%E5%BF%83%E5%8C%96%E9%83%A8%E7%BD%B2.html) 注册为systemd服务: ```bash [Unit] Description=easytier-web-embed Service After=network.target [Service] Type=simple ExecStart=/usr/local/bin/easytier-web-embed User=root Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target ``` web控制台数据迁移:首先停止web控制台服务,在系统根目录下寻找`/et.db`,`et.db-shm`,`et.db-wal`,将其复制到新系统的根目录下即可。 #### windows * 方法一:可以使用easytier-gui,下载[easytier-gui](https://github.com/EasyTier/EasyTier/releases/download/v2.4.5/easytier-gui_2.4.5_x64-setup.exe),安装,然后按照上图gui操作配置即可,但是这样的话每次开机就得手动操作,不优雅。 * 方法二(推荐):注册为服务。下载[easytier压缩包](https://github.com/EasyTier/EasyTier/releases/download/v2.4.5/easytier-windows-x86_64-v2.4.5.zip),下载[nssm](https://nssm.cc/download),然后在cmd中运行以下命令: ```bash nssm install easytier ``` ![image-20251121161919973](./Picture/家庭服务器/image-20251121161919973.png) 然后去[easytier dashboard](https://easytier.cn/web#/h/aHR0cHM6Ly9jb25maWctc2VydmVyLmVhc3l0aWVyLmNu/deviceList)配置网络,就可以用了,因为已经注册为了windows服务,所以开机自启,优雅! ### frp 根据[官方安装文档](https://gofrp.org/zh-cn/docs/setup/)安装即可,并部署为systemd服务,windows中可以使用nssm注册为服务 已知问题:在连接一段时间后会自动断开,但是日志中仍显示已连接,但实际已经访问不上网站 frps.toml: ```toml bindPort = 7000 vhostHTTPPort = 7001 vhostHTTPSPort = 7002 auth.method = "token" auth.token = "lmqCQM,YSZGAYRty!frp" ``` frpc.toml: **需要注意:如果是连接到同一台服务器,不同frp客户端上的服务名称不能重名** ```toml serverAddr = "speedtest.mingqian.online" serverPort = 7000 auth.method = "token" auth.token = "lmqCQM,YSZGAYRty!frp" [[proxies]] name = "jellyfin-home" type = "http" localIP = "127.0.0.1" localPort = 4000 customDomains = ["jellyfin-speedtest.mingqian.online"] [[proxies]] name = "tinyMediaManager-home" type = "http" localIP = "127.0.0.1" localPort = 6003 customDomains = ["tmm-speedtest.mingqian.online"] [[proxies]] name = "clash-home" type = "http" localIP = "127.0.0.1" localPort = 9000 customDomains = ["clash-speedtest.mingqian.online"] [[proxies]] name = "ddns-go-home" type = "http" localIP = "127.0.0.1" localPort = 3000 customDomains = ["ddns-speedtest.mingqian.online"] [[proxies]] name = "nginx-ui-home" type = "http" localIP = "127.0.0.1" localPort = 1000 customDomains = ["nginx-mingfan-speedtest.mingqian.online"] [[proxies]] name = "filebrowser-home" type = "http" localIP = "127.0.0.1" localPort = 2002 customDomains = ["filebrowser-speedtest.mingqian.online"] [[proxies]] name = "resiliosync-ui-home" type = "http" localIP = "127.0.0.1" localPort = 6660 customDomains = ["resiliosync-speedtest.mingqian.online"] [[proxies]] name = "xunlei-home" type = "http" localIP = "127.0.0.1" localPort = 6005 customDomains = ["xunlei-speedtest.mingqian.online"] [[proxies]] name = "baidunetdisk-home" type = "http" localIP = "127.0.0.1" localPort = 7000 customDomains = ["baidunetdisk-speedtest.mingqian.online"] [[proxies]] name = "qbittorrent-home" type = "http" localIP = "127.0.0.1" localPort = 5000 customDomains = ["qbittorrent-speedtest.mingqian.online"] [[proxies]] name = "beszel-home" type = "http" localIP = "127.0.0.1" localPort = 6006 customDomains = ["beszel-speedtest.mingqian.online"] [[proxies]] name = "preview-home" type = "http" localIP = "127.0.0.1" localPort = 6033 customDomains = ["preview-speedtest.mingqian.online"] [[proxies]] name = "pdf2zh-home" type = "http" localIP = "127.0.0.1" localPort = 6007 customDomains = ["pdf2zh-speedtest.mingqian.online"] [[proxies]] name = "sub-store-home" type = "http" localIP = "127.0.0.1" localPort = 9002 customDomains = ["sub-speedtest.mingqian.online"] [[proxies]] name = "mkvtoolnix-home" type = "https" localIP = "127.0.0.1" localPort = 5800 customDomains = ["mkvtoolnix-speedtest.mingqian.online"] [[proxies]] name = "rustdesk-home" type = "tcp" localIP = "127.0.0.1" localPort = 8002 remotePort = 8002 [[proxies]] name = "resiliosync-home" type = "tcp" localIP = "127.0.0.1" localPort = 30624 remotePort = 30624 [[proxies]] name = "ssh-home" type = "tcp" localIP = "127.0.0.1" localPort = 6001 remotePort = 6001 ``` ### rathole 由于frpc断联的问题,故采用rathole尝试 client.toml: ```toml [client] remote_addr = "speedtest.mingqian.online:10000" default_token = "lmqCQM,YSZGAYRty!rathole" heartbeat_timeout = 30 retry_interval = 1 [client.transport] type = "tcp" [client.transport.tcp] # proxy = "socks5://user:passwd@127.0.0.1:1080" nodelay = true keepalive_secs = 20 keepalive_interval = 8 [client.services.jellyfin-home] local_addr = "127.0.0.1:4000" nodelay = false [client.services.tinyMediaManager-home] local_addr = "127.0.0.1:6003" [client.services.clash-home] local_addr = "127.0.0.1:9000" [client.services.ddns-go-home] local_addr = "127.0.0.1:3000" [client.services.nginx-ui-home] local_addr = "127.0.0.1:1000" [client.services.openlist-home] local_addr = "127.0.0.1:2000" nodelay = false [client.services.resiliosync-ui-home] local_addr = "127.0.0.1:6660" [client.services.xunlei-home] local_addr = "127.0.0.1:6005" [client.services.typora_documents-home] local_addr = "127.0.0.1:83" [client.services.baidunetdisk-home] local_addr = "127.0.0.1:7000" [client.services.qbittorrent-home] local_addr = "127.0.0.1:5000" [client.services.glances-home] local_addr = "127.0.0.1:61208" [client.services.rustdesk-home] local_addr = "127.0.0.1:8002" [client.services.resiliosync-home] local_addr = "127.0.0.1:30624" [client.services.ssh-home] local_addr = "127.0.0.1:6001" ``` server.toml: ```toml [server] bind_addr = "0.0.0.0:10000" default_token = "lmqCQM,YSZGAYRty!rathole" heartbeat_interval = 30 [server.transport] type = "tcp" [server.transport.tcp] nodelay = true keepalive_secs = 20 keepalive_interval = 8 [server.services.jellyfin-home] bind_addr = "0.0.0.0:4000" nodelay = false [server.services.tinyMediaManager-home] bind_addr = "0.0.0.0:6003" [server.services.clash-home] bind_addr = "0.0.0.0:9000" [server.services.ddns-go-home] bind_addr = "0.0.0.0:3000" [server.services.nginx-ui-home] bind_addr = "0.0.0.0:1000" [server.services.openlist-home] bind_addr = "0.0.0.0:2000" nodelay = false [server.services.resiliosync-ui-home] bind_addr = "0.0.0.0:6660" [server.services.xunlei-home] bind_addr = "0.0.0.0:6005" [server.services.typora_documents-home] bind_addr = "0.0.0.0:83" [server.services.baidunetdisk-home] bind_addr = "0.0.0.0:7000" [server.services.qbittorrent-home] bind_addr = "0.0.0.0:5000" [server.services.glances-home] bind_addr = "0.0.0.0:61208" [server.services.rustdesk-home] bind_addr = "0.0.0.0:8002" [server.services.resiliosync-home] bind_addr = "0.0.0.0:30624" [server.services.ssh-home] bind_addr = "0.0.0.0:6001" ``` 范围端口映射方法: rathole只能一个端口一个端口去映射,如果端口范围较多,可以使用以下脚本: server端: ```bash for p in {40001..40100} 2001; do echo "[server.services.openlist-ftp-$p]" echo "bind_addr = \"0.0.0.0:$p\"" echo "nodelay = false" echo "" done ``` client端: ```bash for p in {40001..40100} 2001; do echo "[client.services.openlist-ftp-$p]" echo "local_addr = \"127.0.0.1:$p\"" echo "nodelay = false" echo "" done ``` ### monitor-nat-traversal.sh(frp和rathole共用) ```bash #!/bin/bash # --- 邮件配置 --- MailTo="hitmickeyq@qq.com" Subject="[警告] 内网穿透服务异常重启通知" SERVER_NAME=$(hostname) # --- 监控配置 --- CHECK_URLS=( "https://beszel-speedtest.mingqian.online" "https://ddns-speedtest.mingqian.online" "https://jellyfin-speedtest.mingqian.online" "https://filebrowser-speedtest.mingqian.online" "https://qbittorrent-speedtest.mingqian.online" "https://resiliosync-speedtest.mingqian.online" "https://preview-speedtest.mingqian.online" "https://pdf2zh-speedtest.mingqian.online" "https://url-speedtest.mingqian.online" ) # 动态计算阈值:失败数量达到总数的一半(向上取整),才算作“大面积瘫痪” TOTAL_URLS=${#CHECK_URLS[@]} THRESHOLD=$(( (TOTAL_URLS + 1) / 2 )) KEYWORD="Faithfully yours, frp" # KEYWORD="502 Bad Gateway" # rathole 可能会报这个 MAX_RETRIES=2 # 连续 2 轮大面积失败才执行重启(抗抖动) INTERVAL=60 BASE_DIR=$(cd "$(dirname "$0")"; pwd) TEMP_DIR="$BASE_DIR/.monitor_frp_tmp" # TEMP_DIR="$BASE_DIR/.monitor_rathole_tmp" RETRY_FILE="$BASE_DIR/.monitor_retry_count" [ ! -f "$RETRY_FILE" ] && echo 0 > "$RETRY_FILE" echo "$(date '+%Y-%m-%d %H:%M:%S') - 内网穿透服务高级监控已启动。检测总数: $TOTAL_URLS, 报警阈值: $THRESHOLD" while true; do [ -d "$TEMP_DIR" ] && rm -rf "$TEMP_DIR" mkdir -p "$TEMP_DIR" echo "------------------------------------------------" echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始一轮并发探测..." for i in "${!CHECK_URLS[@]}"; do URL=${CHECK_URLS[$i]} ( # 改进1:使用 if ! 捕获所有 curl 底层错误(DNS, TLS, 超时等) if ! HTTP_CODE=$(curl -skL -o "$TEMP_DIR/resp_$i" -w "%{http_code}" --max-time 10 "$URL" 2>/dev/null); then touch "$TEMP_DIR/fail_$i" echo "[!] 底层网络异常: $URL" else # 改进2:使用 Bash 内置读取,提升效率 CONTENT=$(<"$TEMP_DIR/resp_$i") # 改进3:保留 502/504 和 KEYWORD 判断,不限制必须是 200 (FRP错误页通常是404) if [[ "$HTTP_CODE" == "502" ]] || [[ "$HTTP_CODE" == "504" ]] || [[ "$CONTENT" == *"$KEYWORD"* ]]; then touch "$TEMP_DIR/fail_$i" echo "[!] 穿透服务异常 (Code: $HTTP_CODE): $URL" else echo "[✓] 正常 (Code: $HTTP_CODE): $URL" fi fi ) & done wait # 改进4:使用 find 替代 ls,避免通配符异常 FAIL_COUNT=$(find "$TEMP_DIR" -maxdepth 1 -name "fail_*" | wc -l) # 清理网页内容缓存 rm -f "$TEMP_DIR"/resp_* echo "探测结束。本轮失败数: $FAIL_COUNT / 阈值: $THRESHOLD" if [ "$FAIL_COUNT" -ge "$THRESHOLD" ]; then CURRENT_RETRY=$(cat "$RETRY_FILE") CURRENT_RETRY=$((CURRENT_RETRY + 1)) echo "$CURRENT_RETRY" > "$RETRY_FILE" echo "$(date '+%Y-%m-%d %H:%M:%S') - [警告] 异常数达标。当前连续失败轮数: $CURRENT_RETRY" if [ "$CURRENT_RETRY" -ge "$MAX_RETRIES" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - [触发动作] 达到连续失败上限,尝试重启服务..." # 改进5:增强 sudo 执行的错误捕获 if sudo systemctl restart frpc.service; then # if sudo systemctl restart ratholec.service; then msg="服务器 [$SERVER_NAME] frp 隧道异常。\n\n状态:连续 $CURRENT_RETRY 轮探测异常数达标。\n异常链接数: $FAIL_COUNT / 总数: $TOTAL_URLS\n检查时间: $(date '+%Y-%m-%d %H:%M:%S')" # msg="服务器 [$SERVER_NAME] rathole 隧道异常。\n\n状态:连续 $CURRENT_RETRY 轮探测异常数达标。\n异常链接数: $FAIL_COUNT / 总数: $TOTAL_URLS\n检查时间: $(date '+%Y-%m-%d %H:%M:%S')" { echo "To: $MailTo" echo "Subject: $Subject" echo "Date: $(date -R)" echo "Content-Type: text/plain; charset=UTF-8" echo echo -e "$msg" } | msmtp -a default "$MailTo" echo "重启成功,已发送通知邮件。" else echo "[严重错误] sudo systemctl 重启命令执行失败!请检查用户权限或服务状态。" fi # 无论成功失败,触发后都重置计数器 echo 0 > "$RETRY_FILE" fi else echo 0 > "$RETRY_FILE" fi rm -rf "$TEMP_DIR" sleep $INTERVAL done ``` ----- 实际使用中需要frp和easytier共同使用,由于easytier组建的虚拟局域网在上传达到一定量时,会被运营商限速,但是使用frp可以指定服务器的域名,在域名中加入speedtest后可以规避运营商的限速 ## 16、网络测速 ### speedtest docker-compose.yml: ```yaml version: '3.7' services: speedtest: container_name: speedtest image: ghcr.io/librespeed/speedtest:latest restart: always environment: MODE: standalone #TITLE: "LibreSpeed" #TELEMETRY: "false" #ENABLE_ID_OBFUSCATION: "false" #REDACT_IP_ADDRESSES: "false" #PASSWORD: #EMAIL: #DISABLE_IPINFO: "false" #IPINFO_APIKEY: "your api key" #DISTANCE: "km" #WEBPORT: 8080 ports: - "8000:8080" # webport mapping (host:container) ``` 部署成功后可以进行内网的测速 ### iperf3 **第一步:在两端安装 `iperf3`** * **在服务器B (Linux) 上:** Bash ``` # 对于 Debian/Ubuntu sudo apt update sudo apt install iperf3 # 对于 CentOS/RHEL sudo yum install iperf3 ``` * **在电脑A (Windows) 上:** 1. 访问 `iperf` 官网下载页面: 2. 下载适用于您系统的 `iperf3` 版本 (通常是64位)。 3. 解压后会得到 `iperf3.exe` 和一个 `.dll` 文件。将它们放在同一个文件夹里。 4. 在该文件夹中打开命令行窗口(CMD或PowerShell)。 **第二步:在服务器B上启动 `iperf3` 服务端** 在服务器B的SSH终端里运行以下命令。它会开始监听,等待客户端连接: Bash ``` iperf3 -s ``` 您会看到类似 `Server listening on 5201` 的提示。 **第三步:在电脑A上运行 `iperf3` 客户端进行测试** 在电脑A的命令行窗口中,执行以下命令(将IP地址换成您服务器B的ZeroTier IP): * **测试上传速度 (A -> B):** PowerShell ``` .\iperf3.exe -c <服务器B的IP> ``` * **测试下载速度 (B -> A):** PowerShell ``` # -R 参数代表反向测试,即下载 .\iperf3.exe -c <服务器B的IP> -R ``` **如何解读 `iperf3` 的结果:** `iperf3` 会显示一个表格,最后一行 `[SUM]` 中的 `Bitrate` 就是您这次测试得到的**真实、准确的带宽**。您还可以看到 `Retr` (TCP重传次数) 这个值,它直接反映了网络中的丢包情况。 ## 17、硬盘健康度查询 ```bash sudo apt install smartmontools # 查询本机外接硬盘 sudo fdisk -l # 使用smartmontools查询健康度 sudo smartctl -a /dev/sdX ``` ## 18、ubuntu配置clash ubuntu22.04以下使用clash-verge-rev1.7.7 ubuntu24.04以上使用最新版即可 ubuntu服务器:使用[一键安装脚本](https://github.com/Hit-Mickey/clash-for-linux-server),贼方便 一键安装脚本中默认设置clash开机自启,对于云服务器来说有点不必要,只需要在```~/.bashrc```中修改即可,如下: ```bash # clashctl开机自启 # source /opt/clash/script/common.sh && source /opt/clash/script/clashctl.sh && watch_proxy # 关闭clashctl开机自启 source /opt/clash/script/common.sh && source /opt/clash/script/clashctl.sh ``` 不同之处在于删除了```watch_proxy``` ---- 延迟测试链接: 默认可用: 其余可供选择: Apple: 对中国大陆和境外都是最友好的 高通: 对中国大陆和境外都是最友好的 Google: TLS延迟会比较高,但会杜绝一些假延迟的情况 Microsoft: 入口一般 ------ clash tun模式和github访问冲突解决办法:在`~\.ssh\`文件夹下新建config文件,里面添加如下内容,使用443端口访问github。 ``` Host github.com HostName ssh.github.com Port 443 IdentityFile C:\Users\Mickey\.ssh\id_rsa_git PreferredAuthentications publickey User git ``` ## 19、openlist ### Linux 安装方式: **1、推荐:使用docker安装(将openlist+copyparty+meilisearch一起安装,解决openlist文件夹打包下载的问题)** 配置文件: ```yaml services: openlist: image: 'openlistteam/openlist:v4.2.5' container_name: openlist user: '1000:1000' # Please replace `0:0` with the actual user ID and group ID you want to use to run OpenList. volumes: - './openlist/data:/opt/openlist/data' - '/home/mickey:/local' ports: - '2000:5244' environment: - UMASK=022 restart: unless-stopped copyparty: image: copyparty/min:1.20.20 container_name: copyparty user: "1000:1000" ports: - 2100:3923 volumes: - /home/mickey:/w:ro command: # 将 /w 映射到 Web 根目录,并仅授予匿名读取/下载权限。 - "-v" - "/w::r" # 允许 OpenList 跨端口提交多选 ZIP 表单。 - "--acao" # 匿名只读卷无需 Cookie/HTTP 认证;兼容浏览器下载窗口的 Origin:null。 - "*" - "--acam" - "GET,HEAD,POST" # OpenList 多选 ZIP 使用跨站 POST;Chromium 会发送 Origin:null。 # 仅适用于当前匿名只读、LAN-only 实例。 - "--allow-csrf" # 仅使用 HTTP,并关闭当前下载场景不需要的功能。 - "--http-only" - "--no-crt" - "--no-dav" - "--no-del" - "--no-mv" - "--no-cp" - "--no-zls" - "--no-robots" - "-nih" - "-nid" - "-nb" environment: PYTHONUNBUFFERED: 1 restart: unless-stopped stop_grace_period: 15s # thumbnailer is allowed to continue finishing up for 10s after the shutdown signal meilisearch: # 固定补丁版本,升级前请先导出 dump 并阅读官方升级说明。 image: getmeili/meilisearch:v1.53.0 container_name: meilisearch # OpenList 容器通过 http://meilisearch:7700 访问;宿主机/Caddy 通过此地址访问。 # 仅绑定回环地址,避免将管理 API 直接暴露到局域网或公网。 ports: - '2700:7700' environment: MEILI_ENV: production MEILI_HTTP_ADDR: '0.0.0.0:7700' MEILI_MASTER_KEY: '83b2f54f7b78109f62d26a9b0f9e6dceb24bb57d60d418d5c159702413f95e4b' MEILI_DB_PATH: /meili_data MEILI_DUMP_DIR: /meili_dumps MEILI_SNAPSHOT_DIR: /meili_snapshots # 每 24 小时生成一次快照;只保留最新快照。 MEILI_SCHEDULE_SNAPSHOT: '86400' MEILI_LOG_LEVEL: INFO # 默认最多使用约 2/3 可用内存、1/2 CPU 线程,通常比固定值更适合未知规格的宿主机。 # 如需限制,可按实际资源取消注释: # MEILI_MAX_INDEXING_MEMORY: '2GiB' # MEILI_MAX_INDEXING_THREADS: '2' command: - /bin/meilisearch - --no-analytics volumes: - './meilisearch/data:/meili_data' - './meilisearch/dumps:/meili_dumps' - './meilisearch/snapshots:/meili_snapshots' restart: unless-stopped stop_grace_period: 1m ``` 2、使用二进制文件[手动安装](https://doc.oplist.org/guide/installation/manual#%E6%89%8B%E5%8A%A8%E8%BF%90%E8%A1%8C),不要用其他方式安装 openlist.service ```bash [Unit] Description=OpenList After=network.target [Service] Type=simple User=mickey Group=mickey WorkingDirectory=/home/mickey/APP/openlist ExecStart=/home/mickey/APP/openlist/openlist server Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target ``` `openlist`配置文件地址:`/var/lib/openlist/data/config.json` #### 索引配置 使用[meilisearch](https://www.meilisearch.com/docs/home)作为索引 配置:meilisearch索引 下载地址: 配置: config.toml: ```toml master_key = "dc56777170d9a1a40bc1e5285747f6ad" ``` meilisearch.service ```bash [Unit] Description=meilisearch service After=network.target [Service] Type=simple WorkingDirectory=/home/mickey/APP/meilisearch ExecStart=/home/mickey/APP/meilisearch/meilisearch --config-file-path /home/mickey/APP/meilisearch/config.toml Restart=on-failure RestartSec=10 User=mickey Group=mickey [Install] WantedBy=multi-user.target ``` 在`openlist`配置中将端口和meilisearch的配置填上即可,其余地方不用修改: ```json "meilisearch": { "host": "http://localhost:2700", "api_key": "dc56777170d9a1a40bc1e5285747f6ad", "index": "openlist" }, "scheme": { "address": "0.0.0.0", "http_port": 2000, ``` #### 配置[FTP](https://doc.oplist.org/guide/advanced/ftp) ubuntu防火墙中放行2001端口,40000:40100端口 ```bash sudo ufw allow 2001/tcp sudo ufw allow 40000:40100/tcp ``` openlist配置文件修改: ```json vim ~/APP/openlist/data/config.json "ftp": { "enable": true, "listen": "0.0.0.0:2001", "find_pasv_port_attempts": 50, "active_transfer_port_non_20": false, "idle_timeout": 900, "connection_timeout": 30, "disable_active_mode": false, "default_transfer_binary": true, "enable_active_conn_ip_check": false, "enable_pasv_conn_ip_check": false } ``` openlist网页端界面选项修改: 说明:1、由于使用的是IPV6,所以FTP服务端公网地址可以填127.0.0.1占位。2、私钥和证书路径可以从nginx的证书路径中获得。3、配置了私钥和证书但没开启强制使用显示TLS,表示既能使用ftp,又能使用ftpes ![image-20260121223213300](./Picture/家庭服务器/image-20260121223213300.png) #### sqlite3数据库清理方法 **1. 检查是否安装了 sqlite3** ``` sqlite3 --version ``` 如果没有安装,可以使用包管理器安装(例如 Ubuntu/Debian): ``` sudo apt-get install sqlite3 ``` **2. 执行清理命令** 进入到 `data.db` 所在的目录,运行以下命令: ``` # 假设你在 data 目录下 sqlite3 data.db "VACUUM;" ``` ## 20、ubuntu安全弹出硬盘 ### 方法一:图形界面操作 (最简单) 如果你使用的是 Ubuntu 默认的 GNOME 桌面环境: 1. 打开 **文件 (Files / Nautilus)** 管理器。 2. 在左侧侧边栏找到你的外部硬盘名称。 3. 点击硬盘名称旁边的 **⏏ (弹出图标)**。 4. **等待提示**:系统处理完毕后,通常会显示“可以安全移除设备”的通知。如果硬盘有指示灯,请等待灯不再闪烁后再拔出。 ### 方法二:命令行标准卸载 (适用于服务器或远程) 如果你在终端操作,或者需要脚本化处理,请使用 `umount` 命令。 **1. 确认挂载点和设备名** 首先,使用 `lsblk` 查看硬盘挂载在哪里: ``` lsblk ``` *输出示例:* > ``` > sdb 8:16 1 931G 0 disk` `└─sdb1 8:17 1 931G 0 part /media/username/MyHardDrive > ``` 这里 `/dev/sdb1` 是设备名,`/media/username/MyHardDrive` 是挂载点。 **2. 执行卸载命令** 使用 `umount` 命令(注意不是 unmount,没有 `n`): ``` # 方式 A:通过挂载点卸载(推荐) sudo umount /media/username/MyHardDrive # 方式 B:通过设备名卸载 sudo umount /dev/sdb1 ``` 如果没有报错,说明文件系统已卸载,数据已写入完毕。 ### 方法三:完全断电弹出 (最安全,推荐机械硬盘使用) 单纯的 `umount` 只是卸载了文件系统,**硬盘可能仍在旋转及通电**。对于机械硬盘,建议使用 `udisksctl` 进行完全断电,这相当于图形界面中的“弹出”。 ``` # 1. 卸载文件系统 sudo umount /media/username/MyHardDrive # 2.以此设备名完全切断电源 (注意是设备名 sdb,而不是分区 sdb1) udisksctl power-off -b /dev/sdb ``` 当你看到输出 `Successfully powered off drive...` 时,硬盘会停止旋转,此时拔出最为安全。 ### 常见问题:遇到 "Target is busy" (目标忙) 如果你在卸载时看到如下错误: > ``` > umount: /media/username/MyHardDrive: target is busy. > ``` 这说明有程序正在占用硬盘中的文件(例如终端正在该目录下,或者有文件正在打开)。 **解决方法:** 1. **找出占用进程:** 使用 `lsof` 或 `fuser` 查看谁在使用硬盘: Bash ``` # 查看占用该目录的进程 lsof +D /media/username/MyHardDrive ``` 2. **结束进程:** * 如果是你打开的终端,使用 `cd ~` 离开该目录。 * 如果是其他程序,手动关闭它,或者使用 `kill` 命令杀掉进程 ID (PID)。 3. **强制/懒惰卸载 (仅在无法停止进程且必须拔出时使用):** *警告:这可能会导致正在写入的数据丢失。* Bash ``` sudo umount -l /media/username/MyHardDrive ``` ## 21、远程桌面 ### rustdesk 各端口作用: 21114 (TCP): 用于网页控制台,仅在 Pro 版本中可用 Pro版本功能,略过 #### 21115 (TCP): 用于 NAT 类型测试 RustDesk 客户端要想做到**P2P直连**,必须知道自己是否能被外网访问。如果两边都是对称 NAT,直连基本没戏,只能走中继 (hbbr)。所以连接前要测试 NAT 类型。 RustDesk 客户端在启动时,会尝试通过 hbbs 的 21115/TCP 端口: 1. **探测公网可见 IP 和端口** 客户端向 hbbs 发送请求,hbbs 看到的来源 IP/端口可能和客户端自己认为的不一样。这样能识别 NAT 是否改写了端口。 2. **区分 NAT 类型** * **开放 / Full Cone NAT** → 直连成功率很高。 * **受限锥形 (Restricted Cone NAT)** → 大部分情况下能打洞成功。 * **端口受限 (Port-Restricted Cone NAT)** → 打洞更难。 * **对称 NAT (Symmetric NAT)** → 几乎无法 P2P,只能走中继 (21117)。 3. **决定连接策略** * 如果 NAT 类型“友好”,RustDesk 就会优先尝试 P2P。 * 如果 NAT 类型“不友好”,RustDesk 会直接转向中继 (21117)。 21115 端口的作用就是让 hbbs 充当一个“探测点”,帮客户端确认自己处于哪种 NAT 类型,从而决定能否直连还是必须用中继。 #### 21116/UDP 用于 ID 注册和心跳服务 ID 注册: * 当客户端启动时,它会随机生成一个`ID`。 * 客户端通过`21116/UDP`把自己的信息(ID、公网 IP、端口、NAT 类型等)注册到hbbs(ID server)。 * hbbs 维护一个`ID → 节点地址表`,用来让其他客户端能够找到当前的客户端。 心跳服务: * 客户端会定期通过UDP包向 hbbs 发“心跳”。 * hbbs依靠心跳来: * 确认客户端是否在线。 * 刷新客户端的公网地址和端口(因为NAT映射可能过期)。 * 保持NAT映射存活(UDP打洞需要映射一直有效)。 #### 21116/TCP 用于 TCP 打洞和连接服务 * 当双方 NAT 情况允许时,执行TCP 打洞 * 如果 UDP 不可达,尝试建立 TCP 通道 * 在必要时,作为连接控制和数据传输的备用通道 #### 21117/TCP:中继服务(Relay) * 当客户端之间"无法直接 P2P 连接"(例如双方都在对称 NAT 或防火墙阻挡 UDP/TCP 打洞)时,RustDesk 会使用 中继服务器 (hbbr)转发流量。 * ``` 21117/TCP ``` 就是中继服务监听的端口,负责: * 接收客户端发来的数据。 * 将数据转发给目标客户端。 可以理解为:当直连失败时,所有流量都会通过`21117/TCP`“绕道” #### 21118/TCP & 21119/TCP:支持网页客户端 * hbbs - 21118/TCP * hbbr - 21119/TCP RustDesk 除了桌面客户端外,还有网页端: * 提供 **HTTP/HTTPS 或 WebSocket 通道**,让网页客户端能连接到 RustDesk 服务。 * 转发控制命令和远程桌面数据,类似桌面客户端的功能。 在实验室ubuntu电脑上部署rustdesk server,通过zerotier组网后连接较稳定,可通过该方法远程连接。 ### 安装方法 根据需要自行将命令切换为root 下载编译好的文件 [https://github.com/rustdesk/rustdesk-server/releasesgithub.com/rustdesk/rustdesk-server/releases](https://github.com/rustdesk/rustdesk-server/releases) 链接: 解压缩 ```text unzip rustdesk-server-linux-amd64.zip ``` 移动文件 ```text mv rustdesk-server-linux-amd64/amd64 /home/ mv amd64/ rustdesk_server/ ``` 赋予可执行权限 ```text chmod +x hbbs chmod +x hbbr ``` 配置Service服务 ```text vim /etc/systemd/system/hbbs.service ``` 内容如下 ```text [Unit] Description=Rust Desk Service After=network.target [Service] Type=simple User=root Restart=on-failure RestartSec=5s WorkingDirectory=/home/rustdesk_server #-r用于指定网卡IP(适用多网卡),-k参数用于强制校验客户端公钥,用于避免未授权的使用 ExecStart=/home/rustdesk_server/hbbs -r 0.0.0.0 -p 21116 -k _ [Install] WantedBy=multi-user.target ``` ```text vim /etc/systemd/system/hbbr.service ``` 内容如下 ```text [Unit] Description=Rust Desk Service After=network.target [Service] Type=simple User=root Restart=on-failure RestartSec=5s WorkingDirectory=/home/rustdesk_server #-k参数用于强制校验客户端公钥,用于避免未授权的使用 ExecStart=/home/rustdesk_server/hbbr -p 21117 -k _ [Install] WantedBy=multi-user.target ``` 重载并启动服务 ```text systemctl reload systemctl start hbbs systemctl start hbbr ``` 查看服务状态 ```text systemctl status hbbs systemctl status hbbr ``` ![img](./Picture/家庭服务器/v2-6b8d9f6133e513ed20e26f60acfc362c_1440w.jpg) key就是/home/rustdesk_server文件夹运行后出现的id_ed25519.pub里的内容 ```text cat id_ed25519.pub ``` 获取 ID服务器和中继服务器只需填写IP,端口RustDesk会自动推导(如果没有特别设定) 注:中继服务器按官方文档的说法也无需填写,但在我的使用中,如果不填写,安卓无法远控PC,提示是无法找到中继服务器 ![img](./Picture/家庭服务器/v2-67608449fd04f63601118067b7352347_r.jpg) 其中的hbbr服务和hbbs服务配置好后通过以下命令设置为开机自启: ```bash sudo systemctl enable hbbr.service sudo systemctl enable hbbs.service # 防火墙端口放行 # 可以放行的最小端口:21115:21117/tcp,21116/udp sudo ufw allow 21114:21119/tcp sudo ufw allow 21116/udp ``` ## 客户端配置 在 **ID Server** 输入框中输入 `hbbs` 主机或 IP 地址(本地端 + 远程端)。另外两个地址可以留空,RustDesk 会自动推断(如无特殊设置),Relay Server 指的是 `hbbr` (端口 21117)。 现有的rustdesk服务配置: * ip:rustdesk-speedtest.mingqian.online key:9awg+DT4hXiyoTSmzLhOOnnGpmSmEsuoWr7XRVhTTZ4= --- * ip:10.2.1.1 key:tSim+bSGkzpLeLFtabgpygGY5jFN229UlZBIVKI2cCA= * ip:mingqian.space key:CxE3+lVugrcuuvGpyEI2LN7hoyuYvcEZ6Zpu2ZUbej4= * ip:172.25.0.3 key:VZfESgD4oDdJpJoJfrZVmlXmpJFPfcp71+5UwjTpmjQ= * ip:10.1.1.2 key:fWpUAPIymD9GNh6svhyKoSu2xpsU99Fy86bL3IxIr88= * ip:10.1.1.1 * tSim+bSGkzpLeLFtabgpygGY5jFN229UlZBIVKI2cCA= *由于实验室电脑没有ipv6,所以用zerotier组网的ip地址访问更流畅* ## 发现了新大陆 无意中发现的,可以在rustdesk 安全选项中开启允许ip直接访问,如下图,然后设置相应的端口好号,就可以通过ip直连访问,速度快到飞起,延迟在1ms左右 ![image-20250927003327480](./Picture/家庭服务器/image-20250927003327480.png) 没办法,rustdesk自己的打洞服务太差劲,使用zerotier打洞成功后,通过zerotier的虚拟ip地址直连访问速度快到飞起,美中不足的是会显示非加密直连,有个红色的叉叉图标,有点丑,同时不会显示服务器的在线状态,不过问题不大,可以通过中继服务器连接的选项来查看,如下图,绿色表示在线,橙色表示离线,但实际是在线的。 ![image-20250927003633958](./Picture/家庭服务器/image-20250927003633958.png) 各设备ip地址: mickey-server:10.2.1.2:8002 dell:10.2.1.3:8003 实验室ubuntu:10.2.1.4:8004 实验室4080服务器:10.2.1.5:8005 --- 各设备id: mickey-mingfan:1 250 692 094 dell:mickey-dell 实验室ubuntu:1638658645 4080服务器:374264127 密码统一为:lmq666CQM,YSZGAYRty!rustdesk rustdesk客户端在ubuntu上安装好后默认是开机自启的,系统已经把服务配好 ## 22、服务器文件远程访问 1、[mountain dock](https://mountainduck.io/) *安装包和授权许可证都在nas中* 优点:通过mountain dock可以挂载为本地网络驱动器,可以直接借助强大的windows资源管理器进行访问 缺点:速度较慢,不管是webdav协议还是sftp协议速度都很慢;软件有时会卡住;无法从公网挂载ftp,ipv6和ipv4都不行,只能在局域网中挂载ftp 使用方式:在需要编辑一些远程服务器文件时进行使用,也可以用来上传一些小文件,但上传有时会卡住,而且速度较慢 2、[winscp](https://winscp.net/eng/download.php) *开源免费* 优点:除了缺点全是优点 唯一缺点:不能挂载为本地网络驱动器 使用方式:用来上传和下载文件 连接保活方法: ## 2 WinSCP保持连接设置 选项(O) -> 选项(P) ![img](./Picture/家庭服务器/58ffe4b377e06b640ce788edef68b986.png) 面板 -> 远程 -> 刷新远程面板间隔 ![img](./Picture/家庭服务器/8f62336a35c07281973b8431e85ce8c8.png) ---- 二者实现完美互补 ## 23、windows中使用nssm安装服务 ``` NSSM: The non-sucking service manager Version 2.24 64-bit, 2014-08-31 Usage: nssm