Привет! Потратил кучу времени на то чтобы завести приложение в 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 и в зависимости от этого определяет кидать ответ или нет. Вообще звучит бредово, но пока идей больше нет(((