Информационная безопасность и компьютерные сети

Лекция 5

Network Address Translation

Пономаренко Роман
@rerand0m
rerandom@ispras.ru

Протокол IPv4


Схема передачи пакетов в интернете
  • Каждый хост или маршрутизатор имеет уникальный IP-адрес
    • IP-адрес назначается интерфейсу
    • Хост или маршрутизатор может иметь несколько интерфейсов
  • IP-пакет содержит поля
    • Адрес отправителя
    • Адрес получателя
  • Маршрутизаторы считывают поля IP-пакета и пересылают пакет друг-другу до тех пор, пока пакет не достигнет получателя (или истечёт время жизни)
    • Маршрут пакета определяется при помощи протоколов маршрутизации (BGP, OSPF и другие)

Исчерпание IPv4 адресов


    Подразделения IANA
  • Протокол IPv4 на момент создания:
    • Год публикации 1981
    • Количество ЭВМ измеряется тысячами единиц в мире
  • IP-адрес размером 4 байта - 232 = 4 294 967 296 уникальных
  • Исчерпание пула IPv4 адресов:
    • Январь 2011: IANA выделил последний блок \8
    • Март 2017: RIR исчерпали доступные блоки \8
    • Октябрь 2019: RIPE NCC выделил последний блок \22
    • Ноябрь 2019: RIPE NCC не осталось подсетей (\24) для выделения

NAT - трансляция сетевого адреса


  • IP-адрес - дефицитный ресурс
  • Метод трансляции сетевого адреса ( RFC1631, RFC3022)
    • Организация или домохозяйство получает один IP-адрес
    • Внутри локальной сети каждый хост получает уникальный локальный IP-адрес
    • При выходе из сети локальный адрес отправителя заменяется на публичный
Схема с белыми и серыми ip адресами

Локальные вычислительные сети


Примеры ЛВС:

  • Домашняя сеть
  • Сеть организации
  • Сеть университета

Локальные IP-адреса:

RFC1918, RFC4193, RFC6598

  • 10.0.0.0/8 (1996)
  • 100.64.0.0/10 (2012)
  • 172.16.0.0/12 (1996)
  • 192.168.0.0/16 (1996)
  • fc00::/7 (IPv6, 2005)
Схема с белыми и серыми ip адресами

Статический NAT


  • Отображение локальных адресов к глобальным 1:1
  • Хосты в локальной сети могут быть доступны извне
  • Требуется достаточное количество публичных IP-адресов
Публичный адрес Локальный адрес
61.200.65.1
61.200.65.2
192.168.0.1
192.168.0.2

Таблица трансляции

Статическая трансляция адресов

Динамический NAT


  • Отображение локальных адресов к глобальным 1:1
  • Хосты получают публичный IP-адрес из пула не выделенных адресов
Локальный адрес Публичный адрес
192.168.0.1
Не выделен
61.200.65.1
61.200.65.2

Таблица трансляции

Динамическая трансляция адресов

NAPT - трансляция сетевых адресов и портов


  • Отображение глобальных адресов к локальным 1:*
  • В заголовке IP-пакета нет свободного места для локального адреса отправителя
    • Изменять формат заголовка нельзя для сохранения обратной совместимости
  • Большая часть полезной нагрузки IP-пакетов - TCP и UDP
    • Сетевое соединение определяется четверкой:
      〈IPhost , Porthost , IPserv , Portserv
  • NAPT транслирует не только IP-адрес отправителя, но и порт отправителя
    • Идентификаторы соединения сохраняются в таблице трансляции
    • Один публичный адрес может быть использован для 216 сетевых соединения (фактически меньше)

NAPT - схема


Локальный адрес отравителя Локальный адрес получателя Публичный адрес отправителя Публичный адрес получателя
192.168.0.1:6458
192.168.0.2:13151
83.149.199.48:443
66.254.114.41:80
61.200.65.1:7813
61.200.65.1:4362
83.149.199.48:443
66.254.114.41:80

Таблица трансляции

Схема трансляции с использованием портов

NAPT - особенности


Преимущества:

  • Один публичный адрес для нескольких машин в локальной сети
  • Не требуется поддержка NAPT на машине

