Pull to refresh

IPv6 для P2P

Reading time 7 min
Views 58K
IPv6 обычно ассоциируется с проблемой нехватки IPv4 адресов, о которой любит писать «желтая» пресса. Что со дня на день свободных адресов не останется и переход на IPv6 будет неизбежен. Скептики считают что проблема настолько же раздута, как в своё время «ошибка 2000», когда все боялись что после 1999 года наступит 1900 и случится техногенная катастрофа.

Для большинства пользователей, действительно, пользы от IPv6 никакой. Какая разница, например, что заголовки пакетов более удобны для маршрутизатора? Но для P2P проблема NAT (за счёт чего IPv4-адреса так ещё и не закончились) реальна, т.к. для связи peer-to-peer (даже чтобы переслать файл через Jabber или ICQ) нужно чтобы хотя бы один из участников был доступен снаружи, т.е. имел реальный IP-адрес или хотя бы пробросил себе порт. Некоторые провайдеры предоставляют внешний адрес за отдельную плату, у некоторых такой возможности нет, и именно для NAT-страдальцев будет больше всего полезно использование IPv6.

Также это будет полезно тем, у кого провайдер режет p2p-трафик. В России это (пока?) не так распространено, а за рубежом — далеко не редкость. IPv6 трафик (точнее, обёрнутый в обычные UDP пакеты) ими не режется. Еще это может помочь в ситуации, когда p2p-трафик блокируется корпоративным фаерволом, но настроить IPv6 через туннель можно.

На пользовательском уровне основное отличие в том, что IP-адрес состоит не из 4 байт, и записывается не в десятичной системе через точку, а 16 байт, которые записываются в шестнадцатеричном виде по 4 цифры (2 байта) и разделяются двоеточием. Нули в начале чисел можно опускать, и самую длинную цепочку :0:0:0:0: в адресе можно заменять просто двумя двоеточиями. При этом :: — нормальный IPv6-адрес, состоящий целиком из нулей. В броузере если нужно задать числовой адрес сайта, то он помещается в квадратные скобки, например http://[2001:4860:a003::68]/

Способы подключения


Если вам повезло, то ваш провайдер предоставляет Native IPv6. Поздравляю, Вы — счастливчик! Остальным же остаётся передавать IPv6 пакеты, обернув их в IPv4 по «старым» сетям. Способов подключения очень много, как автоматические (такие как 6to4 и teredo) так и вручную создаваемые туннели, и работающие как при наличии статического внешнего IPv4-адреса, так и без, даже за самыми хитрыми NAT.

6to4


Наиболее простой способ, если у вас есть внешний IPv4. Поднимаете 6to4 интерфейс (stf в BSD, sit в Linux), настраиваете себе IPv6 адрес вида 2002:xxyy:zztt: где xx.yy.zz.tt — ваш IPv4 адрес в шестнадцатеричном формате, и все исходящие пакеты отправляете на 192.88.99.1. Конкретные действия под конкретные системы не пишу, в гугле их полно (пример).

Плюс такого подключения — простота настройки. IPv6-пакеты по IPv4 при этом вам может оправлять кто угодно, вы — на ближайший гейт. 192.88.99.1 — это так называемый anycast адрес, их в сети может быть сколько угодно, и ваш провайдер отправляет их как правило к ближайшему. Обратная сторона этого — невозможно разобраться почему какой-то адрес или подсеть оказалась недоступной, т.к. реальные маршруты непредсказуемы и могут меняться во времени. Второй момент — одна машина под FreeBSD у нас при этом дважды перегрузилась по непонятным причинам за двое суток, а со статическим тоннелем — работает. С другой стороны, у нескольких знакомых на Linux такой вариант давно работает без проблем.

Teredo


Вариант автоматической настройки из-за NAT. Если у вас есть uTorrent 1.8 и выше, у него в настройках появилась кнопка «Install IPv6/Teredo» — её нажатия достаточно для настройки. Для установки вручную надо из командной строки выполнить две команды:
ipv6 install
netsh int ipv6 set teredo client
В *никс системах достаточно установить miredo например, командой:
sudo apt-get install miredo
В Vista он включен по умолчанию.

