Настроить:

  1. Linux (пробовал на LEDE, OpenWrt, Ubuntu 16)
  2. iptables отключен (модули ядра выгружены)
  3. nftables (пробовал v. 0.8, 0.8.2)
  4. цепочки и 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) или не отброшены. Хоть:

  1. Цепочка пост-маршрутизации обрабатывается, так как, если я удаляю цепочку пост-маршрутизации, dnat (путем предварительной маршрутизации) перестает работать (как и ожидалось).
  2. Добавление правила удаления в цепочки ввода или вывода работает.
  3. Добавление цепочек с type nat hook input/output соответствии с предложением AB по- прежнему не решает проблему.

Итак, как написать правило nftables snat?

0