我正在尝试使用以下配置在 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 是桥梁。