Я перестраиваю свой маршрутизатор с помощью 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-байтовая строка). Не должно существовать.
Я не знаю, есть ли какие-либо недостатки, такие как влияние на производительность при сопоставлении, но мне кажется, что это правильное решение.