IPv6 адреса в облаке Селектел

IPv6 для облачных серверов

Для всех виртуальных машин в пулах Санкт-Петербург (1) и Санкт-Петербург (2) при установке новых виртуальных машин и переустановке существующих поддержка IPv6 включается по умолчанию (и является предпочтительным протоколом для исходящих соединений). IPv4, разумеется, остаётся и работает. Раньше мы IPv6 выдавали, но по умолчанию не включали.

Зачем это нужно? Честно сказать, сейчас львиная доля Интернета работает на ipv4. Отдельные островки живого IPv6 есть в Азии, плюс несколько крупных сайтов (таких, как google.com , vk.com (позор Фейсбуку, у которого IPv6 нет!)) отвечают по IPv6. Домашние пользователи в России практически все работают только по IPv4.
Вот более-менее актуальная информация о том, у кого из провайдеров России есть IPv6: http://version6.ru/isp

Однако, переход на IPv6 должен произойти — и чем больше сайтов будет готово к работе с IPv6, тем легче и спокойнее произойдёт переход, так что это инвестиция в будущее.

Что означает появление IPv6 с практической точки зрения для конкретно взятого облачного сервера?

  • Пользователи сайта, у которых IPv4 как ходили по IPv4 адресам, так ходить и будут;
  • Пользователи, у которых есть IPv6 смогут зайти на IPv6 адрес сервера только если этот адрес прописан в DNS (AAAA-запись);
  • Исходящие соединения с сервера на IPv4-only узлы будут идти с использованием IPv4;
  • Исходящие соединения с сервера на узлы с IPv6 и IPv4 адресами будут идти с использованием IPv6 адресов.

У сервиса облачных серверов есть неофициальное соревнование с сервисом облачного хранилища: у кого будет больше IPv6 трафик. До сегодняшнего дня облачное хранилище выигрывало — но есть надежда перетащить флаг на свою сторону.

Основное, куда пойдёт IPv6 трафик:

  • Службы google
  • mirror.selectel.ru и mirror.yandex.ru (Яндекс включил IPv6 для mirror, но не включил для поиска, увы), да и на остальные мирроры дистрибутивов, которые в большинстве своём поддерживают IPv6;
  • Если вы настроите AAAA запись для домена, то гугловый робот придёт к вам по IPv6. Если у вас есть веб-краулер или fetch на чужие сайты, то он тоже будет предпочитать IPv6.

IPv6 в реальной жизни

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

Ниже рассказ про некоторых из них.

Наличие dual stack означает, что в каждом месте, где у нас явно или неявно (например, исходящие соединения) появляются IPv6 нам надо подумать. Таких мест много — как только у вас появился dual stack, у вас тут же все утилиты (начиная с wget и заканчивая ssh) начинают ходить по IPv6 над ipv4. Иногда молча, иногда молча отваливаясь. Некоторые вполне себе уважаемые компании прописывают себе AAAA для домена, но забывают настроить веб-сервер. Получается казус.

Postgresql и IPv6

PostgreSQL всегда славилась отличным набором типов данных. Начиная от геометрических объектов и заканчивая деньгами. IP-адреса так же в комплекте. Есть два типа: inet и cidr. Оба хранят специальным образом ip-адрес и маску. Разница в том, что inet хранит адрес узла (то есть допустимы ненулевые биты в нулевой зоне под маской), а cidr хранит сети (то есть адреса хостов в нулевой зоне не допустимы). По сути это одно и то же, но если попытаться записать адрес хоста в cidr, будет выдана ошибка из-за того, что условия не выполнены.

Тип один для IPv4 и IPv6. Размерность определяется автоматически.

Допустимые операции: сложение со скаляром, вычитание скаляра, всякого рода сравнения in, not in, перекрывающихся диапазонов, равенства и т.д. В случае с ipv4 это позволяло реализовать всё, что хочешь. Например, если мы делаем распределение ipv4, то мы просто берём max_ipv4 и говорим +1, а потом проверяем, попадает ли это в диапазон разрешённый для выделения.

