我试图让一台机器上的端口转发工作。 在这里我已经阅读了很多关于这个问题的主题,但是我无法得到它的工作。 计划是将端口5000上的ppp0上的所有传入stream量转发给eth0上的设备。 以下是我尝试过的规则(从本网站收集):
iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 5000 -j DNAT --to-destination 192.168.5.242:5000 iptables -A FORWARD -p tcp -d 192.168.5.242 --dport 5000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0
这没有用。 下一个尝试是这样的:
iptables -A PREROUTING -t nat -i ppp0 -p tcp --dport 5000 -j DNAT --to 192.168.5.242:5000 iptables -A INPUT -p tcp -m state --state NEW --dport 5000 -i ppp0 -j ACCEPT iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0
在该端口上访问该机器时,如果没有这些规则,并且规则连接超时,将会拒绝连接。 所以有些东西在工作,但不是按照预期的方式。
我如何检查我做错了什么?
您需要使用FORWARD规则与PREROUTING。 原因是目标IP的更改是在应用FILTER表的任何规则之前完成的 – 请检查此图表 ,了解不同iptables表的规则应用于数据包的顺序。
所以你需要在进行NAT转发的过程中使用NAT。 出路(如果连接从外部初始化,同时寻址ppp0:5000)的重新转换将由DNAT规则来处理。
iptables -A PREROUTING -t nat -i ppp0 -p tcp --dport 5000 -j DNAT --to 192.168.5.242:5000 iptables -A FORWARD -p tcp -d 192.168.5.242 --dport 5000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
您还需要激活IP转发本身; 如果你只是想暂时(直到下一次系统关机),你可以去
echo 1 > /proc/sys/net/ipv4/ip_forward
如果要持续激活端口转发,则需要更改/etc/sysctl.conf ,将net.ipv4.ip_forward的值更改为1 。
如果您还想在出路上使用NAT,以便您的专用networking中的计算机可以到达外部世界,则可以使用
iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0
注意:这个你不需要FORWARDING规则。
要查看哪个表包含哪些规则,您可以使用
iptables -t [table] -S
对于[table]规则的非结构化视图(FILTER NAT MANGLE是iptables的表格;如果你想要FILTER,你不需要-t FILTER因为FILTER是iptables所有调用的默认表格),或者
iptables -t [table] -L
以便将规则分解成表格链。
查看手册页 ,查看iptables的详细信息 – 如果您想深入了解,请带上大量时间:)
首先,只允许NEW连接是不够的。 所以,你必须使用像这样的规则:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
您可能需要启用IPv4路由。 /proc/sys/net/ipv4/ip_forward应该是1.尝试使用echo 1 > /proc/sys/net/ipv4/ip_forward作为超级用户。