我该如何使用iptables进行端口转发?

我希望端口8001上的ppp0上的连接被路由到端口8080上的eth0上的192.168.1.200。

我有这两条规则

-A PREROUTING -p tcp -m tcp --dport 8001 -j DNAT --to-destination 192.168.1.200:8080 -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT 

它不起作用。 我错过了什么?

首先 – 你应该检查是否允许转发:

 cat /proc/sys/net/ipv4/conf/ppp0/forwarding cat /proc/sys/net/ipv4/conf/eth0/forwarding 

如果两者都返回1就没关系。 如果不这样做:

 echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding 

第二件事 – DNAT只能应用于nat表。 所以,你的规则应该通过添加表格规范来扩展( -t nat ):

 iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080 iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT 

这两个规则仅适用于TCPstream量(如果您还想更改UDP,则需要提供类似的规则,但使用-p udp选项设置)。

最后,但并非最不重要的是路由configuration。 types:

 ip route 

检查返回的路由表项是否为192.168.1.0/24

我想你想要的是:

 iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination 192.168.1.200:8080 

你忘记了发送源地址SNAT'ing:

 sysctl net.ipv4.ip_forward=1 yours_wan_ip=101.23.3.1 -A PREROUTING -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --to-destination 192.168.1.200:8080 -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT -A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip 

不要忘了将你的linux防火墙设置为192.168.1.200地址的计算机上的默认网关。

我已经在我的linux路由器上创build了下面的bash脚本。 在继续之前,它会自动推断WAN IP并确认您的select。

 #!/bin/bash # decide which action to use action="add" if [[ "-r" == "$1" ]]; then action="remove" shift fi # break out components dest_addr_lan="$1" dest_port_wan="$2" dest_port_lan="$3" # figure out our WAN ip wan_addr=`curl -4 -s icanhazip.com` # auto fill our dest lan port if we need to if [ -z $dest_port_lan ]; then dest_port_lan="$dest_port_wan" fi # print info for review echo "Destination LAN Address: $dest_addr_lan" echo "Destination Port WAN: $dest_port_wan" echo "Destination Port LAN: $dest_port_lan" echo "WAN Address: $wan_addr" # confirm with user read -p "Does everything look correct? " -n 1 -r echo # (optional) move to a new line if [[ $REPLY =~ ^[Yy]$ ]]; then if [[ "remove" == "$action" ]]; then iptables -t nat -D PREROUTING -p tcp -m tcp -d $wan_addr --dport $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan iptables -D FORWARD -m state -p tcp -d $dest_addr_lan --dport $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr echo "Forwarding rule removed" else iptables -t nat -A PREROUTING -p tcp -m tcp -d $wan_addr --dport $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan iptables -A FORWARD -m state -p tcp -d $dest_addr_lan --dport $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr echo "Forwarding rule added" fi else echo "Info not confirmed, exiting..." fi 

脚本的使用很简单,只需复制并粘贴到一个文件然后。

 # chmod +x port_forward.sh # ./port_forward.sh 192.168.1.100 3000 ... confirm details ... press y # Forwarding rule added 

删除相同的规则

 # ./port_forward.sh -r 192.168.1.100 3000 ... confirm details ... press y # Forwarding rule removed 

我以为这可能会节省一些时间在他们各自的路由器上。

尝试

 echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding 

这些文件告诉内核允许在接口之间转发数据包。

我有任务使MACHINE_A认为服务在MACHINE_B上物理运行,但透明地将所有请求重新路由到MACHINE_C。

诀窍是使用MASQUERADE。

 sysctl net.ipv4.ip_forward=1 iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --to-destination MACHINE_C iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE 

请注意,你可能想调整命令:

  1. 只允许在特定的接口上进行数据包转发。 例如:

     sysctl net.ipv4.conf.eth0.forwarding=1 
  2. 为了不仅允许MACHINE_A,而且允许所有其他人使用端口转发,请删除:

     -s MACHINE_A 

这个命令对我不起作用:

 -A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip 

我写了两个LAN接口和FORWARD工作:

 iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP 
  • LAN_IF – LAN接口(例如,eth1,br0 …)
  • FW_PORD – 转发的端口(在删除主机上)
  • LAN_IP – LAN接口上的IP地址(在路由器上)

当然也需要PREROUTING和FORWARD 🙂