Сетевые технологии
Резервирование сетевых соединений
Поведение NAT при изменении маршрутизации

При использовании NAT на устройствах, имеющих к одному назначению несколько маршрутов (основной и резервные) через разные интерфейсы, необходимо иметь следующую особенность работы NAT в ОС Linux. После того, как поток идентифицирован и для него создана запись NAT, эта запись функционирует независимо от маршрутизации и, соответственно, от текущего выходного интерфейса и его IP-адреса. Если устройство переходит, например, с основного канала Ethernet на резервное сотовое соединение, или наоборот, то процедура NAT не меняется и пакеты начинают уходить в новый интерфейс с адресами, NAT-ированными по-старому, уже не адекватно реальности. В результате пакеты не доходят до назначения, или ответные пакеты не могут вернуться на устройство, и соединение теряется. Например, единожды запущенный ping перестаёт проходить.

Алгоритм работы NAT в ОС Linux предполагает, что эта потеря связи будет обнаружена средствами прикладного уровня (или туннеля — keepalive, echo request/reply, dead peer detection и т.п.) или вручную, после чего прикладное соединение будет переустановлено, идентифицировано механизмом NAT как новый поток, и для него будет создана новая запись NAT. Таким образом, поведение сети с точки зрения её конечной функции — передачи данных — определяется в данном случае особенностями и алгоритмами работы каждого конкретного приложения в отдельности.

Поскольку в первую очередь для проверки доступности узлов сети используется ping, то необходимо особо обратить внимание на его работу в вышеописанной ситуации. NAT идентифицирует пакеты ICMP Echo Request/Echo Reply как поток, основываясь на идентификаторе ping-а (ICMP ID), которое утилита ping вставляет в пакет. В одном запуске утилиты идентификатор во всех пакетах одинаковый. Однако алгоритм его назначения может быть разным в разных реализациях ping, что приводит к существенно различному поведению:

Как можно видеть, в данном случае ping не является достоверным показателем работоспособности сети и судить об успешности переходов на резервный канал и обратно следует исключительно по работе конкретных приложений.

При переключении каналов связи рекомендуется задействовать утилиту conntrack (в скриптах netping или обработчика событий) для полной очистки таблицы NAT. В этом случае для следующего пакета будет создана новая запись и либо работа продолжится (если это допускается приложением — например, ping), либо приложение получит ответ, что пакет принадлежит к несуществующей сессии (с нового IP-адреса и т.п.) и сможет инициализировать новую сессию немедленно, а не по тайм-ауту. Пример:

services
: netping
: : route_swap
........................
: : : failure-script = "ip route del default via 98.76.54.29; conntrack -F;"
: : : restore-script = "ip route add default via 98.76.54.29; conntrack -F;"

Подробно о параметрах данной утилиты см. conntrack --help или соответствующую man page.

Обратно в узел .ip.nat...

© Network Systems Group 2015–2024 Отдел документации