Минус такого варианта в том, что он работает не со всеми типами NAT. Если после установки у вас не открывается ipv6.google.com запустите из командной строки
netsh int ipv6 show teredo
если написано «Ошибка: клиент за симметричным NAT» — вам не повезло. В любому случае, очень желательно установить последние сервиспаки, например XP SP2 создавала адрес с префиксом 3ffe: а не 2001: В SP3 это исправлено, в SP2 можно поставить KB922819 или в regedit поправить/добавить \HKLM\System\CurrentControlSet\Services\Tcpip6\Parameters\GlobalParams\TeredoPrefix на 0x120 (288). Второй минус в том, что не смотря на кажущуюся простоту настройки, далеко не всегда всё оказывается просто. У одних всё работает только при выключенном встроенном в винду фаерволе, у кого-то — наоборот, только при включенном. И заранее описать все возможные проблемы, конфликты, и способы их решения просто невозможно.

Большой плюс (как и в случае 6to4) в том, что с теми, кто также подключен через teredo, вы будете соединяться напрямую, внешний сервер будет только помогать установить соединение посредством NAT Traversal, и возможно пускать через себя ping. Поэтому скорость будет не хуже, чем в случае прямого соединения (потери на «оборачивание» IPv6 пакетов в UDPv4-пакеты минимальные).

Hexago (go6)


Если автоматическая настройка не помогла (симметричный NAT), или вы хотите предсказуемой марштуризации пакетов, есть множество бесплатных "Туннельных Брокеров". К его выбору стоит отнестись очень внимательно, как и к выбору прокси-сервера, т.к. от этого будет зависеть и пинг, и скорость (это верно и для teredo — можно сменить сервер по умолчанию на teredo.remlab.net, к России он ближе). Основные инструменты — ping и traceroute. Посмотрите, через кого идёт зарубежные трафик вашего провайдера. Посмотрите маршрут к 192.88.99.1 (у многих он пойдёт к Hurricane Electric — .he.net).

Самый простой в установке — go6.net Достаточно скачать с их сайта программу, при желании — зарегистрироваться, установить (она будет ругаться на «неподписанный драйвер» — надо подтвердить установку), и всё. Работает со всеми типами NAT (разве что надо исходящий порт 3653 разрешить в фаерволе). Хотя проблемы тоже бывают, и со встроенным фаерволом, и из-за его отсутствия, у меня он работал только при включенном (но не работающим из-за Symmetric NAT) teredo.

Минус состоит в том, что go6 находится в Канаде, и весь трафик, насколько я понял, пропускает через себя. Из-за этого ping от 300 мс и выше, низкая скорость. Где-то попадалась информация что hexago-hexago и ayiya-ayiya могут устанавливать «прямые» тоннели друг с другом, если удаётся (NAT Traversal), но ни подтвердить, ни опровергнуть этого не могу.

Hurricane Electric


Официальный сайт — www.tunnelbroker.net Минус: предоставляют только статические туннели, т.е. требуется внешний IPv4 адрес. На сайте нужна регистрация. Плюс: у них много «точек доступа», через которые можно подключиться, во многих странах, поэтому можно выбрать достаточно близко от себя, и скорость будет практически не хуже прямого IPv4.

SixXS


Официальный сайт: www.sixxs.net У них самая сложная регистрация (данные проверяются вручную, от нескольких часов до дней), но и самый широкий спектр и возможных способов подключения, и точек доступа, поэтому есть высокий шанс найти в пределах 10 «прыжков» (по traceroute) от себя. Я остановился именно на этом варианте, рекомендую.

После регистрации надо заказать AYIYA туннель. При этом дают выбрать одну из точек доступа (проверяем trace и ping; ближайшей от меня оказалась sesto в Швеции). Заказ тоже проверяют вручную (часы, дни), при этом берут за это внутренние «условные единицы», так что тип туннеля надо изначально заказывать правильный. Затем — скачать софт, и тут есть подводные камни. Tap32-драйвер и клиент скачиваются и ставятся по-отдельности. tap901 распаковать, один раз запустить addtap.bat — при каждом запуске он создаёт новый интерфейс, если случайно насоздавали лишних — deltapall.bat удаляет сразу все. Клиентов (AICCU) есть два, с GUI и без, но GUI не совместим с последней версией драйвера. Лучше скачать оба, один раз запустить GUI, ввести логин/пароль, получить настройки с сервера, и нажав иконку выбрать Save Configuration. Больше GUI не нужен. Если теперь запустить клиент из командной строки — всё должно заработать. Если повезёт, конечно. Чтобы IPv6 запускалась при загрузке компьютера нужны утилиты instsrv и srvany, позволяющие прописать этот клиент как виндовую службу (сервис). Очень подробное описание настройки есть на английском языке.

