У меня есть пара хостов с очень плохой маршрутизацией между ними, но у меня есть третий хост, у которого очень хороший пинг для каждого. Чтобы обойти плохую маршрутизацию, я настраиваю третий хост для переброски пакетов между ними.
У этого третьего хоста есть IP-адрес, который больше ни для чего не используется. Моя идеальная конфигурация была бы такой, когда узел 1 отправляет пакет на узел 3, узел 3 автоматически выполняет NAT адреса источника и назначения, заменяя source = host3 и destination = host2, а затем пересылает пакет.
Обратное должно быть истинным: если host2 пытается ответить, пакет должен вернуться на host3, который вернет его через NAT к source = host3, destination = host1. Отслеживание соединения не требуется - это можно делать полностью без сохранения состояния.
Я застрял в том, чтобы заставить DNAT и SNAT работать одновременно. Похоже, что если пакет обрабатывается DNAT, он автоматически помечается для пропуска правил SNAT: DNAT работает нормально, но адрес источника не переводится.
Какова правильная конфигурация iptables для этого?
Странное поведение было связано с CONNTRACK. SNAT и DNAT действительно прекрасно работают вместе, если ничто другое не мешает.
Кроме того, я настроил только SNAT и DNAT в одном направлении. Поскольку трафик проходит постоянно, автоматический обратный перевод SNAT и DNAT позаботится о пути возврата.