Linux:如何使用 iptables 在不同网络上的两个主机之间进行端口转发?

Linux:如何使用 iptables 在不同网络上的两个主机之间进行端口转发?

我几乎绝望了……我已经阅读了大约 2 天的 iptables 转发示例,但我无法进行简单的端口转发。我在不同的网络上有 2 台机器。服务器 1(S1,ip 为 195.21.2.41)在我家,服务器 2(s2,ip 为 10.234.141.126)在 Amazon EC2 上。

我需要将所有发往 s2 的流量转发到 s1。我尝试了以下方法:

刷新所有规则,激活内核参数进行转发,添加后路由和预路由规则

iptables -F -t nat
iptables -F
echo 1 > /proc/sys/net/ipv4/ip_forward 
iptables -t nat -A POSTROUTING -d 195.21.2.41 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -d 10.234.141.126 -p tcp --dport 80 -j DNAT --to 195.21.2.41

我还可选地添加了:

iptables -A FORWARD -p tcp -i eth0 -d 195.21.2.41 --dport 80 -j ACCEPT

然后我尝试:

telnet 10.234.141.126 80

但没用。这到底是为什么不起作用?

更新:看一下一些测试:

[root@ip-10-234-141-216 ~]# telnet 195.21.2.41 80
Trying 195.21.2.41...
Connected to 195.21.2.41.
Escape character is '^]'.
[root@ip-10-234-141-216 ~]# iptables -F -t nat
[root@ip-10-234-141-216 ~]# iptables -F
[root@ip-10-234-141-216 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 
[root@ip-10-234-141-216 ~]# /sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -d 10.234.141.126 --dport 80 -j DNAT --to-destination 195.21.2.41
[root@ip-10-234-141-226 ~]# /sbin/iptables -t nat -A POSTROUTING -j MASQUERADE
[root@ip-10-234-141-216 ~]# /sbin/iptables -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT
[root@ip-10-234-141-216 ~]# 
[root@ip-10-234-141-216 ~]# telnet 10.234.141.126 80
Trying 10.234.141.126...
telnet: connect to address 10.234.141.126: Connection refused

更新2路线输出:

[root@ip-10-234-141-216 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.234.141.0    0.0.0.0         255.255.254.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         10.234.141.1    0.0.0.0         UG    0      0        0 eth0

答案1

如果你只需要将所有传入流量重定向到转发到另一台机器的指定端口,请尝试rinetd而不是 iptables。它是一个流量重定向服务器。

答案2

我目前遇到了同样的问题。我已经通过以下方式解决了

echo 1 >| /proc/sys/net/ipv4/ip_forward
iptables -t nat -A  PREROUTING -p tcp -d 47.168.137.12 --dport 8081 -j DNAT --to 47.168.137.11:8086
iptables -t nat  -A POSTROUTING -j MASQUERADE

答案3

为什么不直接使用 iptables?

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 3306 -j DNAT --to 192.168.7.101:3306

一次性工作:

iptables -t nat -A POSTROUTING -j MASQUERADE
echo "1" > /proc/sys/net/ipv4/ip_forward
sysctl net.ipv4.ip_forward=1

答案4

您的规则对我来说看起来不错,只是您使用的--to是 而不是--to-destination。可能是您使用的是不同版本,iptables但根据man 8 iptables(v.1.4.7):

   --to offset
          Set the offset from which it starts looking for any matching. If not passed, default is the packet size.

然后在 DNAT 部分:

   --to-destination [ipaddr][-ipaddr][:port[-port]]
          which can specify a single new destination IP address, an inclusive range of IP addresses, and optionally, a port range  (which  is  only
          valid  if the rule also specifies -p tcp or -p udp).  If no port range is specified, then the destination port will never be modified. If
          no IP address is specified then only the destination port will be modified.

          In Kernels up to 2.6.10 you can add several --to-destination options. For those  kernels,  if  you  specify  more  than  one  destination
          address, either via an address range or multiple --to-destination options, a simple round-robin (one after another in cycle) load balanc-
          ing takes place between these addresses.  Later Kernels (>= 2.6.11-rc1) don’t have the ability to NAT to multiple ranges anymore.

这是我想尝试的:

/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -d 10.234.141.126 --dport 80 -j DNAT --to-destination 195.21.2.41
/sbin/iptables -t nat -A POSTROUTING -j MASQUERADE
/sbin/iptables -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT

我还会尝试通过 telnet 连接到目的地,以10.234.141.126确保那里的防火墙不会阻止连接。

telnet 195.21.2.41 80

相关内容