Iptables

在 linux 中添加 iptables snat 或 dnat 規則時出錯

  • April 4, 2019

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

當我嘗試向 中添加任何-j SNAT-j DNAT規則時iptables,它不起作用 - 我收到一個錯誤

iptables: No change/target/match by that name

我通常對 iptables 沒有問題。例如,標準INPUTOUTPUT並且FORWARD有很多規則。此外,還POSTROUTING包含一條MASQUERADE執行良好的規則,允許內部 LAN 與 Internet 通信。

SNAT在嘗試允許網際網路將流量發送到公共 IP 以到達內部網路上的機器時遇到了問題。當這不起作用時,我嘗試了更簡單的規則,但它們也不起作用。然後我嘗試添加DNAT規則並遇到了同樣的問題。

我可以將更複雜的規則添加到PREROUTINGandPOSTROUTING而無需指定-j DNATor-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

在 Archxt_nat中預設不載入。

這是固定的:

modprobe xt_nat
echo "xt_nat >> /etc/modules-load.d/iptables.conf"

所以我最終想通了……原來xt_nat需要載入Linux核心模組。執行以下命令來載入該模組立即解決了問題。

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

為了弄清楚發生了什麼,我決定重新啟動 Pi。該xt_nat模組在啟動時載入並且iptables仍然正常工作 - 允許添加規則。

因此,儘管我不確定模組是如何解除安裝的(因為它應該在啟動時載入),但至少它現在可以工作了。-j DNAT理論上,這個問題現在不應該再次出現,因為在or-j SNAT規則存在時無法解除安裝模組。

引用自:https://serverfault.com/questions/822441