Я пытаюсь настроить Source Nat Translation (SNAT) через маршрутизируемый многоадресный трафик с Iptables и Smcrouted.
Дело в том, что SNAT не применяется в таких случаях:
Когда трафик маршрутизируется впервые. В этом случае, если я сбрасываю таблицу conntrack с помощью «conntrack -F», в это время применяется SNAT.
При отправке трафика перед запуском Smcrouted. Работает, только если я сбрасываю таблицу conntrack
В обоих случаях, если я перестану отправлять трафик и непроизвольно возобновлю отправку, iptables начнет применять SNAT.
Другими словами, SNAT применяется только тогда, когда я очищаю таблицу conntrack с помощью команды "conntrack -F"
Кто-нибудь знает, почему iptables не применяет SNAT во всем многоадресном маршрутизируемом трафике?
РЕДАКТИРОВАТЬ:
После большого количества тестов я понял, что если запись многоадресного маршрута не находится в / proc / net / ip_mr_cache, SNAT не применяет первый пакет. Следовательно, поскольку это соединение отслеживается, SNAT не работает в дополнительных пакетах.
Если маршруты smcroute определены без IP-адреса источника, запись многоадресного маршрута добавляется в / ip / net / ip_mr_cache только при пересылке первого многоадресного пакета, а SNAT не применяется в этом пакете.
Поискав в коде linux, я нашел этот код в /net/ipv4/route.c
do_cache = true;
if (type == RTN_BROADCAST) {
flags |= RTCF_BROADCAST | RTCF_LOCAL;
fi = NULL;
} else if (type == RTN_MULTICAST) {
flags |= RTCF_MULTICAST | RTCF_LOCAL;
if (!ip_check_mc_rcu(in_dev, fl4->daddr, fl4->saddr,
fl4->flowi4_proto))
flags &= ~RTCF_LOCAL;
else
do_cache = false;
/* If multicast route do not exist use
* default one, but do not gateway in this case.
* Yes, it is hack.
*/
if (fi && res->prefixlen < 4)
fi = NULL;
Я понимаю, что если многоадресный маршрут не найден, ядро не выполняет шлюз для пакета, несмотря на то, что запись маршрута была определена в smcroute.
заранее спасибо