LINUX.ORG.RU

Нужна помощь с непонятным сетевым поведением ipv6/ipv4

 , , , ,


0

1

;tldr решения

http, https, imap, smtp трафик по нестандартным портам в направлении «типичных» хостингов в Европе забанен на многих провайдерах в РФ. Ну это так, из личного печального опыта.

Провайдер или «что-то» резало хттп трафик до иностранного хостинга, при этом tcp успешно устанавливался. Проблема не была связана с непосредственно ipv6


Привет! Потратил кучу времени на то чтобы завести приложение в docker на vps и получить доступ к нему по ipv4

VPS - archlinux

docker –version Docker version 27.2.1, build 9e34c9bb39

Суть проблемы - приложение XXX (на golang) которое поднимается в докере по какой-то причине поднимается на ipv6 [::] хотя адрес я заправляю 0.0.0.0 чтобы запросы летели со всех интерфейсов. При этом в целом ipv4 вроде обслуживается с lo с локалки, но с удаленной машины устанавливается только tcp коннект без отдачи контента сервером:

Лог приложения:
INFO - Web server running HTTP on [::]:65228

TCP соединения на локалке:

> lsof -iTCP
COMMAND     PID            USER FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd-r   294 systemd-resolve 12u  IPv4   3321      0t0  TCP *:llmnr (LISTEN)
systemd-r   294 systemd-resolve 19u  IPv4   3333      0t0  TCP _localdnsstub:domain (LISTEN)
systemd-r   294 systemd-resolve 21u  IPv4   3335      0t0  TCP _localdnsproxy:domain (LISTEN)
sshd        317            root  7u  IPv4   3604      0t0  TCP *:228 (LISTEN)
sshd        317            root  8u  IPv6   3606      0t0  TCP *:228 (LISTEN)
container   322            root  9u  IPv4   3889      0t0  TCP localhost:40909 (LISTEN)
sshd-sess  9268            root  4u  IPv4  78772      0t0  TCP CCC:228->YYY:60970 (ESTABLISHED)
sshd-sess  9282             vpn  4u  IPv4  78772      0t0  TCP CCC:228->YYY:60970 (ESTABLISHED)
XXX      20798            root  7u  IPv6 227414      0t0  TCP *:65228 (LISTEN)
rkn 20822            root  4u  IPv4 227437      0t0  TCP localhost:62789 (LISTEN)
rkn 20822            root  7u  IPv4 227439      0t0  TCP localhost:vce (LISTEN)

docker-compose.yml:

services:
  3xui:
    build:
      context: .
      dockerfile: ./Dockerfile
    container_name: rkn_app
    #hostname: ??? #<- optional
    volumes:
      - $PWD/db/:/etc/x-ui/
      - $PWD/cert/:/root/cert/
    environment:
      rkn_FORCED: "false"
      rkn_ENABLE_FAIL2BAN: "true"
    tty: true
    network_mode: host
    restart: unless-stopped

При этом запрос с loopback на локалке в этот контейнер спокойно долетает и по ipv4:

curl -4 -v -IHEAD "http://0.0.0.0:65228"
curl -4 -v "http://0.0.0.0:65228"
*   Trying 0.0.0.0:65228...
* Connected to 0.0.0.0 () port 65228
> GET / HTTP/1.1
> Host: 0.0.0.0:65228
> User-Agent: curl/8.10.0
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Date: Sun, 07 Sep 2025 20:27:27 GMT
< Transfer-Encoding: chunked
<

tcpdump при локальном запросе:

