Назад | Перейти на главную страницу

Возвращение NAT-трафика обратно в правильный интерфейс

На специальной плате (с ядром 4.x) у меня есть два физических интерфейса Ethernet и один радиомодем, который дает мне ppp-интерфейс. iproute2 установлен, и я использую nftables (не iptables).

Моя проблема в том, что я хочу перенаправить определенный UDP-трафик (на порты 41000-41002), поступающий по ppp0 или eth0, на конкретный хост, который находится за eth1. Пересылка работает как надо, но мне не удается заставить работать обратный трафик. Вот пример того, как я это настроил:

eth0 has IP 192.168.10.10
eth1 has IP 192.168.100.10
ppp0 has IP 10.10.10.10

Внешний хост, на который я хочу отправлять трафик (и возвращать трафик), имеет IP 192.168.100.1 и физически подключен к той же сети, что и eth1.

Теперь настройка nftables выглядит так:

table ip firewall {
        chain incoming {
                type filter hook input priority 0; policy drop;
                ct state established,related accept
                iifname "lo" accept
                icmp type echo-request accept
                tcp dport { ssh} accept
        }

        chain prerouting {
                type nat hook prerouting priority 0; policy accept;
                iifname "ppp0" udp dport 41000-41002 dnat 192.168.100.1
                iifname "eth0" udp dport 41000-41002 dnat 192.168.100.1
        }

        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                oifname != "lo" masquerade
        }
}

Мои правила маршрутизации для iproute2 выглядят так:

0:      from all lookup local
1000:   from 192.168.100.1 lookup ppproute
2000:   from 10.10.10.10 lookup ppproute
32766:  from all lookup main
32767:  from all lookup default

А таблица ppproute содержит только маршрут по умолчанию через ppp0:

default dev ppp0  scope link

При такой настройке все работает правильно, если входящий трафик поступает через ppp0. Пакеты правильно перезаписываются программой nftables / netfilter и выходят из eth1. Обратный трафик попадает в правило 1000 и возвращается отправителю.

Если трафик входит через eth0, он также попадает на хост 192.168.100.1, как и должен, но обратный трафик также направляется обратно через ppp0, что является моей проблемой.

Я искал решение, и, вероятно, он смотрел мне в глаза, но я не смог решить это. Я уверен, что есть простой способ исправить это, поэтому теперь я надеюсь, что кто-нибудь будет так добр, чтобы помочь мне с этим. Я знаю, что должен был сам найти подходящее решение, но почему-то мне его не хватает.