我如何检查iptables的端口转发规则

我试图让一台机器上的端口转发工作。 在这里我已经阅读了很多关于这个问题的主题,但是我无法得到它的工作。 计划是将端口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作为超级用户。