Iptables
在 linux 中添加 iptables snat 或 dnat 規則時出錯
我在 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 與 Internet 通信。我
SNAT
在嘗試允許網際網路將流量發送到公共 IP 以到達內部網路上的機器時遇到了問題。當這不起作用時,我嘗試了更簡單的規則,但它們也不起作用。然後我嘗試添加DNAT
規則並遇到了同樣的問題。我可以將更複雜的規則添加到
PREROUTING
andPOSTROUTING
而無需指定-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
在 Arch
xt_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
規則存在時無法解除安裝模組。