
Я столкнулся с запутанной сетевой проблемой, которая заставляет меня чесать голову. Вот ситуация: я не могу получить доступ к портам 80 и 433 извне, но я могу перенаправить любой другой порт в Docker, и это работает безупречно! Я настроил UFW и также установил K3s, но большая часть моих служб работает с использованием Docker Compose.
Для дальнейшего изучения я запустил тестовый контейнер Nginx, и ситуация приняла еще более странный оборот.
Я могу получить доступ к этому тестовому контейнеру, используя его внутренний Docker IP, но даже простой curl -I 127.0.0.1
способ приводит к ошибке 404:
-> # curl -I 127.0.0.1
HTTP/1.1 404 Not Found
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Wed, 20 Sep 2023 00:39:26 GMT
Content-Length: 19
Сюжет становится еще интереснее, когда я обнаруживаю, что могу получить к нему доступ с другого внутреннего IP-адреса (сети VPN):
-> # curl -I 192.168.10.1
HTTP/1.1 200 OK
Server: nginx/1.25.2
Date: Wed, 20 Sep 2023 00:41:32 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 15 Aug 2023 17:03:04 GMT
Connection: keep-alive
ETag: "64dbafc8-267"
Accept-Ranges: bytes
Но вот в чем загвоздка: когда я останавливаю контейнер, можно было бы ожидать увидеть такую ошибку:
-> # curl -I 127.0.0.1
curl: (7) Failed to connect to 127.0.0.1 port 80 after 0 ms: Couldn't connect to server
Однако нет, я снова сталкиваюсь с той же постоянной ошибкой 404!
ОБНОВЛЯТЬ:Добавляя загадочности, когда я отключаю контейнер Docker, попытка доступа 192.168.10.1
также приводит к ошибке 404:
-> # curl -I 192.168.10.1
HTTP/1.1 404 Not Found
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Wed, 20 Sep 2023 00:51:49 GMT
Content-Length: 19
Я в полном замешательстве и не имею ни малейшего понятия, откуда возникла проблема. Чтобы еще больше запутать ситуацию, я могу повторить этот эксперимент с портом 81, и все будет работать так, как и ожидалось. Если у кого-то есть какие-либо идеи или предложения по отладке этого, я буду очень признателен за вашу помощь!
Вот еще несколько выводов:
-> # lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 9815 root 4u IPv4 54638 0t0 TCP *:http (LISTEN)
docker-pr 9823 root 4u IPv6 48079 0t0 TCP *:http (LISTEN)
-> # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
975e74d4bdfd nginx:latest "/docker-entrypoint.…" 29 minutes ago Up 29 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx_test_nginx-test_1
-> # ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
Anywhere ALLOW 192.168.1.0/24
Anywhere ALLOW 192.168.178.0/24
81/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
81/tcp (v6) ALLOW Anywhere (v6)
Anywhere on eth0 ALLOW FWD Anywhere on wghub
Anywhere on wghub ALLOW FWD Anywhere on wghub
Anywhere (v6) on eth0 ALLOW FWD Anywhere (v6) on wghub
Anywhere (v6) on wghub ALLOW FWD Anywhere (v6) on wghub
-> # netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:10010 0.0.0.0:* LISTEN 1374/containerd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 631/sshd: /usr/sbin
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9815/docker-proxy
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 610/systemd-resolve
tcp6 0 0 :::22 :::* LISTEN 631/sshd: /usr/sbin
tcp6 0 0 :::80 :::* LISTEN 9823/docker-proxy
-> # cat /etc/default/docker
DOCKER_OPTS="--iptables=false"
ОБНОВЛЯТЬ:Вот моя тестовая конфигурация:
docker-compose.yml
version: '3'
services:
nginx-test:
image: nginx:latest
ports:
- "80:80"