我的一台服务器(“A”)的备份(通过 Bacula)通过 IPSec(Debian 测试中的 Strongswan)连接到存储守护进程(“B”),它们运行的时间没有完成 95%。显然发生的是:
- Bacula 打开到存储守护进程的 VPN IP 的 TCP 连接。(甲?乙)
- 由于内核设置
net.ipv4.ip_no_pmtu_disc=0
是默认设置的,因此在明文数据包中设置了 IP Don't Fragment 位。
- 当将数据包路由到 IPSec 隧道时,有效载荷的 DF 位被复制到 ESP 数据包的 IP 标头。
- 经过一段时间(通常大约 20 分钟)并发送多达几 GB 的数据后,会发送一个比之前的 ESP 数据包稍大的数据包。(甲?乙)
- 由于存储守护程序接口的 MTU 低于发送主机之一,因此沿途的路由器会向主机发送 ICMP 类型 3、代码 4(需要分段且未设置分段)错误。(一些路由器?A)
- 连接停止,出于某种原因,主机 A 将约 100 个空的重复 ACK 泛洪到 B(在约 20 毫秒内)。
(ICMP 数据包到达主机 A,并且没有阻止 ICMP 的 iptables 规则。)
发生这种情况的可能原因,我能想到的:
- 内核错误 (Debian 3.13.7-1)
- Linux 的 IPSec 实现故意忽略 PMTU 消息作为安全措施,因为它不受保护并且会影响现有的 SA。(根据RFC 4301 8.2.1似乎是有效的行为)
- 必须对 PMTU 老化(RFC 4301 …