- PVSM.RU - https://www.pvsm.ru -

Использование IPv6 в Advanced Direct Connect

Наблюдать за развитием файлообменной сети интересно, но ещё интереснее участвовать в нём.

На сегодняшний день, устанавливая и запуская современный NMDC [1] хаб, новоиспечённый администратор получает доступ практически ко всем наработкам и накопленному в этой области опыту его предшественников. Он имеет систему, готовую к расширению и кастомизации в том числе с помощью многочисленных скриптов.

С ADC [2] хабами иначе. Структура этого протокола предполагает расширяемость. Хочешь новую фичу? Ну что ж – предлагай, продвигай, реализуй, внедряй, пользуйся.

Как следствие, «из коробки» можно, конечно, получить готовый хаб, но просто запустить и забыть о нём будет нехорошо. Расширяемость в историческом контексте предполагает в том числе и наличие разного количества разных функций клиентского и серверного софта в зависимости от версии. И то, что будет работать без проблем у одного пользователя, может оказаться несовместимым с клиентом другого, и это нужно учитывать.

Так случилось и с IPv6. Старичок NMDC не умеет его в принципе, а вот ADC сам по себе к нему готов. Однако, не всё так просто.

Совсем немного теории

«Активный» пользователь может принимать входящие соединения. Собственно, исходящий от него запрос на соединение на самом деле является приглашением.

«Пассивный» пользователь в общем случае может использовать только исходящие запросы. Посредством хаба он просит активного пользователя отослать приглашение – и соединение получается.

Использование IPv6 в Advanced Direct Connect - 1

И да, этот механизм не зависит от версии используемого протокола IP.

Лебедь, рак и щука

Поговорим о клиентском софте.

Поддержка IPv6 в DC++ [3] носит экспериментальный характер. Отдельных настроек для него нет, и тем удивительнее для меня было увидеть разные режимы работы для разных версий IP, причём пассивный как раз для шестой, но это неточно.

Получить активный режим при ручной настройке не удалось даже при явном использовании в качестве WAN IP домена с AAAA-записью, а вот в автоматическом режиме с использованием UPnP всё заработало как до́лжно.

AirDC++ [4] также имеет поддержку IPv6-соединений, и реализована она вовсе отдельно от IPv4. Более того, этот клиент модифицирует тэги пользователей таким образом, чтобы отображать режимы работы для обоих IP протоколов одновременно. Сами хабы делать этого (пока) не умеют, а жаль.

Сразу должен оговориться: AirDC++ делает так один и для себя. В дальнейшем для удобства я буду использовать сочетания вроде AP или AA как указание на активный или пассивный режимы работы для IPv4 и IPv6 соответственно, а не их отображение в тэге реального клиента на реальном хабе. Это важно.

В нашем эксперименте мы будем использовать FlylinkDC++ в качестве клиента, вовсе не знакомого с IPv6. Следует также отметить, что поддержка NATT [5] для него на момент написания статьи не была реализована нигде.

Начало

Первым делом мы рассмотрим заведомо невозможные соединения между пользователями разных версий протокола IP. Для теста будет использоваться IPv6 ready хаб [6] с ресурсными A- и AAAA-записями для доменного имени, выступающего в качестве его адреса.

Использование IPv6 в Advanced Direct Connect - 2

Обратите внимание, здесь при (фактической) попытке обращения к пользователю с IP-адресом шестой версии выводится ошибка.

Hub:	[Outgoing][IPv4:412]	 	D<b>RCM</b> AACX AACU ADCS/0.10 337151563
Hub:	[Incoming][IPv4:412]	 	D<b>CTM</b> AACU AACX ADCS/0.10 1988 337151563
Hub:	[Outgoing][IPv4:412]	 	DSTA AACX AACU 240 <b>IP</b>s<b>unknown</b>

Что в переводе на человеческий звучит как:

P4: – Можно я к тебе прицеплюсь?
A6: – Цепляйся!
P4: – Жизнь боль 0_0

Краткий словарик, если что, здесь [7].

А если наоборот, и соединение иницирует A4, то ошибка не выводится, и соединение просто «зависает».

Hub:	[Outgoing][IPv4:412]	 	D<b>CTM</b> AACX AACU ADCS/0.10 1993 3871342713

Быть, а не казаться

