diff --git a/server_config/README.md b/server_config/README.md index fadf5ed..404206f 100644 --- a/server_config/README.md +++ b/server_config/README.md @@ -112,6 +112,27 @@ timedatectl set-timezone Asia/Shanghai apt install -y chrony && systemctl enable --now chrony ``` +### 2.4 PMTUD 黑洞缓解(tcp_mtu_probing) + +**症状**:部分客户端网络上出现"TCP 能连上、但 TLS 握手稳定超时" +(如 `_ssl.c:1011 handshake operation timed out`),而服务器从其他网络探测一切正常。 +原因是客户端↔服务器路径上某跳 MTU 变小且 ICMP Fragmentation Needed 被过滤 +(PMTUD 黑洞),服务器发出的满尺寸大包永远到不了客户端。 + +开启 RFC 4821 PLPMTUD,让服务器在探测失败后自动降低 MSS 恢复通信。 +写入 `/etc/sysctl.d/99-mtu-probing.conf`: + +```conf +net.ipv4.tcp_mtu_probing = 1 +``` + +```bash +sysctl --system +sysctl net.ipv4.tcp_mtu_probing # 期望输出: 1 +``` + +> 只影响命中黑洞的连接,正常连接无感知,可安全全节点开启。 + --- ## 3. 伪装站点页面 @@ -252,6 +273,22 @@ sing-box generate uuid > 私钥只放服务端配置;公钥给客户端订阅。UUID/short_id 全节点一致。 +**公钥必须推导验证,禁止手抄。** 订阅/节点配置里的 `public_key` 与服务端 +`private_key` 必须严格配对(X25519 推导),曾发生手抄错一个字符导致全节点 +REALITY 握手失败(客户端报 `reality verification failed`)的事故。改配置后验证: + +```bash +python3 - << 'EOF' +import base64 +from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey +from cryptography.hazmat.primitives import serialization +priv = base64.urlsafe_b64decode('' + '==') +pub = X25519PrivateKey.from_private_bytes(priv).public_key().public_bytes( + serialization.Encoding.Raw, serialization.PublicFormat.Raw) +print(base64.urlsafe_b64encode(pub).decode().rstrip('=')) # 应与下发的 public_key 逐字符一致 +EOF +``` + --- ## 7. mtg(MTProto 代理) @@ -336,6 +373,7 @@ systemctl start nginx # 4. nginx(最后,依赖证书/伪装 ```bash # BBR sysctl net.ipv4.tcp_congestion_control # => bbr +sysctl net.ipv4.tcp_mtu_probing # => 1(PMTUD 黑洞缓解,见 2.4) # sing-box sing-box check -c /etc/sing-box/config.json