在 Enterprise Linux 6 上使用 iptables NAT 导致端口损坏

在 Enterprise Linux 6 上使用 iptables NAT 导致端口损坏

我正在尝试使用以下配置在 CentOS 上设置强制 Web 门户重定向:

此配置对前几个数据包有效,但随后服务器的响应中目标端口突然损坏。数据包跟踪如下所示:

客户端:发出原始 Web 请求的主机。服务器:请求的原始目的地门户:强制门户服务器

此数据包跟踪取自可以同时查看客户端和门户流量的位置。以 c: 开头的行来自客户端,以 p: 开头的行来自门户。

c: client:57877 -> server:80 [SYN]
p: client:1092 -> portal:80 [SYN]  NAT adjusted SYN
p: portal:80 -> client:1092 [SYN, ACK]
c: server:80 -> client:57877 [SYN, ACL] NAT reversed on the SYN/ACK
c: client:57877 -> server:80 [ACK]
c: client:57877 -> server:80 HTTP GET
p: client:1092 -> portal:80 [ACK]
p: client:1092 -> portal:80 HTTP GET
p: portal:80 -> client:1092 [ACK]
c: server:68 -> client:57877 [ACK]
          ^^ WTF?!?

此时连接已中断。客户端不期望该端口上有数据包,因此发送了 RST。每次尝试此连接时,中断端口号都会增加 1(假设从现在起尝试 12 次后会成功)。所有重新传输的响应中都有相同的中断端口号。我不知道是什么原因造成的。

这是错误吗,还是我做错了什么?这台机器的配置确实有些不寻常。它配置为网桥。为了仅将 NAT 规则应用于单向数据包,首先用 ebtables NAT 规则标记数据包,并在应用 iptables NAT 时检查该标记。

这是基于内核为 2.6.32-279.5.2.el6.x86_64 的 Enterprise Linux 6

NAT 规则是:

target     prot opt in     out     source               destination         
DNAT       tcp  --  ilb    any     anywhere             anywhere            multiport dports http,https mark match 0x8 to:<portal IP>

ilb 是桥梁。

相关内容