这是我的设置:
+--------------------+ +-------------------+ +--------------------+ | 路由器 B a +-----+ 路由器+防火墙 C | | b 路由器 D | | 10.10.10.1 ----------------------------------10.10.10.2 | | +-----+ | | +--- 更多网络 | 192.168.10.1 | |192.168.2.11 +--+192.168.2.57 | +----|---------------+ +-------------------+ +--------------------+ | | +----|---------------+ +----|---------------+ |192.168.10.11 | |192.168.2.38 | |服务器 A | |客户端 E | | | | | | | | | +--------------------+ +--------------------+
- 路由器 B 和 C 在互联网上具有公共 IP 和 192.168.10.1-192.168.2.57 的 IpSec 隧道(Racoon)。
- 所有机器都运行 Ubuntu Linux。
- 192.168.10.1-192.168.2.57 之间存在嵌入式 GRE 隧道,隧道 IP 为 10.10.10.1 和 10.10.10.2。
- 该隧道需要能够将数据从 192.168.10.0/24 网络路由到路由器 D 后面的其他网络(例如 192.168.3.0/24)。
- 每个 IP 都可以 ping 通其他所有 IP。
- 如果客户端 E 在服务器 A 上打开网页,TCP/IP 握手和“GET /”到达服务器 A,但服务器 A 的(大)响应没有到达客户端 E,而是在 GRE 隧道“中”丢失。
- 我认为我们由于碎片化而丢失了大数据包,并减少了接口 a 和 b 上的 MTU,最后降至 1000 字节,但这并没有帮助。
- 接口 a 上的 tcpdump 显示正确的 HTTP 流量
- 接口 b 上的 tcpdump 显示从 E->A 的握手和 HTTP 流量,但没有显示从 A->E 的大型响应数据包。
- 路由器 + 防火墙 C 上的 tcpdump 显示 GRE 数据包从 IpSec 隧道中丢失,没有大数据包到达
- 从 B->E 的 HTTP 请求工作正常。
- D<->B 之间的大数据包不通过 GRE,而是直接在 IpSec 隧道中传输(即 192.168.2.57 接口上的 ssh 192.168.10.1)
- B 和“更多网络”之间的大数据包可以正常工作(通过 GRE 隧道!)。
- 交换 A 和 E 的角色没有帮助。(E 作为服务器,A 作为客户端或另一个方向的大数据包不起作用。)
现在我陷入困境。有什么建议可以检查什么吗?哪种配置有助于诊断?非常感谢!
答案1
你忘记了 MSS
1)您必须在 gre 隧道 1400 上设置 mtu
2)对于 SYN 数据包,将 mss 设置为相同的大小 mtu 1400
在Linux中:
iptables -I FORWARD -i tun+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400
答案2
默认表是筛选,因此当您提供规则时,iptables -A FORWARD ...
只需将规则放入筛选表。还有几个其他表和表曼格尔就是其中之一。正如 man iptables 中所说:“该表用于专门的数据包修改。”
因此,要编辑包(由 完成-j TCPMSS --set-mss
),应该使用曼格尔表,这就是为什么规则应该是这样的:
iptables -t mangle -A FORWARD -i tun+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400