Недостатки:

  • Нарушается ключевой принцип протокола IP - уникальный адрес для каждой машины
  • Нарушается ключевой принцип стека протоколов - независимость уровней друг от друга
  • Сетевое соединение может быть инициировано только из локальной сети
  • При сбое в NAPT-блоке разрушаются все активные соединения
  • Транспортные протоколы ограничены TCP или UDP
  • Машина в локальной сети не знает свой публичный адрес

NAT в домашнем роутере


Скриншот панели управления роутером

Таблица трансляции в домашнем роутере

*реклама МГТС отключена за неуплату

Типы трансляции


  • Исходящие из локальной сети пакеты
    • В таблицу трансляции добавляется запись ассоциации локального и публичного адреса отправителя:
      〈IPPrivhost , PortPrivhost , IPserv , Portserv 〉 → 〈 IPPubhost , PortPubhost , IPserv , Portserv
    • Разрешаются ответные пакеты от получателя (обмен адресов отправителя и получателя):
      〈IPserv , Portserv , IPPubhost , PortPubhost 〉 → 〈 IPserv , Portserv , IPPrivhost , PortPrivhost
  • Входящие из глобальной сети пакеты

Full Cone NAT


Локальный адрес получателя Публичный адрес получателя Публичный адрес отправителя
A:x B:y *:*

Фильтр входящих пакетов

Full cone NAT scheme

Address-Restricted Cone NAT


Локальный адрес получателя Публичный адрес получателя Публичный адрес отправителя
A:x B:y C:*

Фильтр входящих пакетов

Address-Restricted cone NAT scheme

Port-Restricted Cone NAT


Локальный адрес получателя Публичный адрес получателя Публичный адрес отправителя
A:x B:y C:z

Фильтр входящих пакетов

Address-Restricted cone NAT scheme

Symmetric NAT


Локальный адрес получателя Публичный адрес получателя Публичный адрес отправителя
A:x B:y C:z1

Фильтр входящих пакетов

Address-Restricted cone NAT scheme

1 - возможны различные типы

Различия Cone и Symmetric NAT


Различия обусловлены особенностями отображения портов и адресов

Для множества соединений

〈IPPrivhost , PortPrivhost , IPserv , Portserv

может использоваться один

〈IPPubhost , PortPubhost

Для каждого соединения

〈IPPrivhost , PortPrivhost , IPserv , Portserv

генерируется уникальный

〈IPPubhost , PortPubhost

Отображение адресов и портов


  • Endpoint-Independent Mapping
    B : y = B : v при любом C : z и D : w
  • Address-Dependent Mapping
    B : y = B : v , если C = D
  • Address and Port-Dependent Mapping
    B : y = B : v , если C : z = D : w

RFC4787

Проброс портов


  • Проброс портов (port forwarding ) или PAT (Port Address Translation) - поддержание постоянного отображения 〈IPPrivhost , PortPrivhost 〉↔〈 IPPubhost , PortPubhost 〉 для прохождения сетевого трафика через шлюз (роутер, межсетевой экран и прочее)
  • Функция проброса портов используется для предоставления доступа к сервисам в локальной сети извне:
    • Запуск публичного HTTP или игрового сервера
    • Предоставление SSH или FTP доступа
  • Данный функционал реализуется не только сетевыми устройствами, но и такими приложениями как SSH
    • Local TCP forwarding
    • Remote TCP forwarding

Трансляция TCP соединений


tcp states

Наблюдаемые состояния TCP соединения

  • Протокол TCP имеет состояния, переходы между которыми запускаются специальными флагами в заголовке (SYN, ACK, FIN и прочие)
  • NAT отслеживает переходы между состояниями и определяет момент инициализации и закрытия соединения
  • NAT своевременно удаляет созданные отображения адресов из таблицы трансляции

Трансляция UDP соединений


  • Протокол UDP не имеет состояний
    • Следовательно, NAT не имеет возможности определять инициацию и завершение состояния
  • NAT поддерживает таблицу таймаутов для каждого соединения
    • При каждой трансляции пакета NAT обновляет время последней трансляции для данного соединения
    • При обнаружении записи, с момента последней трансляции которой прошло более заданного таймаута, отображение адресов удаляется из таблицы трансляции
  • Отсутствует общепризнанный стандарт, регулирующий поведение NAT-устройства, возможны различные стратегии поведения как для различных производителей, так и для различных моделей одного производителя
    • IETF рекомендует 600 секунд для UDP
    • IETF рекомендует 124 минуты для TCP

Таймауты


