Переведите исходный адрес всех пакетов, покидающих определенный интерфейс, с помощью nftables
Я использую виртуальную машину Ubuntu Server 18-04 на хосте Zorin.
Я хочу перевести исходный адрес всех пакетов, отправляемых через enp0s3, в 192.168.1.120 с помощью nftables. Вот что я сделал:
apt install nftables
modprobe nft_nat
modprobe nft_chain_nat_ipv4
nft add table nat
nft add chain nat post { type nat hook postrouting priority 0 \; }
nft add chain nat pre { type nat hook prerouting priority 0 \; }
nft add rule nat postrouting oif enp0s3 snat to 192.168.2.120
Я получил:
Error: Could not process rule: No such file or directory
Согласно этому посту здесь
"Примечание. Возможно, вам придется создать /etc/modules-load.d/nftables.conf со всеми модулями, относящимися к nftables, которые требуются в качестве записей для правильной работы службы systemd. Вы можете получить список модулей, используя эту команду: $ lsmod | grep '^nf' В противном случае вы можете получить страшную ошибку: не удалось обработать правило: нет такого файла или каталога."
Вывод $ lsmod | grep '^ nf' это:
nft_chain_nat_ipv4 16384 2
nf_conntrack_ipv4 16384 1
nf_defrag_ipv4 16384 1 nf_conntrack_ipv4
nf_nat_ipv4 16384 1 nft_chain_nat_ipv4
nft_nat 16384 0
nf_nat 32768 2 nft_nat,nf_nat_ipv4
nf_conntrack 131072 4
nft_nat,nf_conntrack_ipv4,nf_nat_ipv4,nf_nat
nf_tables_inet 16384 4
nf_tables_ipv6 16384 1 nf_tables_inet
nf_tables_ipv4 16384 2 nf_tables_inet
nf_tables 90112 5
nft_nat,nft_chain_nat_ipv4,nf_tables_ipv6,nf_tables_ipv4,nf_tables_i$
nfnetlink 16384 1 nf_tables
Я вырезал и вставил это в /etc/modules-load.d/nftables.conf
Файл без успеха.
Кто-нибудь знает, как я могу решить эту ошибку?
РЕДАКТИРОВАТЬ:
Я изменил порядок, добавил цепочки, сначала я добавил цепочку "pre", а затем цепочку "post". Теперь я получаю другую ошибку:
nft add rule nat postrouting oif eno1 snat to 192.168.2.120
<cmdline>:1:40-41: Error: syntax error, unexpected to
add rule nat postrouting oif eno1 snat to 192.168.2.120
^^
Эта ошибка кажется мне странной, так как я получил этот синтаксис для man-страницы nftables:
Использование операторов NAT
создать подходящую таблицу / цепочку для всех последующих примеров
добавить таблицу nat добавить цепочку nat prerouting { type nat hook prerouting priority 0; } добавить цепочку nat postrouting { type nat hook postrouting priority 100; }
переводить исходные адреса всех пакетов, отправляемых через eth0, в адрес 1.2.3.4
добавить правило nat postrouting ethif snat в 1.2.3.4
2 ответа
Хорошо, я понял это.
"postrouting" - это не крючок, а название цепочки. Поскольку моя цепочка была названа "пост", правильный синтаксис:
nft add rule nat post oif enp0s3 snat to 192.168.2.120
Правило должно быть nft добавить правило nat post "адрес подсети enp0s3" snat в 192.168.2.120
Пример адреса подсети enp0s3 может быть похож на 10.4.0.1/16