iptables 将所有从客户端通过网关的连接转发到服务器

iptables 将所有从客户端通过网关的连接转发到服务器

我想将所有端口从我的客户端(Windows)转发到网关(Linux)后面的服务器(Windows)。

我的网络拓扑如下所示:

10.20.10.14 --> 10.20.10.4 --> 192.168.1.1 --> 192.168.1.4
   client          ppp0           eth0          server
                |--------- Gateway -------|

其中网关设备有两个网络设备:ppp0 和 eth0。

我希望在客户端与 ppp0 之间存在网络连接的情况下,服务器设备将在与客户端发送的数据相同的端口上看到数据。

换句话说,服务器应该认为它直接与客户端通信,并且在这种情况下网关是透明的。

另外我想知道如何删除这个规则。

有任何想法吗?

备注:我是所有设备的管理员。

答案1

将英文规则翻译成iptables规则,只需要这条规则:

iptables -t nat -A PREROUTING -s 10.20.10.14 -i ppp0 -j DNAT --to-destination 192.168.1.4

目标端口不会改变(并且源端口也不应该改变,除非客户端同时直接连接到服务器的极少数情况)。

192.168.1.4没有什么可以阻止客户端手动添加到via的路由10.20.10.4并直接访问服务器。如果您不希望这样做,为了隐藏服务器的IP,您还可以添加以下规则:

iptables -I FORWARD -s 10.20.10.14 -i ppp0 -d 192.168.1.4 -m conntrack ! --ctstate DNAT -j DROP

这将阻止对未 DNAT 的服务器的直接访问。

要删除这些规则,只需使用-D

iptables -D FORWARD -s 10.20.10.14 -i ppp0 -d 192.168.1.4 -m conntrack ! --ctstate DNAT -j DROP
iptables -t nat -D PREROUTING -s 10.20.10.14 -i ppp0 -j DNAT --to-destination 192.168.1.4

随机备注:

  • 由于 DNATed 连接被转发,因此必须在网关上启用 IP 转发。最容易做到这一点的是echo 1 > /proc/sys/net/ipv4/ip_forward
  • 服务器当然需要一条到客户端的路由来接受其连接,例如将 Gateway ( 192.168.1.1) 作为默认网关。
  • -i ppp0-d 10.20.10.4是可选的,可以删除(或者如果愿意,可以在 PREROUTING 规则中替换)。如果不替换为-i ppp++作为通配符),它可能会导致问题:当出现快速链接故障/重新连接时,ppp1如果ppp0之前没有断开,则可能会调用新的 ppp 接口。 iptables 规则将不再匹配。
  • 当 DNAT 规则被删除时,已经建立的流不会受到影响,新的流将会受到影响(即不会到达服务器)。

相关内容