全部:
最近,我添加了几个新的 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 规则后,问题就得到解决。
希望这对将来的其他人有帮助。
尊敬,
加里