Краткое содержание:
- Новости облака Селектел:
- IPv6 во всех шаблонах включен по умолчанию. Все новые машины устанавливаются с настройками IPv6 и сразу после установки доступны по своему IPv6 адресу.
- В списке шаблонов доступна OpenSUSE 12.3 с ядром Linux 3.7-xen
- Рассказ про практические проблемы, с которыми мы столкнулись при эксплуатации IPv6.
С Suse всё понятно, так что обсудим последствия IPv6.
IPv6 для облачных серверов
Для всех виртуальных машин в пулах Санкт-Петербург (1) и Санкт-Петербург (2) при установке новых виртуальных машин и переустановке существующих поддержка IPv6 включается по умолчанию (и является предпочтительным протоколом для исходящих соединений). IPv4, разумеется, остаётся и работает. Раньше мы IPv6 выдавали, но по умолчанию не включали.
Зачем это нужно? Честно сказать, сейчас львиная доля Интернета работает на ipv4. Отдельные островки живого IPv6 есть в Азии, плюс несколько крупных сайтов (таких, как google.com, vk.com (позор Фейсбуку, у которого IPv6 нет!)) отвечают по IPv6. Домашние пользователи в России практически все работают только по IPv4.
Вот более-менее актуальная информация о том, у кого из провайдеров России есть IPv6: 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 адресов в интерфейсах будут простыми…
Автор: amarao