Что важно, так это отображаемый на хабе режим соединения.

Клиенты без поддержки IPv6 должны будут видеть подключенных через него пользователей как однозначно пассивных просто потому, что для них хаб не заполняет I4 или I6 поле соответственно.

Использование IPv6 в Advanced Direct Connect - 3
FlylinkDC++ vs. IPv6

На деле же ситуация проще и сложнее одновременно.

Использование IPv6 в Advanced Direct Connect - 4
AirDC++ vs. IPv6

Проще, потому что IPv6 имеет приоритет над IPv4, и это понятно. Именно через него (хотя с помощью соответствующей опции доступно переопределение) будет установлено соединение с хабом, и его же активный клиент будет предлагать для соединения пассивному.

Сложнее, потому что если на хабе присутствуют пользователи с поддержкой IPv6, но подсоединены они строго через IPv4-адрес, то…

Использование IPv6 в Advanced Direct Connect - 5

… то с ними можно соединиться (наобум) вообще не имея IPv4.

Обратите внимание, удалённый клиент обозначил себя как актива, но обрабатывается как пассив. Почему?

Туды его в качель

Теперь попробуем соединять друг с другом клиенты с различными, но общими в части IPv4 наборами поддержки протокола IP.

Использование IPv6 в Advanced Direct Connect - 6

Да, жаль, что пассивным пользователям приходится курить в сторонке. Но помочь этому нельзя, так как их видимый IP-адрес не имеет особого значения – на то они и пассивы.

Использование IPv6 в Advanced Direct Connect - 7

Ба! Активный клиент отправляет пассивную команду [8]?.. Логично было бы ожидать «зависшего» соединения, но нет, оно получается на условиях A4.

Почему так? Обращаемся к разработчику и получаем ответ:

CTM [9] isn't good if the other user doesn't support IPv6

И ведь не поспоришь! Но это требует уже внутренней, независимой от хаба логики (см. код здесь [10] и здесь [11]). Пассивам же по-прежнему помочь нельзя, потому что

Active mode = TCPx + IPx [12]

Попытки же соединения между клиентами с общими в части IPv6 наборами поддержки протокола IP выглядят следующим образом. Напомню, добиться PA для DC++ мне не удалось.

Использование IPv6 в Advanced Direct Connect - 8

И снова сюрприз. Получается, пассивный режим для IPv6, который демонстрирует DC++, есть или намеренный фейк, или баг.

Что дальше?

В настоящее время существует ровно два способа решения всех возможных проблем соединения пользователей в разных режимах и с разными наборами поддержки протокола IP.

Первый – приглушить IPv6 вовсе или, наоборот, создать хаб для работы только через него.

Второй – вот это расширение [13], которое только-только подходит к стадии тестирования.

Ну и, ленясь настраивать активный режим для работы в DC, помните:

Кто имеет, тому дано будет, а кто не имеет, у того отнимется и то, что он думает иметь. Лк. 8:18

Автор: Delion

Источник [14]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/open-source/358001

Ссылки в тексте:

[1] NMDC: http://mydc.ru/topic915.html

[2] ADC: https://adc.sourceforge.io/

[3] DC++: https://dcplusplus.sourceforge.io/

[4] AirDC++: https://airdcpp.net/

[5] NATT: https://habr.com/ru/post/497944/

[6] IPv6 ready хаб: https://www.uhub.org/

[7] здесь: http://mydc.ru/topic2033.html

[8] пассивную команду: https://adc.sourceforge.io/ADC.html#_rcm_2

[9] CTM: https://adc.sourceforge.io/ADC.html#_ctm_2

[10] здесь: https://github.com/airdcpp/airgit/blob/7d18ea6d2a1dc98dde45e8c3d8d1a3c4aeeb5bb0/airdcpp/airdcpp/User.cpp#L281-L323

[11] здесь: https://github.com/airdcpp/airgit/blob/master/airdcpp/airdcpp/OnlineUser.h#L61-L71

[12] TCPx + IPx: https://dcpp.wordpress.com/2011/05/09/i4i6-should-be-broadcasted-regardless-of-tcp4tcp6/

[13] расширение: https://forum.dcbase.org/viewtopic.php?t=771

[14] Источник: https://habr.com/ru/post/522812/?utm_source=habrahabr&utm_medium=rss&utm_campaign=522812