Что такое NAT и как работает механизм NAT
Что проверяют
Понимаете ли вы, почему адрес клиента в логах может быть не его адресом, а соединение без активности рвётся молча. Для бэкендера на Go вопрос не про маршрутизаторы, а про поведение сервиса за трансляцией: откуда брать реальный адрес, зачем нужны периодические пинги и как заканчиваются исходящие порты.
Как отвечать
NAT подменяет адреса в проходящих пакетах и запоминает соответствие в таблице состояний. Чаще всего работает вариант с подменой ещё и порта: множество внутренних узлов уходят в сеть под одним публичным адресом, а различаются номером порта источника, поэтому обратный пакет находит своего получателя.
Стоит назвать разновидности: статическая трансляция один в один для сервисов, динамическая из пула адресов и трансляция с портами, которая и стоит почти везде.
Следствия для сервиса:
- Соединение открывается изнутри, входящий пакет без записи в таблице отбрасывается. Отсюда проброс портов, а для прямых соединений между клиентами протокол STUN и ретрансляция через промежуточный сервер, когда трансляция строгая.
- Запись живёт по таймауту, у UDP он короткий. Долгие соединения нужно поддерживать пингами на уровне протокола.
- Адрес источника подменяется, и сервер видит адрес шлюза.
Где спотыкаются
Называют NAT средством защиты. Скрытие адресов это побочный эффект, фильтрует трафик межсетевой экран, а не трансляция; та же внутренняя сеть остаётся уязвимой для всего, что уже попало внутрь.
Берут адрес клиента из соединения, когда перед сервисом стоит прокси, или наоборот безоговорочно верят заголовку с цепочкой адресов. Верить можно только тому, что добавил доверенный узел, и отсчитывать от него, иначе ограничение по адресу подделывается одной строкой заголовка.
Открывают новое соединение на каждый запрос к внешнему сервису. За трансляцией с портами номера источника ограничены и освобождаются не сразу; при заметном потоке они кончаются, и сбои выглядят как случайные сетевые ошибки. Лечится переиспользованием соединений.