我有这两个规则
>
,它不起作用。我想念什么?
#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 :)
评论
NAT HOWTO我将使用n-p-r标记(尽管这可能与编程相关,但是措辞很差。)
怎么样:我是一个试图建立环境的程序员,因此我可以在从内部网调用的eclipse中调试服务器应用程序。足够近吗?
当然,这就是我所说的“措辞不佳”的意思。您能相应地编辑问题吗?