ADG Оставить заявку
Блог Инфраструктура 5 мин чтения

Сети: первое знакомство с IPv6 через 6in4-туннель на пограничном роутере

Провайдер предложил тестовый IPv6-туннель. Поднимаем 6in4 на пограничном маршрутизаторе, смотрим на двойной стек и пробуем понять, зачем это нужно прямо сейчас.

Контекст момента

IANA распределяет региональным реестрам последние крупные блоки IPv4; провайдеры начинают осваивать IPv6 в 2006 году, создавая туннельную инфраструктуру

Провайдер написал письмо с предложением поучаствовать в тестировании IPv6-подключения. Туннель, бесплатно, нужна только обратная связь. Мы согласились - не потому что клиенты требуют, а потому что не хочется разбираться с этим в авральном режиме, когда потребуется.

Разбираемся спокойно.

Зачем вообще

IPv4-адресов становится меньше. IANA регулярно выдаёт блоки региональным реестрам - RIPE, ARIN, APNIC, - и на горизонте конца десятилетия вырисовывается неприятная картина: свободных блоков становится заметно меньше. Крупные провайдеры это видят и начинают готовиться. Наш в том числе.

IPv6 решает проблему пространства адресов радикально: 128-битные адреса дают запас, который трудно представить в практических единицах. Но переход нельзя сделать мгновенно - старые устройства, старые приложения, старые конфиги. Отсюда идея двойного стека: узел одновременно работает по IPv4 и IPv6, пока всё постепенно мигрирует.

Туннелирование - промежуточный вариант для тех, у кого нет нативного IPv6 от провайдера. Провайдер даёт тебе точку с IPv6 через IPv4-туннель, ты заворачиваешь в него IPv6-трафик. Именно это нам и предложили.

Механика 6in4

Протокол называется 6in4 - IPv6-пакеты инкапсулируются в IPv4 с protocol number 41. Никакого UDP, никакого дополнительного заголовка: чистый IPv4 с полезной нагрузкой в виде IPv6. Провайдер даёт два адреса: его конец туннеля (IPv4) и наш конец туннеля, плюс /48 или /64 из своего IPv6-пространства для нашей сети.

На пограничном маршрутизаторе под Linux конфигурация выглядит примерно так:

# Создаём туннельный интерфейс
ip tunnel add sit1 mode sit remote <ipv4-провайдера> local <наш-ipv4>
ip link set sit1 up

# Вешаем наш IPv6-адрес конца туннеля
ip -6 addr add <наш-ipv6-туннель>/128 dev sit1

# Маршрут по умолчанию для IPv6 - через туннель
ip -6 route add ::/0 via <ipv6-провайдера> dev sit1

sit - это Simple Internet Transition, старый линуксовый механизм для инкапсуляции. Интерфейс поднимается мгновенно, маршрут встаёт, и теоретически всё работает.

На практике первые 20 минут у нас ничего не пинговалось. Причина оказалась банальной: входящий IPv4-трафик с protocol 41 надо явно разрешить на файрволе. Правило iptables не пропускало инкапсулированные пакеты от провайдера, потому что в наших шаблонах такого протокола не было - только tcp, udp, icmp.

Двойной стек изнутри

После того как туннель заработал, картина стала интересной. Машины с Linux (и Windows XP с установленным IPv6-стеком) получили глобальные IPv6-адреса через router advertisement. Без DHCP - RA сам раздаёт префикс, и хосты формируют адрес по EUI-64 из MAC-адреса.

Пара наблюдений.

Первое - адресов много, но неудобно. IPv6-адрес типа 2001:db8:1234:abcd:020d:56ff:fe78:9abc читается плохо и запоминается никак. DNS становится не опцией, а необходимостью. Проверять связь через ping6 без имён - занятие для терпеливых.

Второе - MTU ломает то, что ты не ожидаешь. Туннель добавляет 20 байт IPv4-заголовка к каждому IPv6-пакету. Если внешний интерфейс имеет MTU 1500, то через туннель IPv6-пакеты должны быть не больше 1480. Часть хостов об этом не знала, и крупные пакеты тихо терялись - соединения устанавливались, а файлы не передавались. Решается через ip link set sit1 mtu 1480 и ICMPv6 Path MTU Discovery, но до этого нужно дойти.

Третье - мониторинг слепой. Cacti смотрит на SNMP нашего роутера и видит трафик через sit1 как неизвестный интерфейс. Нормально - добавили вручную, но это напомнило, что инструменты нужно проверять каждый раз при введении нового типа интерфейса.

Что с приложениями

Ни одно клиентское приложение IPv6 у нас сейчас не требует. Браузеры работают по IPv4. Почта - по IPv4. 1С - само собой. Внешние сервисы, с которыми интегрируем системы клиентов, IPv6 не поддерживают - это видно сразу, когда делаешь dig AAAA для их доменов и получаешь пусто.

Это нормально. Смысл текущего упражнения не в том, чтобы перевести что-то на IPv6, а в том, чтобы понять механику. Когда придёт настоящая задача - настроить двойной стек для клиента, выдать IPv6 в офисной сети, разобраться с BGP-анонсами - хотелось бы не сталкиваться с базовыми вещами впервые.

Где зарыто

Несколько вещей, которые сразу не очевидны при работе с туннелем.

Firewall на обоих уровнях. IPv6-трафик проходит через ip6tables, а не через iptables. Это отдельный набор правил. Если вы, как и мы, привыкли к iptables-конфигу - придётся выстроить параллельный. Часть команды об этом не думала, и в какой-то момент IPv6 из внутренней сети ходил наружу без всякой фильтрации.

Router Advertisement и безопасность. RA работает без аутентификации. Любой хост в сегменте может отправить RA и начать раздавать свой префикс остальным. В нашей тестовой среде это не проблема, но в реальной сети с незнакомыми хостами - потенциальная дыра.

Privacy extensions. Windows XP с IPv6-стеком по умолчанию включает privacy extensions (RFC 3041) - временные адреса, которые меняются. С одной стороны, хорошо для пользователей. С другой - в логах сервера один хост появляется под разными адресами, и понять что происходит труднее.

Туннель работает, двойной стек поднят, IPv6-пинги до внешних узлов ходят. На этом пока останавливаемся - смотреть не на что, потому что трафика нет. Вернёмся к теме, когда появится реальная причина.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.