我几乎绝望了……我已经阅读了大约 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