Я использую Arch Linux (32-разрядный version) на Raspberry Pi 3.
Когда я пытаюсь добавить какие-либо правила -j SNAT
или -j DNAT
в iptables
, это не работают - я получаю сообщение об ошибке
iptables: No change/target/match by that name
Обычно у меня нет проблем с iptables. Например, для стандартных INPUT
, OUTPUT
и FORWARD
есть множество правил. Кроме того, POSTROUTING
содержит правило MASQUERADE
, которое нормально работает, позволяя внутренней локальной сети взаимодействовать с Интернетом.
Я столкнулся с проблемой SNAT
, когда пытался разрешить Интернету отправлять трафик на общедоступный IP-адрес для доступа к машине во внутренней сети. Когда это не помогло, я попробовал более простые правила, и они тоже не сработали. Затем я попытался добавить правила DNAT
и столкнулся с той же проблемой.
Я могу добавить свои более сложные правила в PREROUTING
и POSTROUTING
без указания -j DNAT
или -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"
Итак, в конце концов я понял это .... оказывается, что модуль ядра Linux xt_nat
должен быть загружен. Выполнение следующей команды для загрузки этого модуля немедленно устранило проблему.
insmod /lib/modules/`uname -r`/kernel/net/netfilter/xt_nat.ko.gz
Чтобы попытаться выяснить, что происходит, я решил перезагрузить Pi. Модуль xt_nat
загружался при загрузке и iptables
все еще работал должным образом - разрешая добавление правил.
Поэтому, хотя я не уверен, как модуль был выгружен (поскольку он уже должен был загружаться во время загрузки), по крайней мере, он работает Сейчас. Теоретически проблема не должна возникать сейчас, потому что модуль не может быть выгружен, пока существует правило -j DNAT
или -j SNAT
s.