Настроить:
- Linux (пробовал на LEDE, OpenWrt, Ubuntu 16)
- iptables отключен (модули ядра выгружены)
- nftables (пробовал v. 0.8, 0.8.2)
цепочки и NAT создаются в соответствии с официальной вики nftables:
% nft add table nat % nft add chain nat prerouting { type nat hook prerouting priority 0 \; } % nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
С помощью этой установки, dnat функционирует, как ожидается, например:
% nft add rule nat prerouting tcp dport 15000 dnat 192.168.0.50:20000
перенаправляет все входящие TCP-пакеты с порта 15000 на 192.168.0.50:20000 и обратно.
Однако правило snat не обрабатывается (и не правило):
% nft add rule nat postrouting counter ip saddr 192.168.0.50 snat 1.2.3.4
% nft add rule nat postrouting counter tcp sport 20000 snat 1.2.3.4:1234
% nft add rule nat postrouting counter ip protocol tcp drop
Я пробовал эти правила по отдельности или в вариациях (oif, ip+tcp, ...) - пакеты все еще проходят без изменений (доказано WireShark) или не отброшены. Хоть:
- Цепочка пост-маршрутизации обрабатывается, так как, если я удаляю цепочку пост-маршрутизации, dnat (путем предварительной маршрутизации) перестает работать (как и ожидалось).
- Добавление правила удаления в цепочки ввода или вывода работает.
- Добавление цепочек с
type nat hook input/output
соответствии с предложением AB по- прежнему не решает проблему.
Итак, как написать правило nftables snat?