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

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

全部:

最近,我添加了几个新的 iptables(RE:下面的代码片段)规则,以通过我的 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 Bad Request)吗?

感谢您的时间和帮助。

亲切的问候,

加里

答案1

VPN 服务器:假设以太网0(IP 1.2.3.4) 是直接连接到或至少具有到目标 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 规则后,问题就得到解决。

希望这对将来的其他人有帮助。

尊敬,

加里

相关内容