ЛОР, побудь моим личным LARTC :)
Есть линуксовый роутер (ядро 4.14), который обслуживает одну локальную сеть с двумя аплинками от разных провайдеров. Маршруты от провайдеров распиханы по разным таблицам. Таблицы маршрутов и правил выглядят так:
# ip rule
0: from all lookup local
10000: from 192.168.255.2 lookup rtk
10000: from 95.84.198.125 lookup onl
20000: from all to 192.168.255.2/24 lookup rtk
20000: from all to 95.84.198.125/23 lookup onl
32766: from all lookup main
32767: from all lookup default
39999: from 10.196.254.2 lookup onl
40001: from all lookup rtk
90007: from all iif lo lookup onl
90008: from all iif lo lookup rtk
# ip route show table onl
default via 95.84.198.1 dev eth0.2 src 95.84.198.125 metric 100
95.84.198.0/23 dev eth0.2 scope link metric 100
# ip route show table rtk
default via 192.168.255.1 dev eth0.3 metric 110
192.168.255.0/24 dev eth0.3 scope link metric 110
# ip route show table main
10.0.0.0/8 via 10.196.254.2 dev br-lan metric 200 # OpenVPN-сервер
10.196.254.0/24 dev br-lan scope link src 10.196.254.1
Правила 39999-40001 добавлены вручную и задают «дефолтный» аплинк. Остальные сгенерированы OpenWRT. 192.168.255.1 — это своеобразный DMZ (мерзкий двойной NAT, потому что GPON); на самом деле там статический IPv4 128.0.130.85.
В такой конфигурации есть доступ в Интернет из локальной сети, также роутер корректно принимает соединения из Интернета на любом интерфейсе. Но port forwarding не работает: 10.196.254.2 отвечает только на соединения, перенаправленные с 95.84.198.125 (таблица onl), а все остальные хосты — только на соединения с 128.0.130.85. Я подозреваю, что ответные пакеты уходят в дефолтный аплинк для данного хоста, а не в тот, с чьего адреса пришёл запрос.
Вопрос: как это исправить? Без хаков с fwmark.