- PVSM.RU - https://www.pvsm.ru -
Краткое содержание:
С Suse всё понятно, так что обсудим последствия IPv6.
Для всех виртуальных машин в пулах Санкт-Петербург (1) и Санкт-Петербург (2) при установке новых виртуальных машин и переустановке существующих поддержка IPv6 включается по умолчанию (и является предпочтительным протоколом для исходящих соединений). IPv4, разумеется, остаётся и работает. Раньше мы IPv6 выдавали, но по умолчанию не включали.
Зачем это нужно? Честно сказать, сейчас львиная доля Интернета работает на ipv4. Отдельные островки живого IPv6 есть в Азии, плюс несколько крупных сайтов (таких, как google.com, vk.com (позор Фейсбуку, у которого IPv6 нет!)) отвечают по IPv6. Домашние пользователи в России практически все работают только по IPv4.
Вот более-менее актуальная информация о том, у кого из провайдеров России есть IPv6: version6.ru/isp [1]
Однако, переход на IPv6 должен произойти — и чем больше сайтов будет готово к работе с IPv6, тем легче и спокойнее произойдёт переход, так что это инвестиция в будущее.
Что означает появление IPv6 с практической точки зрения для конкретно взятого облачного сервера?
У сервиса облачных серверов есть неофициальное соревнование с сервисом облачного хранилища: у кого будет больше IPv6 трафик. До сегодняшнего дня облачное хранилище выигрывало — но есть надежда перетащить флаг на свою сторону.
Основное, куда пойдёт IPv6 трафик:
Существует расхожее менение о том, что все совеременные ОС поддерживают IPv6 из коробки, там всё работает и там всё просто и легко. Существует и обратное мнение, мол, всё будет глючить и бибикать. Как показывает практика, оно из коробки работает и бибикает. Или, наоборот, глючит и всё легко и просто. Другими словами, работает, но граблей с собой приносит изрядное количество, но жить можно.
Ниже рассказ про некоторых из них.
Наличие dual stack означает, что в каждом месте, где у нас явно или неявно (например, исходящие соединения) появляются IPv6 нам надо подумать. Таких мест много — как только у вас появился dual stack, у вас тут же все утилиты (начиная с wget и заканчивая ssh) начинают ходить по IPv6 над ipv4. Иногда молча, иногда молча отваливаясь. Некоторые вполне себе уважаемые компании прописывают себе AAAA для домена, но забывают настроить веб-сервер. Получается казус.
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 адресов является использовнаие post и pre секций c использованием ifconfig. Адрес на интерфейсе появляется, но не сразу, так как начинает работу DAD — Duplicate address detection. В самом простом изложении компьютер спрашивает «есть у кого мой адрес?» и ждёт ответа. Этот протокол позволяет избежать появления повторяющихся адресов, однако, ifconfig заканчивает свою работу по конфигурированию интерфейса до завершения ожидания в DAD.
В результате, если nginx (или любой другой сервер) имеет настройку на соответствующий адрес, а не на звёздочку, то при попытке сделать там listen, сервер получает ошибку. И не слушает. Это чистой воды гонка условий, которые можно заметить только в процессе загрузки сервера (т.к. в остальных случаях DAD успеет отработать до запуска/перезапуска сервера). Отладка этой проблемы была весьма и весьма неприятной.
Не верите? Думаете, что только двоеточия?
::192.168.1.1 — валидный IPv6 адрес, хоть и не используется в интернете.
Так сказать, поздравляю всех, кто надеялся, что регэкспы для IPv6 адресов в интерфейсах будут простыми…
Автор: amarao
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/cloud/37243
Ссылки в тексте:
[1] version6.ru/isp: http://version6.ru/isp
[2] Источник: http://habrahabr.ru/post/183176/
Нажмите здесь для печати.