Значения таймаутов NAT в домашних устройствах

  • Минимальный выявленный таймаут для двухстороннего UDP-трафика 54 секунды
  • Половина устройств закрывают отображение для TCP-соединения через 1 час

Hätönen S. et al. An experimental study of home gateway characteristics // Proceedings of the 10th ACM SIGCOMM conference on Internet measurement. – 2010. – С. 260-266.

NAT Traversal


  • NAT Traversal - метод установления и поддержания сетевого соединения через NAT
    • P2P взаимодействия: обмен файлами, чаты, VoIP и прочее
  • Большая часть методов использует посредника для:
    • Установления соединения
    • Ретрансляции

Возможные схемы NAT при P2P


Один за NAT

Оба за NAT

Каскад NAT

Реверсирование соединения


  • Клиенты A и B поддерживают постоянное соединение с сервером рандеву S
  • Если A хочет установить соединение с B, то это можно сделать напрямую
  • Если B хочет установить соединение с A:
    1. Запрос обратного подключения
    2. Ретрансляция запроса на обратное подключение
    3. Обратное подключение

Только один клиент за NAT

Hole Punching


  • Метод пробития дырки (hole punching) - метод создания соединения между двумя компьютерами, находящимися за NAT (RFC3027, статья)
    • Методы для TCP и UDP немного различаются ввиду особенностей протоколов
  • Клиенты A и B поддерживают постоянное соединение с посредником - сервером рандеву S
    • Клиент при подключении к серверу передает публичный 〈IPPubhost , PortPubhost 〉и локальный〈 IPPrivhost , PortPrivhost 〉адрес

Процесс создания P2P UDP-соединения


  1. Клиент A запрашивает помощь у S в установлении соединения с B
  2. S отвечает A сообщением с публичным и локальным адресом B, также S отправляет B запрос на установление соединения от A (включая публичный и локальный адрес)
  3. A и B начинают отправлять друг-другу пакеты с заданной периодичностью одновременно на публичный и локальный адрес
    • Первый пакет "пробьет дырку" в NAT отправителя
    • Если получатель успел сделать "дырку" в NAT своим исходящим пакетом, то пакет пройдет через NAT получателя и достигнет получателя
    • Если получатель не успел пробить "дырку" в NAT своим исходящим пакетом, то соединение будет установлено пакетом другой стороны, который создаст "дырку" в своем NAT и пройдет через созданную ранее "дырку" в другом NAT

Клиенты за общим NAT


Создание UDP-соединения между машинами, находящимися за одним NAT

Клиенты за разными NAT


Создание UDP-соединения между машинами, находящимися за разными NAT

Клиенты за каскадом NAT


Создание UDP-соединения между машинами, находящимися за несколькими уровнями NAT1

1 - В данном случае задействован NAT Hairpin

Особенности реализации TCP Hole Punching


  • Ограничения TCP сокетов со стандартными параметрами
    • Требуется несколько соединений из одного порта: A ↔ BPub , A ↔ BPriv , A ↔ S
    • Требуется "слушать"и подключаться из одного сокета
  • Ограничения можно обойти запуском сокета с параметром SO_REUSEADDR (для Linux) или SO_REUSEADDR + SO_REUSEPORT (для BSD)

Особенности реализации TCP Hole Punching


  • Возможность устанавливать множественные соединения через одно отображение
    • Через отображение 〈IPPrivhost , PortPrivhost 〉 ↔ 〈 IPPubhost , PortPubhost 〉 требуется обеспечить возможность соединения с несколькими сторонними адресами 〈IPiserv , Portiserv 〉 (трансляция типа Cone NAT )
    • Создание соединения через трансляцию типа Symmetric NAT возможно только если определен механизм выбора номера внешнего порта для отображения
  • Сброс непредвиденных TCP SYN-пакетов без отправки TCP RST или ICMP пакетов
    • Явное уведомление об ошибке через отправку соответствующего пакета может помешать процессу установления P2P TCP-соединения
  • Поддержка NAT Hairpin (loopback) - обработки пакетов, полученных из локальной сети и направляющихся в локальную сеть с использованием публичных адресов

NAT Traversal


STUN

Session Traversal Utilities for NAT - протокол, позволяющий устройству определить свой публичный IP-адрес

Определение публичных IP-адресов необходимо для создания P2P соединения

TURN

