Что: aba2f5ddff4fd16d0b1471936b99912b140290d2
Когда: 2022-11-08 21:45:03+03:00
Темы: 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 я просто плохо читал.
Сгенерирован: SGBlog 0.34.0