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

在 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 与互联网通信。

SNAT在尝试允许互联网将流量发送到公共 IP 以到达内部网络上的机器时遇到了这个问题。当这不起作用时,我尝试了更简单的规则,但它们也不起作用。然后我尝试添加DNAT规则并遇到了同样的问题。

我可以将更复杂的规则添加到PREROUTINGand中,POSTROUTING而无需指定-j DNATor -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 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规则存在时,模块无法卸载。

相关内容