我想将所有端口从我的客户端(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 规则被删除时,已经建立的流不会受到影响,新的流将会受到影响(即不会到达服务器)。