tcpdump -i any -n tcp port 65228
tcpdump: WARNING: any: That device doesn't support promiscuous mode
(Promiscuous mode not supported on the "any" device)
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
20:29:46.382409 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [S], seq 1906462195, win 65495, options [mss 65495,sackOK,TS val 1137138809 ecr 0,nop,wscale 7], length 0
20:29:46.382425 lo    In  IP 127.0.0.1.65228 > 127.0.0.1.36254: Flags [S.], seq 3063170275, ack 1906462196, win 65483, options [mss 65495,sackOK,TS val 1137138809 ecr 1137138809,nop,wscale 7], length 0
20:29:46.382437 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [.], ack 1, win 512, options [nop,nop,TS val 1137138809 ecr 1137138809], length 0
20:29:46.382932 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [P.], seq 1:78, ack 1, win 512, options [nop,nop,TS val 1137138809 ecr 1137138809], length 77
20:29:46.382941 lo    In  IP 127.0.0.1.65228 > 127.0.0.1.36254: Flags [.], ack 78, win 511, options [nop,nop,TS val 1137138809 ecr 1137138809], length 0
20:29:46.384670 lo    In  IP 127.0.0.1.65228 > 127.0.0.1.36254: Flags [P.], seq 1:4097, ack 78, win 512, options [nop,nop,TS val 1137138811 ecr 1137138809], length 4096
20:29:46.384683 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [.], ack 4097, win 809, options [nop,nop,TS val 1137138811 ecr 1137138811], length 0
20:29:46.384698 lo    In  IP 127.0.0.1.65228 > 127.0.0.1.36254: Flags [P.], seq 4097:9428, ack 78, win 512, options [nop,nop,TS val 1137138811 ecr 1137138811], length 5331
20:29:46.384704 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [.], ack 9428, win 807, options [nop,nop,TS val 1137138811 ecr 1137138811], length 0
20:29:46.384846 lo    In  IP 127.0.0.1.65228 > 127.0.0.1.36254: Flags [P.], seq 9428:13524, ack 78, win 512, options [nop,nop,TS val 1137138811 ecr 1137138811], length 4096
20:29:46.384884 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [.], ack 13524, win 780, options [nop,nop,TS val 1137138811 ecr 1137138811], length 0
20:29:46.385538 lo    In  IP 127.0.0.1.65228 > 127.0.0.1.36254: Flags [P.], seq 13524:17620, ack 78, win 512, options [nop,nop,TS val 1137138812 ecr 1137138811], length 4096
20:29:46.385564 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [.], ack 17620, win 843, options [nop,nop,TS val 1137138812 ecr 1137138812], length 0
20:29:46.385977 lo    In  IP 127.0.0.1.65228 > 127.0.0.1.36254: Flags [P.], seq 17620:21716, ack 78, win 512, options [nop,nop,TS val 1137138812 ecr 1137138812], length 4096
20:29:46.385985 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [.], ack 21716, win 816, options [nop,nop,TS val 1137138812 ecr 1137138812], length 0
20:29:46.386272 lo    In  IP 127.0.0.1.65228 > 127.0.0.1.36254: Flags [P.], seq 21716:21914, ack 78, win 512, options [nop,nop,TS val 1137138813 ecr 1137138812], length 198
20:29:46.386279 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [.], ack 21914, win 815, options [nop,nop,TS val 1137138813 ecr 1137138813], length 0
20:29:46.390340 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [F.], seq 78, ack 21914, win 843, options [nop,nop,TS val 1137138817 ecr 1137138813], length 0
20:29:46.390388 lo    In  IP 127.0.0.1.65228 > 127.0.0.1.36254: Flags [F.], seq 21914, ack 79, win 512, options [nop,nop,TS val 1137138817 ecr 1137138817], length 0
20:29:46.390444 lo    In  IP 127.0.0.1.36254 > 127.0.0.1.65228: Flags [.], ack 21915, win 843, options [nop,nop,TS val 1137138817 ecr 1137138817], length 0

При этом если я делаю запрос со своей реальной машины на VPS сервак на указанный порт - TCP соединение устанавливается, но от сервера HTML страницу я почему-то не получаю (curl запрос подвисает на бесконечность):

