我有两个问题。
问题 1:我的 Debian 机器有接口 eth3,IP 为 192.168.57.28。如果有人尝试连接到 192.168.57.28:1234,我该如何将请求重定向到另一台机器:192.168.57.25:80?
问题 2:如果我的 Debian 机器有两个接口:eth3 为 192.168.57.28,ppp0 为某个动态 IP,并且有人尝试通过端口 1234 上的 ppp0 进行连接,我该如何将请求重定向到 192.168.57.25:80?
我尝试过这个:
$ iptables -t nat -A PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 192.168.57.25:80
$ echo 1 > /proc/sys/net/ipv4/ip_forward
但它不起作用。
答案1
iptables -A PREROUTING -t nat -i eth3 -p tcp --dport 1234 -j DNAT --to-destination 192.168.57.25:80
iptables -A FORWARD -p tcp -d 192.168.57.25 --dport 80 -j ACCEPT
iptables -A POSTROUTING -t nat -s 192.168.57.25 -o eth3 -j MASQUERADE
第一个规则指定所有传入到端口 1234 的 TCP 连接都应发送到内部计算机 192.168.57.25 的端口 80。仅此规则无法完成工作,因为 iptables 会拒绝所有传入连接。然后,我们通过第二条规则接受从使用 publich IP 连接到 Internet 的 eth3 传入到端口 1234 的连接。我们在 FORWARD 链中添加第二条规则,以允许将数据包转发到 192.168.57.25 的端口 80。
编辑: 添加了 POSTROUTING。
跟踪连接。否则外部主机将看到他不知道的内部 IP 192.168.57.25。
编辑2:刚刚得到的提示应该是--to-destination而不是--to(抱歉)
答案2
感谢 Daywalker 和 Dánjal Salberg Adlersson。经过几个小时的抱怨,iptables 端口转发终于可以正常工作了。(在 Debian 上测试)
bash 脚本
#!/bin/bash
IPTBL=/sbin/iptables
IF_IN=eth0
PORT_IN=40022
IP_OUT=172.16.93.128
PORT_OUT=22
echo "1" > /proc/sys/net/ipv4/ip_forward
$IPTBL -A PREROUTING -t nat -i $IF_IN -p tcp --dport $PORT_IN -j DNAT --to-destination ${IP_OUT}:${PORT_OUT}
$IPTBL -A FORWARD -p tcp -d $IP_OUT --dport $PORT_OUT -j ACCEPT
$IPTBL -A POSTROUTING -t nat -j MASQUERADE