
머리를 긁적거리게 만드는 복잡한 네트워킹 문제에 직면했습니다. 상황은 이렇습니다. 외부에서 포트 80과 433에 액세스할 수 없지만 Docker 내의 다른 포트는 전달할 수 있으며 완벽하게 작동합니다! UFW를 설정하고 K3도 설치했지만 대부분의 서비스는 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"