![在 Linux 中添加 iptables snat 或 dnat 规则时出错](https://linux22.com/image/695762/%E5%9C%A8%20Linux%20%E4%B8%AD%E6%B7%BB%E5%8A%A0%20iptables%20snat%20%E6%88%96%20dnat%20%E8%A7%84%E5%88%99%E6%97%B6%E5%87%BA%E9%94%99.png)
我在 Raspberry Pi 3 上使用 Arch Linux(32 位版本)。
当我尝试添加任何-j SNAT
或-j DNAT
规则时iptables
,它不起作用 - 我收到错误
iptables: No change/target/match by that name
我通常不会遇到 iptables 问题。例如,标准INPUT
,OUTPUT
和FORWARD
有很多规则。此外,POSTROUTING
包含一条MASQUERADE
运行良好的规则,允许内部 LAN 与互联网通信。
我SNAT
在尝试允许互联网将流量发送到公共 IP 以到达内部网络上的机器时遇到了这个问题。当这不起作用时,我尝试了更简单的规则,但它们也不起作用。然后我尝试添加DNAT
规则并遇到了同样的问题。
我可以将更复杂的规则添加到PREROUTING
and中,POSTROUTING
而无需指定-j DNAT
or -j SNAT
,然后它们将添加,并且计数器将递增。
-j SNAT
以下是添加规则和错误的一些最简单尝试示例-j DNAT
。无论我尝试添加什么SNAT
或DNAT
规则,错误总是与下面显示的相同。
[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 nat
配置:
[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
答案1
在 Arch 中xt_nat
默认不加载。
这是通过以下方式修复的:
modprobe xt_nat
echo "xt_nat >> /etc/modules-load.d/iptables.conf"
答案2
所以我最终弄清楚了……原来xt_nat
需要加载 Linux 内核模块。运行以下命令加载该模块可立即解决问题。
insmod /lib/modules/`uname -r`/kernel/net/netfilter/xt_nat.ko.gz
为了弄清楚到底发生了什么,我决定重启 Pi。xt_nat
模块在启动时加载,并且iptables
仍然正常工作 - 允许添加规则。
因此,尽管我不确定模块是如何卸载的(因为它本来应该在启动时加载),但至少它现在正在工作。理论上,问题现在不应该再次出现,因为当-j DNAT
或-j SNAT
规则存在时,模块无法卸载。