BitTorrent


Чтобы подключиться к кому-то по IPv6, нужно узнать его адрес. Естественно, IPv6 должен поддерживать торрент-клиент. Это uTorrent начиная с 1.8 (и соответствующей ему версия официального BitTorrent), Azureus начиная с 4.1.0.0 (старые ругались на «error 16»), Transmission с версии 1.50, про другие не знаю.

Найти друг друга можно по DHT. Их есть 2 реализации. В Azureus своя, ни с кем больше не совместимая, но IPv6 поддерживает. В uTorrent и всех остальных — пока нет, но планируется в будущем. Зато IPv6 поддерживается PEX. Но всё это работает только на открытых трекерах, без флага private в торренте.

Лучше всего, если IPv6 поддерживает трекер. Согласно документации, для этого в протокол ответа («компактный», на который практически все перешли) добавлено поле peers6, где в бинарном виде передаётся список адресов, по 18 байт (16 — адрес, 2 — порт). Кроме того, клиент может передавать параметр &ipv6= и в принципе, трекер может передавать клиентам IPv6-адреса друг друга, даже если сам не может принимать соединения по IPv6. Минус такого подхода — через этот параметр можно передать «левых» адресов, замусорив таким образом трекер.

Если сам трекер доступен по IPv6, то он будет видеть реальные адреса того, кто к нему обращается. Но если у доменного имени трекера будут прописаны и A запись, и AAAA, то клиенты будут соединяться только по IPv6, и трекер не будет знать их IPv4 адреса (аргументы &ip= и &ipv4= также позволяют «мусорить», и реально их никто не передаёт, uTorrent — единственный кто передаёт &ipv6=). Получается, в идеале в торрент-файл надо прописывать 2 адреса на оба протокола.

Трекеры


Трекеров с поддержкой IPv6 пока мало. Есть www.sixxs.net/tools/tracker/catalog но там практически ничего нет, он больше для тестов и демонстрации. The Pirate Bay объявил о поддержке IPv6 в январе (только трекером, сам их сайт по IPv6 не доступен). В рунете в феврале поддержка IPv6 появилась на ipv6.nnm-club.ru (регистрацию там то открывают, то закрывают только по инвайтам, но при входе по IPv6 она открыта всегда).

Но чтобы всё это имело смысл, надо чтобы было достаточное число клиентов. На главной странице TPB последний раз была статистика по числу пиров, согласно которой всего 0.12% были IPv6 (в данный момент почему-то по нулям). Это примерно соответствует моему личному опыту — на сотню пиров в лучшем случае 1-2 по IPv6. По статистике nnm-club'а 14% клиентов передают &ipv6= или соединяются по IPv6 с трекером. Реально часть из них передают «локальные» адреса fe80: т.е. IPv6 у них не настроен, но где-то у 12% адрес — реальный.

Программирование


И пару слов и программировании, точнее — портировании готовых приложений под IPv6. Очень рекомендую книгу Jun-ichiro itojun Hagino «IPv6 Network Programming» как раз об этом. Самое приятное, это что практически все функции — socket, connect, listen, send, recv — IPv6 поддерживают, и их трогать вообще не придётся.

Первый основной момент — что надо отказаться от использования структуры sockaddr_in (и тем более хранения IP-адреса в int и функций типа inet_addr). Вместо неё есть универсальная структура sockaddr_storage, при желании её поле ss_family можно проверить на AF_INET и преобразовать к sockaddr_in, или, если оно равно AF_INET6 — sockaddr_in6.

Второй момент — работа с DNS и строковым представлением адресов. Его надо перевести на универсальные функции getaddrinfo и getnameinfo. При этом надо иметь в виду, что getaddrinfo может вернуть несколько адресов, серверу при этом надо слушать (bind, listen) все, клиенту — пробовать соединиться по очереди, пока не получится с одним из адресов.

В php главное, на что стоит обратить внимание — что в $_SERVER['REMOTE_ADDR'] может оказаться не только IPv4 адрес, но и IPv6, если его поддерживает ваш веб-сервер.
Tags:
Hubs:
+64
Comments 51
Comments Comments 51

Articles