Есть стационарник с тремя сетевыми картами для раздачи инета. Задача "одна карточка на LAN (192.168.0.0/24, 192.168.0.1 адрес шлюза), вторая на WAN" уже давно и успешно решена. Ручная адресация, шлюз и ДНС-сервер у клиентов указаны как 192.168.0.1.
Захотелось мне в виртуалке (virtualbox) поднять дополнительного провайдера и тупо переводить в нужный момент все обращения клиентов со 192.168.0.1 на 192.168.0.20, сделав мосты к карточке LAN (и сделав адресом второго шлюза 192.168.0.20) и второй WAN. С матюками по трём руководствам чёртов билайн в виртуалке поднялся, перестав вешать систему наглухо через минуту после работы. Обмен пакетами между LAN и виртуальным шлюзом тоже замечательно проходит, локально со шлюза в интернет выпускает (проверено выходом в инет с помощью lynx)
Дальше вроде всё просто:
на основном шлюзе днатим клиента (например 192.168.0.2) на второй шлюз, #iptables -t nat -A PREROUTING -s 192.168.0.2 -j DNAT --to-destination 192.168.0.20
...а на резервном #echo 1 > /proc/net/ipv4/ip_forward; iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
И вот вроде бы клиент, обращающийся к основному шлюзу, должен прозрачно вылетать в инет через резервный, но не пускает. Мало того: после dnata на хосте (основном шлюзе) пакеты приходят, конечно, на второй шлюз, но приходят без подменённого адреса получателя:
17:07:13.124009 IP 192.168.0.2.33513 > 192.168.0.1.domain: 19413+ A? database.clamav.net. (37)
И ответы на попытки пингования внешних ресурсов приходят также от шлюза (192.168.0.20), а не от собственно ресурса.
Хост -- ubuntu 14.04 desktop, резервный шлюз -- ubuntu 16.04 server, доставлено ядро 4.6 с ubuntu kernel ppa, iptables ванильные и там, и там, xl2tpd для билайна поставлен из репозиториев.
ЧЯДНТ?