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

nftable правила становятся недействительными при повторном подключении (VDSL, ppp0)

Я перестраиваю свой маршрутизатор с помощью nftables на debian jessie. У меня есть рабочая настройка до того момента, когда мой интернет-провайдер решит переназначить новый IP-адрес в глобальной сети, повторно подключив мой DSL-канал. После такого переподключения у самого роутера есть онлайн-соединение, но маскировка больше не работает.

Настройка nftable перед повторным подключением:

# nft list table nat
table ip nat {
    chain prerouting {
            type nat hook prerouting priority 0; policy accept;
    }

    chain postrouting {
            type nat hook postrouting priority 100; policy accept;
            oif ppp0 masquerade
    }
}

Настройка nftable после переподключения:

# nft list table nat
table ip nat {
    chain prerouting {
            type nat hook prerouting priority 0; policy accept;
    }

    chain postrouting {
            type nat hook postrouting priority 100; policy accept;
            oif 8 masquerade
    }
}

Поэтому я предполагаю, что время простоя ppp0 во время повторного подключения приводит к тому, что связанные правила являются своего рода неназначенный. Повторное применение правил nft вручную (flush + add) решает эту проблему до следующего повторного подключения.

Как я могу гарантировать, что временно отключенные правила будут автоматически переназначены для ppp0 после восстановления соединения?

Я наконец понял, как решить эту проблему.

# nft list table nat
table ip nat {
    chain prerouting {
        type nat hook prerouting priority 0; policy accept;
    }

    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        oifname "ppp0" masquerade
    }
}

Вам просто нужно использовать iifname/oifname "ppp0" вместо того oif/iif ppp0. Последний адресует интерфейс по строке, а не по идентификатору интерфейса. Цитаты необязательны, но я думаю, что они хорошо подчеркивают различную интерпретацию.

На странице просто сказано:

Введите ifname: имя интерфейса (16-байтовая строка). Не должно существовать.

Я не знаю, есть ли какие-либо недостатки, такие как влияние на производительность при сопоставлении, но мне кажется, что это правильное решение.