IpSec/GRE 隧道中的数据包丢失

IpSec/GRE 隧道中的数据包丢失

这是我的设置:

  +--------------------+ +-------------------+ +--------------------+
  | 路由器 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

相关内容