Назад | Перейти на главную страницу

Iptables SNAT не применяется в многоадресном маршрутизируемом трафике

Я пытаюсь настроить Source Nat Translation (SNAT) через маршрутизируемый многоадресный трафик с Iptables и Smcrouted.

Дело в том, что SNAT не применяется в таких случаях:

В обоих случаях, если я перестану отправлять трафик и непроизвольно возобновлю отправку, 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.

заранее спасибо