如何使用 iptables 通过多跳转发端口

如何使用 iptables 通过多跳转发端口

我已经为此苦苦挣扎了一段时间,尽管我付出了努力,但还是无法让它发挥作用。我想将端口从公共 IP 转发到公司网络上的主机 (host1)。问题是,两者之间有多个“跳跃”。主机位于防火墙后面,防火墙位于设置为 vpn 客户端的 linux 路由器后面。然后,来自公司网络的所有流量都会通过 vpn 传输到设置为 vpn 服务器的云中的 VPS,然后传输到互联网(我希望我说得足够清楚……)这是一个粗略的示意图:

NC1 <==> 互联网 <==> VPS(VPN 服务器)<==> Linux 路由器(VPN 客户端)<==> 防火墙 <==> 网络(host1 在端口 9000 上具有网络广播监听器)

现在我在 VPS 中设置的 iptables 规则:

iptables -A FORWARD -i ens3 -o tun0 -p tcp --syn --dport 9000 -m conntrack --ctstate NEW -j ACCEPT

iptables -A FORWARD -i ens3 -o tun0 -d 10.8.0.7 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tun0 -o ens3 -s 10.8.0.7 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 9000 -j DNAT --to-destination 10.8.0.7

iptables -t nat -A POSTROUTING -o tun0 -p tcp --dport 9000 -d 10.8.0.7 -j SNAT --to-source <Public IP>

iptables -t nat -A POSTROUTING -p tcp -o tun0 --dport 9000 -j MASQUERADE

使用这些规则,我成功地从互联网建立了到 Linux 路由器的连接

现在我正尝试将相同的端口从 Linux 路由器转发到客户端主机(防火墙中已设置适当的重定向规则):

iptables -A FORWARD -i tun0 -o enp0s8 -p tcp --syn --dport 9000 -m conntrack --ctstate NEW -j ACCEPT

iptables -A FORWARD -i tun0 -o enp0s8 -d 10.0.2.11 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i enp0s8 -o tun0 -s 10.0.2.11 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 9000 -j DNAT --to-destination 10.0.2.11

iptables -t nat -A POSTROUTING -o enp0s8 -p tcp --dport 9000 -d 10.0.2.11 -j SNAT --to-source 10.0.2.100

iptables -t nat -A POSTROUTING -p tcp -o enp0s8 --dport 9000 -j MASQUERADE

10.0.2.11 是防火墙的 WAN IP,10.0.2.100 是连接到防火墙的 Linux 路由器的 enp0s8 接口的 IP。10.8.0.7 是 Linux 路由器的 tun0 IP。

这就是事情停止工作的地方。当我在 host1 上设置 netcat 监听器并尝试从互联网 (NC1) 连接时,我收到连接超时错误。

以下是 NC1 计算机尝试连接 host1 上的 netcat 监听器的 tcpdump 输出:

13:57:05.541009 IP NC1.59820 > xx.xx.xx.xx.9000: Flags [S], seq 681754542, win 29200, options [mss 1460,sackOK,TS val 2294604797 ecr 0,nop,wscale 7], length 0

来自Linux路由器的tun0接口的tcpdump:

15:53:18.060563 IP 10.8.0.1.59818 > 10.8.0.7.9000: Flags [S], seq 3131331659, win 29200, options [mss 1308,sackOK,TS val 2294404076 ecr 0,nop,wscale 7], length 0

来自 Linux 路由器 enp0s8 接口的 tcpdump:

15:53:18.060619 IP 10.0.2.100.59818 > 10.0.2.11.9000: Flags [S], seq 3131331659, win 29200, options [mss 1308,sackOK,TS val 2294404076 ecr 0,nop,wscale 7], length 0

我还应该提到,当 Linux 路由器直接连接到互联网(当然还要用 iptables 规则中的 IP 替换接口)时,连接就可以正常建立。

这可能有点愚蠢,但目前我并不这么认为。

答案1

好的,它终于可以正常工作了。原来是防火墙中存在某种错误。在我安装了需要重新启动的更新后,我又试了一次,没有问题。也许防火墙中的旧 iptables 规则是阻止程序...

相关内容