![如何检查 iptables 端口转发规则](https://linux22.com/image/570874/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%20iptables%20%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E8%A7%84%E5%88%99.png)
我尝试过在一台机器上进行端口转发。我在这里阅读了很多关于这个问题的主题,但我无法让它工作。计划是将端口 5000 上 ppp0 上的所有传入流量转发到 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
当我通过该端口访问该机器时,如果没有这些规则,连接将被拒绝,而如果符合这些规则,连接将超时。因此有些东西正在运行,但并非按照预期的方式运行。
我怎样才能检查我做错了什么?
答案1
您需要将 FORWARD 规则与 PREROUTING 结合使用。原因是在应用 FILTER 表中的任何规则之前,对目标 IP 进行了更改 - 检查此图用于将 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,以便私有网络内的计算机可以访问外部世界,则可以使用
iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0
注意:您不需要为此制定转发规则。
要查看哪个表包含哪些规则,您可以使用
iptables -t [table] -S
对于 [table] 规则的非结构化视图(FILTER NAT MANGLE 是 iptables 的表;如果你想要 FILTER,你不需要,-t FILTER
因为 FILTER 是 iptables 所有调用的默认表),或者
iptables -t [table] -L
查看分解到表链中的规则。
检查手册页想要更详细地了解 iptables - 请参阅很多如果你想深入了解的话,还需要一些时间:)
答案2
首先,仅允许NEW
连接是不够的。因此,您必须使用如下规则:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
您可能需要启用 IPv4 路由。的值应为 1。尝试以超级用户身份/proc/sys/net/ipv4/ip_forward
使用。echo 1 > /proc/sys/net/ipv4/ip_forward