#!/bin/bash # 网络调优 —— 供 deploy.sh 一键部署时调用,也可以单独重跑。 # # 用法: # bash deploy-tune.sh # 用默认值 # bash deploy-tune.sh --prefix /tmp/x # 装到沙箱目录(测试用) # bash deploy-tune.sh --help # # ──────────────────────────────────────────────────────────────── # 分工(重要:同一个值绝不能有两处来源) # ──────────────────────────────────────────────────────────────── # 本脚本负责: TCP keepalive、开机加速 # net-tune.sh 负责:MSS 钳制、接口 MTU、路径 MTU 探测 # # 本脚本第 2 步会**调用 net-tune.sh**,所以单独跑本脚本 # 也能拿到完整的调优效果。 # # 早先两边都设了一遍 MSS 和 MTU,结果"到底哪个值生效"很难查 # (net-tune.sh 写着保持 1500,本脚本写着压到 1400,谁后跑谁赢)。 # 现在只有一个出处:net-tune.sh。 # # ──────────────────────────────────────────────────────────────── # 本脚本做的两件事,各自的实测依据 # ──────────────────────────────────────────────────────────────── # # ① TCP keepalive 改成 30/10/3(默认是 7200/75/9) # 为什么:这条 4G 线路会**静默丢连接** —— 不发明文 FIN/RST, # 对端就以为连接还在。而 Linux 默认要 7200 秒(2 小时)才发现死链。 # 于是隧道/长轮询会挂在一条早已死掉的连接上,表现就是 # "过了几分钟突然 502 / 连接超时"。 # 改成 30 秒首发探测、每 10 秒一次、3 次没回应判死 —— # 最快 60 秒就能发现并重建。 # # ② mask 掉 systemd-networkd-wait-online # 这台机器 NetworkManager 和 systemd-networkd 同时在跑, # 但 wlan0 归 NetworkManager 管。 # systemd-networkd-wait-online 傻等一个不归它管的网络, # 干等 2 分钟超时然后 failed,把 network-online.target 拖住 —— # relay / tunnel 全跟着等。 # 实测:用户空间启动 2 分 6 秒 -> 14 秒; # 掉电重启后公网恢复 2 分 10 秒 -> 24 秒。 # ──────────────────────────────────────────────────────────────── set -u PREFIX="" while [ $# -gt 0 ]; do case "$1" in --prefix) PREFIX="${2:-}"; shift 2 ;; --help|-h) echo "用法: bash deploy-tune.sh [--prefix DIR]" echo echo " 本脚本负责 TCP keepalive 和开机加速;" echo " MSS 钳制 / 接口 MTU 由 net-tune.sh 负责,第 2 步会调用它。" echo echo " --prefix DIR 安装根目录(默认 /),测试时指到临时目录" echo " --help 显示这段帮助" exit 0 ;; *) echo "未知参数: $1(用 --help 看用法)"; exit 2 ;; esac done SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) SYSCTL_DIR="$PREFIX/etc/sysctl.d" SYSCTL_FILE="$SYSCTL_DIR/97-ykxmz-network.conf" echo " 网络调优(前缀: ${PREFIX:-/})" # ──────────────────────────────────────────────────────────────── # 1. TCP keepalive:30 秒就发现死链 # ──────────────────────────────────────────────────────────────── echo echo " [1/4] TCP keepalive(默认 7200 秒太慢,死链要挂 2 小时才被发现)" mkdir -p "$SYSCTL_DIR" # 注意:MSS / MTU / mtu_probing 由 net-tune.sh 负责, # 别往这个文件里加那些 —— 会变成两处来源。 cat > "$SYSCTL_FILE" <<'EOF' # ykxmz: 这条 4G 线路会静默丢连接(不发明文 FIN/RST), # 而 Linux 默认要 7200 秒才发现死链 —— 表现就是"过几分钟突然 502"。 # 改成 30 秒首发探测、每 10 秒一次、3 次没回应判死。 net.ipv4.tcp_keepalive_time = 30 net.ipv4.tcp_keepalive_intvl = 10 net.ipv4.tcp_keepalive_probes = 3 EOF if [ -w /proc/sys/net/ipv4/tcp_keepalive_time ]; then sysctl -p "$SYSCTL_FILE" >/dev/null 2>&1 || \ sysctl --system >/dev/null 2>&1 || true fi printf " keepalive: %s 秒首发 / %s 秒间隔 / %s 次判死\n" \ "$(cat /proc/sys/net/ipv4/tcp_keepalive_time 2>/dev/null || echo '?')" \ "$(cat /proc/sys/net/ipv4/tcp_keepalive_intvl 2>/dev/null || echo '?')" \ "$(cat /proc/sys/net/ipv4/tcp_keepalive_probes 2>/dev/null || echo '?')" echo " 配置文件: $SYSCTL_FILE" # ──────────────────────────────────────────────────────────────── # 2. MSS / 接口 MTU / 路径探测 —— 交给 net-tune.sh(唯一出处) # ──────────────────────────────────────────────────────────────── echo echo " [2/4] MSS 钳制 / 接口 MTU / 路径探测(调用 net-tune.sh)" TUNE="$SCRIPT_DIR/net-tune.sh" NETTUNE_OK=0 if [ -f "$TUNE" ]; then if bash "$TUNE"; then NETTUNE_OK=1 else echo " ⚠ net-tune.sh 报错,继续" fi else echo " ⚠ 找不到 net-tune.sh($TUNE)" echo " 它负责 MSS 钳制和接口 MTU,缺了它这次就只做了 keepalive 那一半。" fi # ──────────────────────────────────────────────────────────────── # 3. 加快开机(mask networkd-wait-online) # ──────────────────────────────────────────────────────────────── echo echo " [3/4] 关掉 systemd-networkd-wait-online(网络不归它管,白等 2 分钟)" if command -v systemctl >/dev/null 2>&1; then systemctl disable --now systemd-networkd-wait-online.service \ >/dev/null 2>&1 || true systemctl mask systemd-networkd-wait-online.service \ >/dev/null 2>&1 || true echo " 状态: $(systemctl is-enabled systemd-networkd-wait-online.service 2>&1)" else echo " [跳过] 没有 systemctl" fi # ──────────────────────────────────────────────────────────────── # 4. 收尾 # ──────────────────────────────────────────────────────────────── # MSS / MTU 只对**新建连接**生效。net-tune.sh 自己会把正在跑的隧道 # 重启一遍;只有它没跑成的时候这里才补一次,免得重启两遍。 echo echo " [4/4] 收尾" if [ "$NETTUNE_OK" = "1" ]; then echo " net-tune.sh 已经处理过隧道重建,这里不重复重启" elif command -v systemctl >/dev/null 2>&1; then for svc in lanremote-tunnel lanremote-tunnel-h2; do if systemctl is-active --quiet "$svc" 2>/dev/null; then echo " $svc 正在跑,补一次重启让新参数生效" systemctl restart "$svc" >/dev/null 2>&1 || true fi done else echo " [跳过] 没有 systemctl" fi echo echo " 网络调优完成(keepalive 见上;MSS/MTU 见 net-tune.sh 的输出)"