ncat -4 -w 1 -vz VPS 65228
Ncat: Version 7.95 ( https://nmap.org/ncat )
Ncat: Connected to VPS:65228.
Ncat: 0 bytes sent, 0 bytes received in 0.06 seconds.

curl -w 1 -4 -v "http://VPS:65228"
*   Trying VPS:65228...
* Connected to VPS (VPS) port 65228
* using HTTP/1.x
> GET / HTTP/1.1
> Host: VPS:65228
> User-Agent: curl/8.12.1
> Accept: */*
> 
* Request completely sent off

На VPS при этом tcpdump следующий:

tcpdump -i any -n tcp port 65228
tcpdump: WARNING: any: That device doesn't support promiscuous mode
(Promiscuous mode not supported on the "any" device)
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
20:39:11.848374 eth0  In  IP myPC.48070 > VPS.65228: Flags [S], seq 782807053, win 64240, options [mss 1456,sackOK,TS val 2703465502 ecr 0,nop,wscale 7], length 0
20:39:11.848551 eth0  Out IP VPS.65228 > myPC.48070: Flags [S.], seq 3026312210, ack 782807054, win 65160, options [mss 1460,sackOK,TS val 3225839648 ecr 2703465502,nop,wscale 7], length 0
20:39:11.887313 eth0  In  IP myPC.48070 > VPS.65228: Flags [.], ack 1, win 502, options [nop,nop,TS val 2703465541 ecr 3225839648], length 0
20:39:13.872647 eth0  Out IP VPS.65228 > myPC.52810: Flags [.], ack 1607925916, win 510, options [nop,nop,TS val 3225841672 ecr 2703328807], length 0
20:39:27.525965 eth0  Out IP VPS.65228 > myPC.48070: Flags [.], ack 1, win 510, options [nop,nop,TS val 3225855325 ecr 2703465541], length 0
20:39:29.232641 eth0  Out IP VPS.65228 > myPC.52810: Flags [R.], seq 1, ack 1, win 510, options [nop,nop,TS val 3225857032 ecr 2703328807], length 0
20:39:42.885896 eth0  Out IP VPS.65228 > myPC.48070: Flags [.], ack 1, win 510, options [nop,nop,TS val 3225870685 ecr 2703465541], length 0
20:39:58.247361 eth0  Out IP VPS.65228 > myPC.48070: Flags [.], ack 1, win 510, options [nop,nop,TS val 3225886047 ecr 2703465541], length 0
20:40:13.605948 eth0  Out IP VPS.65228 > myPC.48070: Flags [.], ack 1, win 510, options [nop,nop,TS val 3225901405 ecr 2703465541], length 0
^C
9 packets captured
10 packets received by filter
0 packets dropped by kernel

Подскажите в чем может быть трабл и как подружить запросы из вне с сервером. Уже всю голову сломал, не понимаю в чем тут собака зарыта. Буду очень признателен за помощь - если чего-то не хватает, пишите какие команды докинуть. Мне очень интересно что конкретно не так, почему сервер отвечает только на сообщения с lo, почему он не посылает html контент в установленное tcp соединение и просто шлет ACK’и без Push’ей, но при этом работает по lo

Я сначала думал что дело в том что оно слушает на ipv6, но curl -4 сбивает меня с толку. Файрвол есть, но он открывает все TCP на 65228, вроде миссконфига не должно быть… + файрвол работает на транспортном уровне, по идее тогда TCP соединение не установилось бы и зареджектилось или таймаутнуло. Сейчас у меня предположение что сервер как-то чекает src ip и в зависимости от этого определяет кидать ответ или нет. Вообще звучит бредово, но пока идей больше нет(((



Последнее исправление: wh75per (всего исправлений: 2)

[::] это и есть 0.0.0.0, т.е. слушать на всех интерфейсах, на всех адресах (И ipv6 и ipv4).

BOOBLIK ★★★★
()
Ответ на: комментарий от BOOBLIK

Читал про это, НО

lsof -iTCP классифицирует слушающий сокет по этому адресу как ipv6

Все коннекты по этому адресу подефолту инициируются как ipv6

В lsof у меня есть ipv4 слушающие сокеты адрес которых прописан как 0.0.0.0

wh75per
() автор топика
Ответ на: комментарий от wh75per

lsof -iTCP классифицирует слушающий сокет по этому адресу как ipv6

Можно пример того, что ты называешь «классификацией» и ссылку на доку lsof где это описано?

Все коннекты по этому адресу подефолту инициируются как ipv6

То как у тебя инициируются коннекты от слущающей стороны не зависит. За это отвечает настройка getaddrinfo в твоей системе через конфиг gai.conf

В lsof у меня есть ipv4 слушающие сокеты адрес которых прописан как 0.0.0.0

Это нормально. Авторы приложений, на сокеты которых ты смотришь, могли сделать эти сокеты с различными флагами/типами (AF_INET, AF_INET6, флаг IPV6_V6ONLY и т.п.). Соотвественно в утилитах типа ss их сокеты будут выглядеть как 0.0.0.0 или [::] или вообще *:порт.

BOOBLIK ★★★★
()
Последнее исправление: BOOBLIK (всего исправлений: 2)

Ну и еще моментик из твоего поста:

curl -4 -v -IHEAD «http://0.0.0.0:65228»

Ты же вот эти нули вставил только для поста на форуме и по правде так не делаешь?

BOOBLIK ★★★★
()

Суть проблемы - приложение XXX (на golang) которое поднимается в докере

А вне докера с этим приложением такая же проблема?

MirandaUser2
()

Подскажите в чем может быть трабл

С вашего компьютера на сервер не приходят пакеты с данными.

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

Читал ваши статьи на хабре, не ожидал тут увидеть)

Все верно, как-то не обратил на это внимание, видимо закопался. Замерил еще tcpdump на ПК и увидел, что действительно HTTP запрос начинает слаться на сервер, но он не долетает и ответа я получить не могу

sudo tcpdump tcp port 65228
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on enp37s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:28:29.846757 IP MYPC.34596 > VPS.65228: Flags [S], seq 920709206, win 64240, options [mss 1460,sackOK,TS val 939279380 ecr 0,nop,wscale 7], length 0
10:28:29.892266 IP VPS.65228 > MYPC.34596: Flags [S.], seq 704710697, ack 920709207, win 65160, options [mss 1456,sackOK,TS val 3413192935 ecr 939279380,nop,wscale 7], length 0
10:28:29.892295 IP MYPC.34596 > VPS.65228: Flags [.], ack 1, win 502, options [nop,nop,TS val 939279425 ecr 3413192935], length 0
10:28:29.892361 IP MYPC.34596 > VPS.65228: Flags [P.], seq 1:85, ack 1, win 502, options [nop,nop,TS val 939279425 ecr 3413192935], length 84
10:28:30.146399 IP MYPC.34596 > VPS.65228: Flags [P.], seq 1:85, ack 1, win 502, options [nop,nop,TS val 939279680 ecr 3413192935], length 84
10:28:30.394408 IP MYPC.34596 > VPS.65228: Flags [P.], seq 1:85, ack 1, win 502, options [nop,nop,TS val 939279928 ecr 3413192935], length 84
10:28:30.890399 IP MYPC.34596 > VPS.65228: Flags [P.], seq 1:85, ack 1, win 502, options [nop,nop,TS val 939280424 ecr 3413192935], length 84
10:28:31.898404 IP MYPC.34596 > VPS.65228: Flags [P.], seq 1:85, ack 1, win 502, options [nop,nop,TS val 939281432 ecr 3413192935], length 84
10:28:33.882404 IP MYPC.34596 > VPS.65228: Flags [P.], seq 1:85, ack 1, win 502, options [nop,nop,TS val 939283416 ecr 3413192935], length 84
10:28:37.850405 IP MYPC.34596 > VPS.65228: Flags [P.], seq 1:85, ack 1, win 502, options [nop,nop,TS val 939287384 ecr 3413192935], length 84
10:28:45.978412 IP MYPC.34596 > VPS.65228: Flags [P.], seq 1:85, ack 1, win 502, options [nop,nop,TS val 939295512 ecr 3413192935], length 84
^C
11 packets captured
11 packets received by filter
0 packets dropped by kernel

Получается что-то режет мне трафик до моей VPS, т.к. на VPS в дампе я уже этих запросов не вижу, но не понятно почему. Файрволов вроде опять же у меня нет, может быть мне этот порт забанили… Попробую на другом подняться

wh75per
() автор топика
Ответ на: комментарий от BOOBLIK

Я именно так и делаю) А как нужно и почему так не стоит делать? Это из серии «замедляется переход на ipv6 из-за хардкода под в4»? Слушать со всех интерфейсов проще чем писать конкретный адрес, а с в6 очень поверхностно знаком, буду теперь стараться юзать [::], если дело только в «красивости» записи

wh75per
() автор топика
Ответ на: комментарий от BOOBLIK

Можно пример того, что ты называешь «классификацией» и ссылку на доку lsof где это описано?

https://man7.org/linux/man-pages/man8/lsof.8.html

UNIX socket file endpoint information is displayed in the NAME column in the form ``type=TYPE ->INO=INODE PID,cmd,FDmode'', where TYPE is the socket type;
...
 When an open IPv4 network file's address is mapped in an IPv6 address, the open file's type will be IPv6, not IPv4, and its display will be selected by '6', not '4'.

Понять как работает эта «классификация» можно уже только по сурсцам

Я не учел, что можно создать один сокет сразу под в4 и в6, при этом сокет с выключенной опцией IPV6_V6ONLY скорее всего будет отображаться в lsof просто как IPV6, а я ожидал увидеть, что там будет два файла

Спасибо, теперь понятнее стало почему на VPS инициируются в6 коннекты при подключении по дефолту. Ну и понятно теперь что дело ни в каком не в6

wh75per
() автор топика
Ответ на: комментарий от wh75per

65229 тоже не прошел порт, еще поиграюсь с этим, но глобально пока не понятно почему HTTP трафик выфилтровывается и не долетает до системы

На всякий случай с другого попробовал компа прокинуть курл - эффект тот же. Сейчас в планах попробовать из другой сети достучаться какой-нибудь

wh75per
() автор топика
Ответ на: комментарий от wh75per

А ты нужные порты пробрасываешь в docker?

-p port:port

BRE ★★
()
Последнее исправление: BRE (всего исправлений: 1)
Ответ на: комментарий от wh75per

http, https, imap, smtp трафик по нестандартным портам в направлении «типичных» хостингов в Европе забанен на многих провайдерах в РФ. Ну это так, из личного печального опыта.

BOOBLIK ★★★★
()
Ответ на: комментарий от BOOBLIK

Подтверждаю - проблема была связана с этой крутой фичей. Поднял на порту 81 - все заработало

Вообще была идея заспавнить 2**16 веб серверов с хттп эхо сервером,и пройтись скриптом чтобы прочекать какие порты блокают, но что-то лень этим заниматься)

Думаю что топик можно отмечать как solved

wh75per
() автор топика
Ответ на: комментарий от beastie

Вообще так работает, еще до заведения темы на форуме проверил это тем, что внутри докер контейнера поднял ncat с рандомным листеном на произвольном порту. В итоге смог подключиться по tcp туда со своего ПК.

Может и хак плохой, но рабочий) энивей проблема решена, бублик хорошо описал суть проблемы

wh75per
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.