[О блоге] [наверх] [пред] [2022-11-08 21:45:03+03:00] [aba2f5ddff4fd16d0b1471936b99912b140290d2]
Темы: [bittorrent][tip]

Как не тривиально настроить BitTorrent оказалось

BitTorrent-ом я пользуюсь с момента появления у меня Интернета. Уже не
первый год использую aria2 в качестве клиента. Много лет у меня поднят
локальный трэкер (opentracker). Но похоже я вообще толком не проверял
всё ли работает как надо.

opentracker заставляешь слушать на "::" адресе и sockstat показывает что
он слушает и отвечает везде. Но проверка показала что он нифига не
показывает всех peer-ов для моих трэкеров. Явно же в его README написано
что WANT_IPV6 опция только для IPv6-only версии трэкера. Я подумал что
без неё -- он будет dual-stack. Посмотрел код: либо он только IPv4, либо
только IPv6. Нашёл что в дистрибутивах по два пакета opentracker не
брезгуют делать из-за этого: один для IPv4, другой для IPv6. Пришлось
поднимать две версии этого трэкера.

Пошёл дальше проверять работает ли это всё. Сможет ли один aria2 клиент
скачать с другого, используя только этот трэкер? Приятно что в aria2
можно явно отключить и указать только чётко заданные трэкеры. Вижу в
debug выводе leecher-а, что он получает IPv4 адрес seeder-а, но, так как
он за NAT-ом этого же адреса, то качать с него не сможет. Не проблема,
всё понимаю, но где же IPv6 адрес seeder-а?

Предполагаю что aria2 почему то стукнулся по IPv4 адресу трэкера и
поэтому передал ему только IPv4. Жёстко задал IPv6 адрес в /etc/hosts.
Не помогло, потому что aria2 использует c-ares и самостоятельно
асинхронно опрашивает DNS серверы. Ладно, указываю адрес трэкера не по
доменному имени. Вижу что seeder подключается по IPv6 адресу трэкера, но
передаёт он IPv4, который я указал в --bt-external-ip опции к aria2.
Почему я понадеялся что он только IPv4 адрес переопределит или что он
просто добавит этот адрес к анонсируемым?

Оказалось, что указать несколько адресов этой опцией нельзя. Что
укажешь -- то он и будет анонсировать трэкерам. Указывать несколько
адресов можно только косвенно через multiple-interface опцию. Но
BitTorrent seeder у меня запущен на отдельной машине, которая ничего не
знает про свой внешний настоящий IPv4 адрес. В общем, никак нельзя
указать чётко заданный IPv4 и IPv6 адреса.

Благо, оказалось что можно передавать доменное имя. И BitTorrent
протокол это явно разрешает (BEP3). И aria2 leecher это прекрасно
понимает тоже. Так что проблема решилась созданием доменного имени с
нужными мне IPv4+IPv6 адресами.

Я также поднял и DHT bootstrap сервер github.com/jech/dht-bootstrap.
Очень минималистичный, поддерживающий и IPv4 и IPv6, слушающий спокойно
на всех адресах. Когда поднимал, то тестировал локально утилитой
github.com/jeanralphaviles/dhtcli чтобы хотя бы просто PING-ануть его.

Начал проверять работу уже через aria2 seeder/leecher и вообще не видно
в выводе чтобы что-либо на DHT сервере происходило. Запрос сервер видит,
пишет на экране что посылает и ответ, но клиент (dhtcli) ничего не
получает. tcpdump показывает что ответ, действительно, отсылается назад.
Вот только не с того IPv6 адреса на который запрос приходил.

Потому что, в отличии от TCP, UDP отправляется as-is и какой уж будет
выбран исходящий адрес, такой и будет. FIB-ом вроде бы тут делу не
поможешь (в отличии от 884f5eb6a88411f947a0d6c3fecd37c612a51654). А
dht-bootstrap настолько минималистичен, что даже не предлагает выбрать
явный адрес для bind-а. Не нашёл решений как можно явно указать
preferred source address или адрес для bind-а. Но просто взял и сделал
явный hardcode адреса для bind-а в dht-bootstrap демоне. DHT вроде бы
заработал после этого.

И вновь чувство того, что я похоже жутко что-то всё переусложняю или
что-то не то делаю. Неужели запуск dual-stack BitTorrent клиента за
NAT-ом это такое не тривиальное дело оказалось? Как и запуск DHT
сервера. Понимаю, что это вообще не часто кем-либо поднимается, да и то
это наверняка официальная BitTorrent реализация. Да и на IPv6, который
вообще в отдельных BEP-ах описан как для BitTorrent, так и для DHT --
многие плевать хотели. Ну а доку по opentracker я просто плохо читал.

    [оставить комментарий]