С IPv6 ситуация другая. Адреса выделяются /64, а в случае выделения маршрутизируемых сетей — /48. Для того, чтобы получить следующую /48 надо взять последнюю выделенную и сделать max_ipv6 + 1208925819614629174706176 (2128-48=280). Всё хорошо, но bigint в postgres — это всего навсего 64-битное число, которое даже 264 хранить не может, не говоря уже про 280. Другими словами, попытка такого «плюса» вызывает ошибку из-за слишком большого размера прибавляемого скаляра. Итого — в postgres полностью сломан механизм управления IPv6 сетями. Наше временное решение — реализация inet/cidr в persist’е (библиоткека haskell для работы с СУБД) и реализация самостоятельной математики. В апстрим проблема зарепочена, решения (по состоянию на 9.2) пока что нет.

Несколько IPv6 на интерфейсе, DAD и nginx

Единственным методом прописать на интерфейсе несколько IPv6 адресов является использовнаие post и pre секций c использованием ifconfig. Адрес на интерфейсе появляется, но не сразу, так как начинает работу DAD — Duplicate address detection. В самом простом изложении компьютер спрашивает «есть у кого мой адрес?» и ждёт ответа. Этот протокол позволяет избежать появления повторяющихся адресов, однако, ifconfig заканчивает свою работу по конфигурированию интерфейса до завершения ожидания в DAD.

В результате, если nginx (или любой другой сервер) имеет настройку на соответствующий адрес, а не на звёздочку, то при попытке сделать там listen, сервер получает ошибку. И не слушает. Это чистой воды гонка условий, которые можно заметить только в процессе загрузки сервера (т.к. в остальных случаях DAD успеет отработать до запуска/перезапуска сервера). Отладка этой проблемы была весьма и весьма неприятной.

Точки в IPv6-адресе

Не верите? Думаете, что только двоеточия?
::192.168.1.1 — валидный IPv6 адрес, хоть и не используется в интернете.

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

Что еще почитать по теме

T-Rex 30 марта 2021

Что такое SMTP-протокол и как он устроен?

SMTP (Simple Mail Transfer Protocol) — протокол передачи почты. Он был представлен еще в 1982 году, но не теряет актуальности до сих пор. В статье разбираемся, какие задачи решает протокол и как он ра…
T-Rex 30 марта 2021
Владимир Туров 1 сентября 2020

Дело совершенно секретного iPod

Это был обычный серый день в конце 2005 года. Я сидел на рабочем месте и писал код для следующей версии iPod. Вдруг без стука ворвался директор ПО для iPod, начальник моего начальника, и закрыл дверь.
Владимир Туров 1 сентября 2020
T-Rex 21 августа 2020

TrendForce: цены на SSD упадут

Эксперты DRAMeXchange предсказывают значительное падение цен на оперативную память и твердотельные накопители в ближайшее время. Причина — сокращение спроса на чипы для NAND и DRAM.
T-Rex 21 августа 2020

Новое в блоге

Михаил Фомин 24 июня 2022

Docker Swarm VS Kubernetes — как бизнес выбирает оркестраторы

Рассказываем, для каких задач бизнесу больше подойдет Docker Swarm, а когда следует выбрать Kubernetes.
Михаил Фомин 24 июня 2022
Ульяна Малышева 30 сентября 2022

«Нулевой» локальный диск. Как мы запустили облако только с сетевыми дисками и приручили Ceph

Чем хороши сетевые диски и почему именно Ceph, рассказал директор по развитию ядра облачной платформы Иван Романько.
Ульяна Малышева 30 сентября 2022
Валентин Тимофеев 30 сентября 2022

Как проходит онбординг сотрудников ИТО? Что нужно, чтобы выйти на смену в дата-центр

Рассказываем, как обучаем новых сотрудников, какие задачи и испытания проходят инженеры прежде, чем выйти на свою первую смену.
Валентин Тимофеев 30 сентября 2022
T-Rex 28 сентября 2022

Книги по SQL: что почитать новичкам и специалистам

Собрали 6 книг, которые помогут на старте изучения SQL и при углублении в тему.
T-Rex 28 сентября 2022