Для личных нужд я использую bare-metal сервер от Hetzner, порезанный на виртуалки и, с недавних времен, VPS на HostHatch для мониторинга и резервирования. Также есть маленькая ВМка у TietoKettu (для ВПН, экспериментов и прочее).
Так как IPv4-адресов мало, то хостинги обычно дают дополнительные айпишки за дополнительные деньги, а вот IPv6-сети выделяют щедро. Изначально, я объединил все виртуалки, у которых был публичный IPv4-адрес в Wireguard mesh сеть, но потом когда выяснилось, что надо бы присоединить ещё одну ВМку, пришлось переделать mesh на IPv6-адреса и тут понеслось...
Сначала выяснилось что у HostHatch нет связности с ElmoNet (TietoKettu использует их адреса), после недели-двух бодания с техподдержкой HostHatch-a связность появилась. Однако недели две назад от них приходит письмо, о техобслуживании нод, где живут мои ВМки. И что вы думаете? После обслуживания туннель до этих ВМок так и не восстановился. В итоге, оказалось что обе вмки исчезли из IPv6-интернета. На этот раз связность починили только через 3 дня, хотя я создал срочный тикет.
В итоге, я перевёл туннели обратно на IPv4 и переключился на DN42, но в один выходной мне на глаза попалась статья на Reddit и я решил воскресить идею о "своем" куске Интернета. Масла в огонь подбавил Vultr, который наглухо заблокировал доступ на свои ресурсы (даже IP calculator) с Hetzner.
В одном из комментов, к вышеупомянутой статье, была ссылка на IPv6-сообщество в Discord. Я присоединился и стал задавать много вопросов в канале #asn-newbies.
Думаю, что кому-нибудь мой опыт и набитые шишки будет полезен. Если это так, то прошу под кат.
Disclamer: у меня весь процесс (от начала и до первого успешного пинга) занял неделю, поэтому советую, запастись терпением. Disclamer2: я описываю свой опыт, и возможно, что-то можно было сделать быстрее/дешевле/лучше.
Итак, начнём.
AS or not AS...
Для начала стоит определиться нужна ли Вам автономная система или нет. Некоторые провайдеры, например Vultr, могут предоставить свою ASN, да и вообще для использования BYOIP (Bring your own IP) нужны только адреса (их будет анонсировать ASN провайдера/хостера), а ASN по желанию.
AS и адреса выдаёт RIR (Региональный интернет регистратор). Так как я из Эстонии, то мой RIR - это RIPE (Европа, Средняя Азия и Россия). К сожалению, нельзя прийти напрямую в RIPE и купить/заказать ASN и адреса. На выбор есть две опции: стать LIR-ом (локальным регистратором) или получить спонсорство от существующего LIR. Первый способ, это единоразовый платеж 2000 EUR и потом 1500EUR ежегодно, поэтому для меня это не вариант.
В моём случае AS оказалась нужна и я начал поиски. В Discord предложили на выбор три разных LIR.
Cloudie
Scaleblade
Freetransit
ну и остальные, более дорогие опции.
Cloudie, на момент написания статьи, новые AS не регистрирует.
Только ASN: за 25 евро (15 единовременно + 10 ежегодно)
ASN и PA-адреса: 25 евро (15 единовременно + 10 ежегодно)
Только PI-адреса: 75 евро (15 единовременно + 60 ежегодно)
ASN и PI-адреса: 85 евро (15 единовременно + 70 ежегодно)
Также и Scaleblade, и Freetransit предлагают бесплатный транзит через их AS. Это очень важно.
Типы адресов PA vs. PI
Freetransit предлагает на выбор PA или PI адреса, причём PI значительно дороже.
PI (Provider Independent) - это адресное пространство, которым владеет покупатель, и оно не завязано ни на какой конкретный LIR. Например, при можно купить его у одного LIR-a, а продлять у уже другого.
PA (Provider Aggregatable) - это адресное пространство LIR-a, часть которого он даёт Вам в аренду, и если появится надобность перейти к другому LIR-у, то адреса прийдётся менять.
Тем не менее на использование PI-адресов имеются некоторые ограничения:
их можно использовать только для собственных нужд организации или человека.
их нельзя использовать для хостинга (раздавать другим)
обычно выделяют малыми блоками (для блоков больше /48 нужно обоснование).
Насколько я знаю, сам RIPE берёт с LIR-ов 50 евро за регистрацию одного PI-блока, поэтому они значительно дороже.
Я решил брать RIPE-02 у Scaleblade, хотя можно было заказать у RIPE-01 и адреса бесплатно у этих ребят.
Disclamer: ip6.me не работает с людьми, которые живут в этих местах, да и форма заказа адресов у них сломанная.
Регистрация в RIPE и cоздание объектов
Для начала нам нужно будет зарегистрироваться в RIPE и создать объекты в их базе. С ними будут связаны, выданные нам ASN и адреса. Если Вы до этого имели дело с DN42, то будет значительно проще, потому что нужно будет создать плюс-минус такие же объекты, как и в DN42. В любом случае, инструкция от Freetransit сильно поможет.
Регистрируемся тут и указываем имя и фамилию, как в документе (будут проверять).
Потом на электропочту придёт письмо об успешной регистрации. В моём письме была ссылка на LIR Portal, где была кнопка "зарегистрировать LIR". Обычному пользователю это не нужно (если только не Вы решили идти по пути создания LIR-а). Я по незнанию, её нажал и потом дня три объяснял RIPE, что ошибся.
Также должно быть ещё одно письмо от RIPE с ссылкой на сервис проверки документов iDenfy. Для проверки нужен документ и телефон. Документ - паспорт или ID-карта (в моём случае это была карта ВНЖ Эстонии - elamisloakaart), телефоном надо будет сосканировать QR-код, который сгенерирует iDenfy, а потом сфоткать документ с двух сторон. Через 5-10 минут документ пройдёт проверку.
Затем регистрируемся на Scaleblade. Затем, заходим и создаём проект. Дальше нас встречает такой вот интерфейс
Ничего связанного с LIR/адресами или AS нету от слова совсем. Я сначала немного впал в ступор, но потом, спросил в Discord как мне всё-таки заказать у них RIPE-02. Ответили, что только через Support.
Добро, пишем в суппорт.
Полдня ожидания и в самом конце рабочего дня, приходит ответ, в котором есть ссылка на Google Forms. Там от нас хотят:
номер заявки/тикета
адрес электропочты, которую использовали для регистрации на Scaleblade
имя и фамилия, как в паспорте или в ID
тип конечного пользователя: компания или физлицо.
страна, где планируется использовать AS. Здесь можно указать страну своего присутствия/регистрации компании. Главное, чтобы страна была в зоне ответственности RIPE и была хоть какая-то связь с этой страной. Я указал Эстонию, хотя анонсирую свои блоки через Vultr в Stockholm-e.
домашний адрес
страна проживания
подтверждение возраста
согласие с тем, что RIPE будет проверять документы
Далее они мне прислали счёт, который я оплатил, а заодно отправил им объекты, которые сделал в RIPE.
mntner: KYBERORG-MNT
person: AM51028-RIPE
role: ACRO54020-RIPE
organisation; ORG-AM366-RIPE
Также я узнал у них их handle в RIPE (SBL-MNT), чтобы добавить его в ORG объект.
Следующим шагом Scaleblade прислал договор с конечным пользователем (EUAA), который надо подписать в сервисе PandaDoc. Пару минут после подписания и я получил свой блок адресов, а заодно и ссылку на верификацию ID-карты.
После верификации пришлось подождать один рабочий день пока RIPE выделит мне автономную систему.
В итоге, 5 рабочих дней и ASN с IPv6-блоком получены.
Подготовка к анонсированию блока
ROA
Из мира DN42 я знал, что для того, чтобы успешно проходить ROA проверку нужно сделать ROA-объект в базе RIPE. Для этого идём в RPKI Dashboard Вводим туда свой ASN и Prefix (блок), а также минимальный размер блока, который разрешено анонсировать и... получаем нежданчик (в случае PI-блока такого не должно быть).
Дело в том, что AS принадлежит нам, а вот блок - нет. Блок принадлежит Scaleblade и только они могут сделать ROA-запись. На это у меня ушло ещё 2 дня, поэтому про ROA/RPKI лучше сказать LIR-у сразу.
Route6
В отличие от ROA route6-объект создать получится. Для этого идём всё туда же в RIPE Database и выбираем "Create an Object".
указываем свой блок или его часть и нажимаем на Submit
Если что-то пошло не так, то интерфейс покажет что именно, если же всё хорошо, то увидим экран подтверждения.
Inet6num
Также, если планируется анонсировать блок частями, то для каждой части нужно создать свой inet6num-объект. Для этого идём в My Resources и нажимаем "Create assignment"
Заполняем:
inet6num - наш блок
netname - имя сети
country - страна из которой мы будем анонсировать блок (выбираем из листа)
admin-c - административный контакт. Тут надо указать person объект (работает поиск по имени и фамилии).
tech-c - то же самое, что и admin-c, только это технический контакт.
status - ASSIGNED (выделен и используется), ещё есть AGGREGATED-BY-LIR (для объединения блоков) и ALLOCATED-BY-LIR (выделен, но не используется).
Также если нажать на "+" на любом поле, то можно добавить дополнительные поля, например, org для организации.
Если всё хорошо, как и до этого будет экран подтверждения
Также для этой части блока нужно будет создать route6 объект. Он создаётся также, как и для основного блока.
rDNS
Также в RIPE Database конфигурируется rDNS ака Reserve DNS, то есть преобразование IP-адреса в имя. Как и для обычных DNS-доменов, нужен будет DNS Server (причём только тот, где настроен DNSSEC).
Обратная запись (PTR-запись) для IPv6 должна находиться в зоне ip6.arpa и иметь специальный формат. Например, PTR-записи для блока 2a12:bec0:50b::/48 должны быть в зоне b.0.5.0.0.c.e.b.2.1.a.2.ip6.arpa.
Для этого идём на свой DNS Server и создаём эту зону. Порядок важен - Ripe Database проверяет является ли данный DNS server авторитативным для этой зоны. Мои зоны обслуживает Cloudflare.
Дальше Cloudflare начнёт искать существующие записи (которых, конечно, нет) и в конце выдаст имя DNS Server-ов, которые нужно будет прописать в RIPE Database.
В принципе, уже сейчас можно сделать пару записей. Например, 2a12:bec0:50b::1 должен иметь обратное имя stor.klab.sh.
Для этого берём любой генератор обратных записей (например этот) и вставляем наш адрес.
Из результата генерации 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.0.5.0.0.c.e.b.2.1.a.2.ip6.arpa убираем зону b.0.5.0.0.c.e.b.2.1.a.2.ip6.arpa и получаем 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. Это нужно будет вставить в редактор зоны Cloudflare
Теперь можно вернуться в RIPE Database и делегировать домен. Для этого нужно будет создать объект domain
Дальше он предложит воспользоваться Wizard-ом, хотя при этом останется на этой же странице.
Заполняем форму
prefix - наш блок
nserver - первый DNS-сервер (тот, что дал нам Cloudflare при создании зоны)
nserver - второй DNS-сервер
admin-c, tech-c - то же самое, что и предыдущих случаях
zone-c - в кому обращаться по поводу зоны.
немного ждём и зона делегирована! Теперь нужно немного подождать пока эту делегацию подхватит и Cloudflare и остальные DNS.
Выбор провайдеров
На этом этапе у нас есть блок адресов, автономная система, обратная зона и все необходимые записи. Теперь надо сообщить Интернету где находится наша сеть.
Обычно когда покупаешь хостинг, то ВМке назначается IP-адрес и блока хостера и то, как и через кого он анонсируется в Интернет - это забота хостера. Мы же хотим использовать наш блок, а не блок хостера.
Есть несколько вариантов как это сделать:
BYOIP или Bring your own IP - хостер/провайдер анонсирует наш блок со своей AS или же создаёт с нами BGP-сессию, получает от наши сети и анонсирует их своим апстримам.
Мы сами ищем через кого мы будем анонсировать наши сети.
Первый вариант легче в настройке (её делает хостер/провайдер), но:
мы целиком зависим от связности хостера.
BYOIP либо не доступен вообще (как у Hetzner), либо доступен на дорогих тарифах (привет, PQ Hosting).
В моём случае, BYOIP был не вариант, так как HostHatch не умеет готовить IPv6. Во втором случае, мы окунаемся в пучину телекома сами себе провайдер и делаем связность сами.
Немного терминологии:
upstream - провайдер провайдера или вышестоящий провайдер, автономная система через которую мы со своей сетью ходим в остальной Интернет.
downstream - это наоборот, те автономные системы которым мы раздаём Интернет (для них апстримом являемся мы).
peer - это сеть-сосед, которая анонсирует нам свои маршруты, а мы ей свои. В итоге, мы ходим в ту сеть напрямую, а не через другие сети.
IP transit - это плата за трафик/канал, которую берёт с нас upstream за то, что пропускает трафик с нашей сети.
PoP - point of presence - точка присутствия - чаще всего дата-центр, где находиться один или больше upstream-ов
IXP - Internet eXchange Point - точка обмена трафиком - тоже дата-центр, где находятся несколько автономных систем с целью peering-а, чтобы трафик шел напрямую, а не через upstream-ы.
В мире DN42 (откуда я пришёл в эти ваши интернеты Интернет) большинство (особенно поначалу) посылает соседям всё валидные маршруты и принимает тоже все. Соединение идёт через туннели поверх Интернет, поэтому большинство DN42-соединений не имеет физической связности. В Интернете не так.
Большинство upstream-ов хотят, чтобы ваш сервер находился в одной из их точек присутствия. Для меня (пока!) это не реальный сценарий, так как я завишу от хостинга, поэтому у меня был выбор между co-location своего сервера (который надо купить) и арендой ВМки, которая находится на площадке, где есть upstream-ы. Однако есть пару проектов, которые предоставляют BGP-сессии и транзит поверх существующего соединения:
BGP Tunnel - активный проект, но весь трафик идёт через AS34927, который находится в Швейцарии (BGPTunnel бесплатный для некоммерческих проектов)
Как правило, точки присутствия у этих провайдеров находятся далеко и если через них ходить, то будет большой пинг и всё будет тормозить.
Co-location для меня пока дорого.
Остаётся вариант с виртуалкой на точке присутствия (IXP VM) - это специальные дешевые и не очень дешевые ВМки для создания BGP-сессий с другими автономками.
На мой взгляд, одним из самых дружелюбных к BGP хостеров является Vultr. У них куча точек присутствия по всему миру и BGP-сессия, а также IP transit входят в стоимость.
С него я и начал, создал аккаунт и применил купон на 250$. Создал самую дешевую ВМку в Стокгольме и запросил BGP-сессию. Vultr попросил LOA (Letter of Authorization) - письмо с подписью, где я разрешил им анонсировать мои маршруты с их сети.
После этого я установил с ними BGP-сессию (по link-local адресам) и анонсировал маршруты, они в ответ дали full table (все маршруты Интернета). Примерно 900000 IPv4 и 800000 IPv6 маршрутов.
В этого момента мой блок стал частью Интернета. От момента запроса ASN и адресов до первого пинга прошло 7,5 дня.
Надеюсь, что мой путь будет интересен и полезен. Также я открыт к Peering-у на NorthIX или через туннели.