Traversal Using Relays around NAT - протокол, позволяющий серверу ретранслировать сообщения между устройствами

Если невозможно создать P2P соединение между устройствами, TURN позволяет создать соединение через посредника

Session Traversal Utilities for NAT (RFC5389)


  • Клиент-серверная архитектура, транспортный протокол UDP (порт 3478)
  • Позволяет определить:
    • Публичный IP-адрес и порт
    • Тип NAT (4 базовых)
  • Для определения типа NAT на STUN-сервер отправляется серия пакетов через разные соединения

Алгоритм определения типа NAT протокола STUN

Traversal Using Relays around NAT (RFC5766)


  • Клиент-серверная архитектура - узел за симметричным NAT подключается к TURN-серверу и настраивает ретрансляцию
    • Узел использует адрес TURN-сервера как свой публичный адрес при P2P соединении
  • Транспортный протокол:
    • От TURN-клиента к TURN-серверу: UDP, TCP, TLS-over-TCP
    • От TURN-сервера к узлу: UDP

Лучшие практики P2P


Для организации надежного и гарантированного P2P соединения используется оптимальный способ связи (ICE):

  1. Прямое соединение между узлами
    • Наиболее простая и эффективная схема
    • Требуются публичные адреса
  2. Прямое соединение через NAT при помощи hole punching (с использованием STUN)
    • Подходит не для всех типов NAT
  3. Соединение через посредника - TURN-сервер
    • Универсальная схема, работоспособность гарантирована
    • Нагрузка на TURN-сервер, увеличивается задержка передачи

Протоколы управления отображением в сетевых шлюзах


Существует ряд протоколов взаимодействия с NAT-устройствами, позволяющих управлять отображением сетевых соединений:

  • Запросить или удалить отображение через определенный порт
  • Запросить текущий публичный IP-адрес
  • Получить список действующих отображений
  • Назначить таймауты для отображений

UPnP IGD и NAT-PMP


Internet Gateway Device Protocol (RFC6970)

  • Является частью стандартов ISO/IEC и IETF, поддерживается значительным числом вендоров
  • Динамическое обнаружение службы посредством протокола SSDP
  • Использует SOAP для обмена сообщениями
  • Без аутентификации

Port Mapping Protocol (RFC6886)

  • Был представлен Apple в 2005 как альтернатива UPnP IGD
  • Бинарный заголовок поверх UDP
  • Используется порт 5351
  • Без аутентификации (стоит отключить)
  • Был заменен протоколом PCP (Port Control Protocol) в 2013

NAT в домашнем маршрутизаторе


UPnP и PMP в домашнем роутере

*реклама МГТС отключена за неуплату

Каскадный NAT


GPON, МГТС

$ tracepath -n ispras.ru
1: 192.168.1.254           1.587ms
2: 10.144.0.1              6.856ms
3: 212.188.1.106           7.896ms
4: 212.188.1.105           8.973ms
5: 212.188.28.150          8.725ms
6: 195.34.53.204           5.808ms
7: 212.188.33.181          8.416ms
8: 194.190.255.46          7.557ms
9: 83.149.192.43           8.340ms

Carrier-grade NAT


Требования к CGN:

  • Высокая производительность (миллионы параллельных соединений) и масштабируемость
  • Отказоустойчивость
  • Протоколирование
  • Низкий CAPEX/OPEX на абонента

Поддержка различных сценариев:

  • Нехватка публичных IPv4 адресов: NAT444, NAT64, PNAT, IVI, NAT-PT, ..
  • Внедрение IPv6: 6RD, DS-LITE, 6PE, 6to4, ..

Cisco ASR1009-X

IPv6

IPv6

IPv6

IPv6

IPv6

IPv6

Краткие итоги

  • NAT позволил замедлить исчерпание пулов IPv4 адресов
  • Под NAT, чаще всего имеется ввиду NAPT
  • I NAT различается по своим свойствам
    • 4 базовых типа: 3 вида Cone, Symmetric
    • Основные параметры: фильтр, отображение
  • Обход NAT требуется для P2P соединений
    • Метод hole punching работает не для всех типов NAT
    • STUN позволяет получить публичный IP-адрес
    • TURN позволяет ретранслировать сообщения при проблемных типах NAT
    • На практике используется гибридный подход
  • Операторский NAT сложный и многообразный
  • IPv6 спасет нас от NAT, но не сейчас