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

我有这两个规则
>
,它不起作用。我想念什么?

评论

NAT HOWTO

我将使用n-p-r标记(尽管这可能与编程相关,但是措辞很差。)

怎么样:我是一个试图建立环境的程序员,因此我可以在从内部网调用的eclipse中调试服务器应用程序。足够近吗?

当然,这就是我所说的“措辞不佳”的意思。您能相应地编辑问题吗?

#1 楼

首先-您应该检查是否完全允许转发:

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):好,您需要提供类似的规则,但要设置-p udp选项。)最后,但并非最不重要的是路由配置。类型:

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


,并检查192.168.1.0/24是否在返回的路由条目中。

评论


我个人更喜欢sysctl语法,例如sysctl net.ipv4.conf.eth0.forwarding = 1

–豆豆
2012年9月7日在21:10

如何删除输入错误的规则?

– Nickolai Leschov
2014年4月13日在2:51

如果没有防火墙限制/安全性,则不需要第二行:“ iptables -A FORWARD -p tcp -d 192.168.1.200 –dport 8080 -m state -state NEW,ESTABLISHED,RElated -j ACCEPT”大多数家庭LAN都是这种情况,否则请谨慎使用-A,因为它将在限制/安全性之后添加它,并且可能无法正常工作(因此请检查-I,即在iptables规则的前面添加)

–THESorcerer
2014年8月28日在13:34

@ÁronLőrincz,不。除非在启动时明确加载,否则Iptables规则是易变的。

– sherrellbc
17年1月23日在20:59



@Nickolai Leschov,输入相同的-A替换为-D

– Alexei Martianov
18-4-6在1:27



#2 楼

我想您想要的是:

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


评论


嗯...那是我已经拥有的。我使用iptables-restore加载它,因此每个都在其自己的部分中,但这就是我上面写的。

–stu
08-12-5在22:21

好的,原始语法看起来很糟糕。您在规则中尝试了-i ppp0吗?到底是什么问题?

– Robert Gamble
08-12-5在23:17

#3 楼

您会忘记路由后的源地址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地址的计算机上的默认网关。 >

评论


在POSTROUNTING步骤中将其倒退。在这一点上,对话仍然是关于目的地而不是来源。

– sherrellbc
17年1月23日在21:04

#4 楼

我已经在Linux路由器上创建了以下bash脚本来执行此操作。它会自动推断WAN IP并在继续之前确认您的选择。 />
#!/bin/bash

# decide which action to use
action="add"
if [[ "-r" == "" ]]; then
  action="remove"
  shift
fi

# break out components
dest_addr_lan=""
dest_port_wan=""
dest_port_lan=""

# 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


我认为这可以为某人节省各自路由器的时间。 br />

#5 楼

我的任务是让MACHINE_A认为服务实际上是在MACHINE_B上运行的,但是透明地将所有请求重新路由到MACHINE_C。 >
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


请注意,您可能需要调整以下命令:



仅允许在特定接口上转发数据包。例如:

sysctl net.ipv4.conf.eth0.forwarding=1



要不仅允许MACHINE_A,还允许所有其他人使用端口转发,请删除:

-s MACHINE_A




#6 楼

试试

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


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

#7 楼

当目标主机和网关位于同一子网中时(如您的情况,它们都位于eth0 192.168.1.0/24上),可接受的解决方案将起作用。网关,源和目标都在不同的子网上。

1)启用IP转发:

sysctl net.ipv4.conf.eth0.forwarding=1 
sysctl net.ipv6.conf.eth0.forwarding=1 



2)添加2 iptables规则转发特定的TCP端口:

重写数据包的目标IP(并返回回复数据包):

iptables -A PREROUTING -t nat -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080  


将数据包的源IP重写为网关的IP(并返回到答复数据包中):没有默认的ACCEPT防火墙规则,允许流量流向目标:

iptables -A POSTROUTING -t nat -p tcp -d 192.168.1.200 --dport 8080 -j MASQUERADE



4)测试新设置。如果可行,请确保更改在重新启动后仍然存在:

iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


#8 楼

此命令对我不起作用:

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


我有2个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 :)