Персональная страница Андрея Синицына

История одного дебага

Прикольный пятничный дебаг сейчас случился

Для тележного прокси я юзаю свой 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🤷‍♂️