题 我怎样才能用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

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


110
2017-12-05 21:06




NAT HOWTO - Paul Tomblin
我将使用n-p-r标签(尽管如此) 可以 与编程有关,但当然措辞不当。) - Mihai Limbăşan
怎么样:我是一个程序员试图建立一个环境,所以我可以调试我的服务器应用程序在eclipse中从内部网调用。足够近?
当然,这就是我所谓的“措词不好”......你能相应地编辑这个问题吗? - Mihai Limbăşan


答案:


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

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

这两个规则仅适用于TCP流量(如果您也想要更改UDP,则需要提供类似的规则,但是 -p udp 选项集)。

最后,但并非最不重要的是路由配置。类型:

ip route

并检查是否 192.168.1.0/24 是返回的路由条目之一。


91
2018-03-24 11:24



我个人更喜欢 sysctl 语法就像 sysctl net.ipv4.conf.eth0.forwarding=1 - Doud
如何删除错误输入的规则? - Nickolai Leschov
第二行:“iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT”如果你没有防火墙限制/安全性,则不需要是大多数家庭局域网的情况,否则小心-A,因为它会在限制/安全后添加它可能无法工作(所以检查-I代替,即添加IN FRONT的iptables规则) - THESorcerer
@ÁronLőrincz,否则Iptables规则是易失性的,除非在启动时显式加载。 - sherrellbc
@Nickolai Leschov,输入相同的替换 -A 同 -D - Alexei Martianov


我想你想要的是:

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

14
2017-12-05 21:43



嗯......这就是我已经拥有的。我使用iptables-restore来加载它,所以每个都在它自己的部分,但这就是我上面写的。
好的,原语中的语法看起来很糟糕。你在规则中尝试过-i ppp0吗?究竟是什么问题? - Robert Gamble


你忘记了postrouting源地址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地址的计算机上的默认网关。


12
2018-06-09 11:09



你得到它倒退了 POSTROUNTING 步。此时谈话仍在进行中 --destination 而不是 --source。 - sherrellbc


我已经在linux路由器上创建了以下bash脚本。它会自动推断WAN IP并确认您的选择,然后再继续。

#!/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

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


5
2017-12-14 22:02





尝试

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

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


1
2017-12-10 02:58





我的任务是使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
    

1
2018-03-17 09:02





这个命令对我不起作用:

-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 - 转发端口(在detination主机上)
  • LAN_IP - LAN接口上的IP地址(在路由器上)

当然,PREROUTING和FORWARD也是必要的:)


0
2018-05-24 12:04