История одного дебага
Прикольный пятничный дебаг сейчас случился
Для тележного прокси я юзаю свой ssh-manager и он же вкручен в firefox, чтобы глобально vpn в системе включен не был, но всегда был браузер, который ходит через туннель
И вот, внезапно, браузер отваливается с таймаутом. Телега продолжает работать. Что, блять, за нафиг? Тыкаю курлом
curl --socks5-hostname localhost:1080 ifconfig.me
Нифига, висит жестко. Обрываю по ^C, пингую.. Пинги уходят в молоко. Ну, видимо, надо писать в саппорт, но телега-то работает...
Переключаю менеджера на другой сервер, все работает супер. Значит проблема и правда в конкретном сервере, а не в РКН, который нащупал мой ssh (такое предположение тоже было)
Иду на сервер по ssh, заходит без проблем. Пробую курлом там, все работает идеально. Значит проблема где-то между моим исходящим интерфейсом и его входящим. Но где?
Возвращаюсь в консоль и вижу, что курл, который я там забыл, внезапно отработал. Надо посмотреть подробности, запускаю с verbose
andreysinitsyn@eva ~/work> curl -v --socks5-hostname localhost:1080 ifconfig.so
* Host localhost:1080 was resolved.
* IPv6: ::1
* IPv4: 127.0.0.1
* Trying [::1]:1080...
* connect to ::1 port 1080 from ::1 port 51318 failed: Connection refused
* Trying 127.0.0.1:1080...
* Connected to localhost (127.0.0.1) port 1080
* SOCKS5 connect to ifconfig.so:80 (remotely resolved)
!!!! ВОТ ЗДЕСЬ ВИСИМ ОЧЕНЬ ДОЛГО !!!!
* SOCKS5 request granted.
* Connected to localhost (127.0.0.1) port 1080
> GET / HTTP/1.1
> Host: ifconfig.so
> User-Agent: curl/8.7.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Server: nginx
< Date: Fri, 26 Jun 2026 11:48:29 GMT
< Content-Type: text/plain
< Content-Length: 13
< Connection: keep-alive
<
* Connection #0 to host localhost left intact
!!!! А вот здесь я таки получаю айпишник своего удаленного сервера !!!!
А у курла нет таймаута на http-запрос, если его явно не воткнуть... Значит запрос проходит, но с ебически большим таймаутом. С каким? Запускаю курл под таймом
andreysinitsyn@eva ~/work> time curl --socks5-hostname 127.0.0.1:1080 ifconfig.me
!!!! Здесь IP моего сервера !!!!
________________________________________________________
Executed in 134.69 secs fish external
usr time 11.64 millis 0.32 millis 11.32 millis
sys time 16.48 millis 1.62 millis 14.86 millis
Ага, блять! 134 секунды.. какая интересная цифра😊 Здесь не читайте дальше и попробуйте угадать, в чем было дело
134 секунды — это дефолтный таймаут TCP-коннекта в Linux: tcp_syn_retries = 6, экспоненциальный бэкофф 1+2+4+8+16+32 плюс финальные ~64с ожидания, это примерно 127 секунд до отказа. Когда что-то висит ровно столько и потом вдруг работает, то это почти всегда проеб по одному из address family с фоллбэком на другой
Курл нормально отрабатывает на сервере, но не работает с клиента. Проблема в address family, смотрю ifconfig и вижу настроенный ipv6. По дефолтным приоритетам ipv6-адреса используются первыми. Давайте проверим. Сначала получим ipv4-адрес и дернем его явно
andreysinitsyn@eva ~/work> dig +short A ifconfig.me
34.160.111.145
andreysinitsyn@eva ~/work> curl --socks5-hostname 127.0.0.1:1080 http://34.160.111.145
fault filter abort
Какой такой аборт? А, ну да, ну да. Такое отдает гугловский edge, если ему не передать правильный хост. Добавим заголовочек
andreysinitsyn@eva ~/work> curl --socks5-hostname 127.0.0.1:1080 -H "Host: ifconfig.me" http://34.160.111.145
!!!! И тут уже получаю правильный айпишник моего сервера !!!!
Огонь! Причину нашли, теперь надо починить. Можно полностью сломать логику ipv6-адресации на хосте
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
Но тогда сломается резолв, например, localhost в ::1
Сделаем гуманнее: просто меняем приоритет в /etc/gai.conf, добавлением туда вот такой строчки
precedence ::ffff:0:0/96 100
Проверяем
root@golden-almandite23248:~# getent ahosts ifconfig.me
34.160.111.145 STREAM ifconfig.me
34.160.111.145 DGRAM
34.160.111.145 RAW
2600:1901:0:b2bd:: STREAM
2600:1901:0:b2bd:: DGRAM
2600:1901:0:b2bd:: RAW
Да, it works!!! IPv4 резолвятся в приоритете. Рестарчу sshd, чтобы все текущие коннекты обновились и все работает
И все это было сделано без помощи LLM, ручки-то помнят. Догадался по цифре в 134 секунды в time
PS Почему работала телега? А ей не надо вообще резолвить хостнеймы, у нее там жестко зашиты ipv4-адреса
PPS Пинги не проходили, потому что провайдер фильтрует ICMP🤷♂️