在linux中添加iptables snat或dnat规则时出错

我在Raspberry Pi 3上使用Arch Linux(32位版本)。

当我尝试添加任何-j SNAT-j DNAT规则到iptables ,它不起作用 – 我收到一个错误

 iptables: No change/target/match by that name 

我通常不会遇到与iptables有关的问题。 例如,标准的INPUTOUTPUTFORWARD有很多规则。 此外, POSTROUTING包含一个MASQUERADE规则,它可以正常工作,允许内部LAN与Internet通话。

我在尝试允许互联网向公共IP发送stream量到达内部networking上的一台机器时遇到了SNAT问题。 当这不起作用,然后我尝试了更简单的规则,他们也没有工作。 然后我试图添加DNAT规则,并有同样的问题。

我可以将更复杂的规则添加到PREROUTINGPOSTROUTING而不指定-j DNAT-j SNAT ,然后他们将添加,计数器将递增。

以下是添加-j SNAT-j DNAT规则和错误的最简单尝试的一些示例。 无论我尝试添加什么样的SNATDNAT规则,错误总是与下面显示的相同。

 [root@hostname ~]# iptables -F PREROUTING -t nat [root@hostname ~]# iptables -A PREROUTING -t nat -d $public_IP -j DNAT --to-destination $internal_IP iptables: No chain/target/match by that name. [root@hostname ~]# iptables -F POSTROUTING -t nat [root@hostname ~]# iptables -A POSTROUTING -t nat -o teql+ -j SNAT --to-source $public_IP iptables: No chain/target/match by that name. 

Linux细节和当前-t natconfiguration:

 [root@hostname ~]# uname -a Linux hostname.local 4.4.37-1-ARCH #1 SMP Fri Dec 9 19:03:41 MST 2016 armv7l GNU/Linux [root@hostname ~]# iptables -nvL -t nat Chain PREROUTING (policy ACCEPT 18 packets, 1184 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 600 37155 MASQUERADE all -- * teql+ 0.0.0.0/0 0.0.0.0/0 [root@hostname ~]# 

这里是一个加载的内核模块的列表,可能有帮助的情况下,

 [root@hostname ~]# lsmod | grep ip ipt_REJECT 1543 142 nf_reject_ipv4 3223 1 ipt_REJECT ipt_MASQUERADE 1223 1 nf_nat_masquerade_ipv4 2893 1 ipt_MASQUERADE iptable_nat 1812 1 nf_nat_ipv4 5573 1 iptable_nat nf_nat 15506 2 nf_nat_ipv4,nf_nat_masquerade_ipv4 nf_conntrack_ipv4 13768 7 nf_defrag_ipv4 1684 1 nf_conntrack_ipv4 nf_conntrack 101220 5 nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4 iptable_filter 1665 1 ip_tables 12280 2 iptable_filter,iptable_nat x_tables 17670 5 ip_tables,ipt_MASQUERADE,xt_conntrack,iptable_filter,ipt_REJECT ipv6 370087 20 

所以我最终得出这个xt_nat ….事实certificate, xt_nat Linux内核模块需要加载。 运行以下命令加载该模块立即解决了问题。

 insmod /lib/modules/`uname -r`/kernel/net/netfilter/xt_nat.ko.gz 

为了弄清楚发生了什么,我决定重新启动Pi。 在启动和iptables加载的xt_nat模块仍然正常工作 – 允许添加规则。

所以,尽pipe我不确定模块是如何卸载的(因为它已经在启动时加载了),至less现在它正在工作。 从理论上讲,问题现在不应该再发生,因为当存在-j DNAT-j SNAT规则时,模块不能被卸载。