Протокол IPv4
-
Каждый хост или маршрутизатор имеет уникальный IP-адрес
- IP-адрес назначается интерфейсу
- Хост или маршрутизатор может иметь несколько интерфейсов
-
IP-пакет содержит поля
- Адрес отправителя
- Адрес получателя
-
Маршрутизаторы считывают поля IP-пакета и пересылают пакет друг-другу до тех пор, пока
пакет не достигнет получателя (или истечёт время жизни)
- Маршрут пакета определяется при помощи протоколов маршрутизации (BGP, OSPF и другие)
Исчерпание IPv4 адресов
-
Протокол 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-адреса:
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)
Статический 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 |
*:* |
Фильтр входящих пакетов
Address-Restricted Cone NAT
| Локальный адрес получателя |
Публичный адрес получателя |
Публичный адрес отправителя |
| A:x |
B:y |
C:* |
Фильтр входящих пакетов
Port-Restricted Cone NAT
| Локальный адрес получателя |
Публичный адрес получателя |
Публичный адрес отправителя |
| A:x |
B:y |
C:z |
Фильтр входящих пакетов
Symmetric NAT
| Локальный адрес получателя |
Публичный адрес получателя |
Публичный адрес отправителя |
| A:x |
B:y |
C:z1 |
Фильтр входящих пакетов
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 соединения
- Протокол 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:
- Запрос обратного подключения
- Ретрансляция запроса на обратное подключение
- Обратное подключение
Только один клиент за NAT
Hole Punching
- Метод пробития дырки (hole punching) - метод создания соединения между двумя компьютерами,
находящимися за NAT (RFC3027,
статья)
- Методы для TCP и UDP немного различаются ввиду особенностей протоколов
- Клиенты A и B поддерживают постоянное соединение с посредником - сервером рандеву S
- Клиент при подключении к серверу передает публичный
〈IPPubhost ,
PortPubhost 〉и локальный〈
IPPrivhost ,
PortPrivhost 〉адрес
Процесс создания P2P UDP-соединения
- Клиент A запрашивает помощь у S в установлении соединения с B
- S отвечает A сообщением с публичным и локальным адресом B, также S отправляет B запрос на
установление соединения от A (включая публичный и локальный адрес)
- 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):
- Прямое соединение между узлами
- Наиболее простая и эффективная схема
- Требуются публичные адреса
- Прямое соединение через NAT при помощи hole punching (с использованием STUN)
- Подходит не для всех типов NAT
- Соединение через посредника - 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, но не сейчас