На специальной плате (с ядром 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, что является моей проблемой.
Я искал решение, и, вероятно, он смотрел мне в глаза, но я не смог решить это. Я уверен, что есть простой способ исправить это, поэтому теперь я надеюсь, что кто-нибудь будет так добр, чтобы помочь мне с этим. Я знаю, что должен был сам найти подходящее решение, но почему-то мне его не хватает.