新的 iptables NAT 对其他 HTTP 请求产生错误 400 Bad Request

新的 iptables NAT 对其他 HTTP 请求产生错误 400 Bad Request

全部:

最近,我添加了一些新的 iptables(回复:下面的代码片段)规则,以通过我的 VPN(0x1000/0x1000)将流量路由到端口 443 上的特定目的地(172.67.168.48)。新规则根据需要通过 VPN 进行 NAT,但它们产生了不良影响,导致与上述目的地无关的其他 HTTP 请求产生错误响应 400 Bad Request。


# Create the RPDB rules
ip rule add from 0/0 fwmark "0x1000/0x1000" table ovpnc1 prio 9993        # VPN 1 fwmark

iptables -t mangle -A PREROUTING -i br0 -p tcp -d 172.67.168.48 --dport 443 -j MARK --set-mark 0x1000/0x1000
iptables -t nat -A PREROUTING -i br0 -p tcp -m mark --mark 0x1000/0x1000 -j DNAT --to-destination 172.67.168.48:443

当目标地址和端口明确指定时,为什么其他 HTTP 请求会受到新 NAT 规则的影响(400 错误请求)?

感谢您的时间和帮助。

亲切的问候,

加里

答案1

VPN 服务器:假设eth0(IP 1.2.3.4)是直接连接到目标 Web 服务器的 IP 或网络或至少具有到目标 Web 服务器 IP 或网络的路由的物理接口,您可以监控发往 Web 服务器 IP 的任何流量172.67.168.48:443,这些流量将被强制通过 VPN 隧道,然后通过 NAT 转换为 eth0 的 IP 地址(1.2.3.4在此示例中)。在本例中,br0接口(IP 10.10.10.1)是 VPN 服务器用于隧道传输流量的虚拟接口。当 VPN 启动并运行时,它已经知道如何将数据包路由到目标 IP172.67.168.48

如果没有,那么您必须添加静态路由:

$ ip route show
172.67.168.48/32 via 10.10.10.1 dev br0 metric 101

一旦满足路由语句,您就可以强制将发往 IP 的流量172.67.168.48:443通过隧道路由,并在另一侧以1.2.3.4路由方式退出172.67.168.48

$ sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp -m tcp -d 172.67.168.48 --dport 443 -j SNAT --to-source 1.2.3.4
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

例如,如果客户端发送一个数据包到172.67.168.48:80,源 IP 不会改变,如果后续链不允许,该数据包可能会被丢弃。

答案2

全部:

事实证明,我原来的 iptables -t nat 规则缺少 --dport 443 定义以及它与其他 HTTP 请求交互的原因。

# Create the RPDB rules
ip rule add from 0/0 fwmark "0x1000/0x1000" table ovpnc1 prio 9993        # VPN 1 fwmark

iptables -t mangle -A PREROUTING -i br0 -p tcp --dport 443 -d 172.67.168.48 -j MARK --set-mark 0x2000/0x2000
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j DNAT --to-destination 172.67.168.48:443 -m mark --mark 0x2000/0x2000

一旦将 --dport 443 定义添加到 iptables -t nat 规则,问题就解决了。

希望这能在未来帮助到其他人。

尊敬,

加里

相关内容