Два сервака имеют белые адреса, связал их через GRE туннель. Один сервер является шлюзом, который форвардит диапазон портов через туннель на второй сервер. На втором сервере приложения слушают и tcp и udp. На втором серваке маркирую пакеты, которые эти приложения выплёвывают и отправляю обратно в туннель. TCP трафик ходит как нужно, а вот с UDP какой-то прикол.
На сервере-шлюзе в tcpdump видно следующее:
Входящий tcp пакет пришёл на 100.100.100.100:31000 ушёл в туннель на 10.10.10.2:31000, вернулся из туннеля имея источник 10.10.10.2:31000, получает маскарад, становится 100.100.100.100:31000 и улетает клиенту, всё хорошо.
Udp пакет в свою очередь приходит на 100.100.100.100:31000, получает форвард в туннель на 10.10.10.2:31000, а возвращается из туннеля с источником 200.200.200.200:31000, получает маскарад и становится 100.100.100.100:рандомный_порт, соответственно клиент не получает в ответ ничего, потому что не ждёт рандомный порт.
Ниже накидал +- схему, все правила для tcp и udp одинаковые.
Подскажите, куда жмать, чтобы всё работало?? А лучше объясните, почему так происходит: изменяется sport после маскарада, и из туннеля возвращается пакет с saddr другого интерфейса. Полагаю, что-то с conntrack связанное, но я не знаю, как гуглить даже