hufrea/byedpi

NetBSD: ошибка "connect: No route to host" для протокола SOCKS5

Closed this issue · 4 comments

kfmut commented

Добрый!

Планирую использовать ciadpi с "качалкой" для ютуба yt-dlp https://github.com/yt-dlp/yt-dlp . Запуск строкой:

./ciadpi --split 1 --disorder 3+s --mod-http=h,d --auto=torst --tlsrec 1+s -p 10801 --debug 1

Сама ошибка(выдаётся в повторе 5-6 раз):

accept: fd=4
resolve: www.youtube.com
connect: No route to host
ss error: 65
close: fd=4 (pair=-1), recv: 0, rounds: 0

Тестовый пример:

yt-dlp "https://www.youtube.com/watch?v=9bZkp7q19f0" -F --proxy=socks5://127.0.0.1:10801

выдаёт несколько ошибок формата:

[youtube] Unable to download API page: <urlopen error [Errno 4] Host unreachable> (caused by ProxyError('<urlopen error [Errno 4] Host unreachable>'));

Если использовать протокол SOCKS4, то вроде бы всё работает:

yt-dlp "https://www.youtube.com/watch?v=9bZkp7q19f0" -F --proxy=socks4://127.0.0.1:10801

accept: fd=4
new conn: fd=5, addr=172.217.24.46:443
host: www.youtube.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=5 (pair=4), recv: 251323, rounds: 2
close: fd=4 (pair=5), recv: 1059, rounds: 2
accept: fd=4
new conn: fd=5, addr=172.217.24.46:443
host: www.youtube.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=5 (pair=4), recv: 23098, rounds: 2
close: fd=4 (pair=5), recv: 1860, rounds: 2
accept: fd=4
new conn: fd=5, addr=172.217.24.46:443
host: www.youtube.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=5 (pair=4), recv: 7754, rounds: 2
close: fd=4 (pair=5), recv: 1729, rounds: 2
accept: fd=4
new conn: fd=5, addr=172.217.24.46:443
host: manifest.googlevideo.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=5 (pair=4), recv: 10645, rounds: 2
close: fd=4 (pair=5), recv: 2074, rounds: 2

Скачивал дистрибьютивы ciadpi и yt-dlp для винды - там всё работает без ошибок.

Если брать видео с Vimeo, то для части хостов всё норм, для части нет:

yt-dlp "https://vimeo.com/55687625" -F --proxy=socks5://127.0.0.1:10801

accept: fd=4
resolve: vimeo.com
new conn: fd=7, addr=162.159.128.61:443
host: vimeo.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=7 (pair=4), recv: 8089, rounds: 2
close: fd=4 (pair=7), recv: 1010, rounds: 2
accept: fd=4
resolve: vimeo.com
new conn: fd=7, addr=162.159.138.60:443
host: vimeo.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=7 (pair=4), recv: 7069, rounds: 2
close: fd=4 (pair=7), recv: 1207, rounds: 2
accept: fd=4
resolve: api.vimeo.com
new conn: fd=7, addr=162.159.138.60:443
host: api.vimeo.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=7 (pair=4), recv: 8124, rounds: 2
close: fd=4 (pair=7), recv: 1642, rounds: 2
accept: fd=4
resolve: api.vimeo.com
new conn: fd=7, addr=162.159.128.61:443
host: api.vimeo.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=7 (pair=4), recv: 8106, rounds: 2
close: fd=4 (pair=7), recv: 1642, rounds: 2
accept: fd=4
resolve: player.vimeo.com
new conn: fd=7, addr=162.159.128.61:443
host: player.vimeo.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=7 (pair=4), recv: 7376, rounds: 2
close: fd=4 (pair=7), recv: 1889, rounds: 2
accept: fd=4
resolve: vod-adaptive-ak.vimeocdn.com

connect: No route to host

ss error: 65

close: fd=4 (pair=-1), recv: 0, rounds: 0
accept: fd=4
resolve: skyfire.vimeocdn.com
new conn: fd=7, addr=151.101.28.217:443
host: skyfire.vimeocdn.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=7 (pair=4), recv: 5302, rounds: 3
close: fd=4 (pair=7), recv: 1219, rounds: 3
accept: fd=4
resolve: vod-adaptive-ak.vimeocdn.com

connect: No route to host

ss error: 65

close: fd=4 (pair=-1), recv: 0, rounds: 0
accept: fd=4
resolve: skyfire.vimeocdn.com
new conn: fd=7, addr=151.101.28.217:443
host: skyfire.vimeocdn.com (127)
split: pos=0-1 (1), m: DESYNC_SPLIT
split: pos=1-130 (129), m: DESYNC_DISORDER
send: pos=130-517
close: fd=7 (pair=4), recv: 7247, rounds: 3
close: fd=4 (pair=7), recv: 1194, rounds: 3

dig для всех хостов с ошибкой выдаёт корректные данные, ping до них тоже работает. Сам по себе yt-dlp(без прокси через ciadpi) то же по чуть-чуть качает. Маршрутизация на хосте просто до роутера настроена, без всяких заумничеств. Пробовал обычную "качалку" curl, для ютуба такая же ситуация c ошибкой connect: No route to host, правда сообщение об ошибке выглядит почему-то иначе, без строчки resolve:

curl --proxy socks5://127.0.0.1:10801 "https://www.youtube.com/watch?v=9bZkp7q19f0" -o test

accept: fd=4
connect: No route to host
ss error: 65
close: fd=4 (pair=-1), recv: 0, rounds: 0

ошибка в самом curl

curl: (97) cannot complete SOCKS5 connection to www.youtube.com. (4)

Собирал из исходников для NetBSD 9.3(обновлена), крутящейся на RPI2, без ошибок и предупреждений. Cистема:

uname -a

NetBSD ppi 9.3 NetBSD 9.3 (GENERIC) #0: Thu Aug 4 15:30:37 UTC 2022 mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/evbarm/compile/GENERIC evbarm

Думаю дело в IPv6. Он у вас работает? Попробуйте использовать curl с опцией -4. После последних коммитов программа показывает адрес в логах, перед вызовом connect, так что можете собрать программу с ними и посмотреть куда идет подключение.

kfmut commented

@hufrea Нет, IPv6 адреса никак не настраивались, но для curl, действительно, использование опции -4 помогает, а для yt-dlp опция --force-ipv4 почему-то не работает, адрес действительно IPv6 используется

accept: fd=4
resolve: www.youtube.com
new conn: fd=7, pair=4, addr=2404:6800:4006:804::200e:443
connect: No route to host
ss error: 65
close: fd=4 (pair=-1), recv: 0, rounds: 0

Правильно понимаю, что это проблема самой yt-dlp?

Правильно понимаю, что это проблема самой yt-dlp?

Не совсем. Он пытается резолвить адрес через socks. Так что проблема в getaddrinfo (он почему-то возвращает IPv6 адрес, даже если машина к нему подключиться не может). В ciadpi есть опция --no-ipv6, как раз для подобных случаев.

kfmut commented

@hufrea ага, с этой опцией всё работает! Спасибо большое за программу и за помощь!!!