iptables 명령어를 이용하여 포트를 열어도 docker에서 노출된 포트는 외부에서 접근이 불가능합니다.

iptables 명령어를 이용하여 포트를 열어도 docker에서 노출된 포트는 외부에서 접근이 불가능합니다.

Linux 기반 서버에 샘플 docker tar 이미지가 있고 아래와 같이 docker run 명령을 통해 이미지를 실행했습니다. 여기서 9521f101839f는 이미지 ID입니다.

docker run -p 0.0.0.0:9895:9898 -td 9521f101839f

이제 도커 컨테이너가 존재하고 프로젝트(나머지 API)가 내 서버 내에서 제대로 작동하고 있습니다.

docker ps 명령 출력도 올바르게 보입니다.

a97904cb07d1 localhost/elk-spring-boot.jar:latest 22 minutes ago Up 22 minutes ago 0.0.0.0:9895->9898/tcp compassionate_goldberg

보시다시피 9895를 외부 세계에 노출시킵니다.

 iptables -I INPUT -p tcp -m tcp --dport 9895 -j ACCEPT

위의 iptables 명령을 사용하여 포트 9895를 열었습니다.

[root@pxgrid-163 localdisk]# iptables -nvL | grep 9895
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9895
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9895
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9895
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9895
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9895

그러나 다른 Linux 기반 서버(또는 랩탑 CLI)에서 이 Docker 컨테이너 서버로 컬링하려고 하면 연결할 수 없습니다. Docker 컨테이너를 보관하는 서버 내부에서 모든 것에 올바르게 액세스할 수 있습니다. 그런데 별도의 서버(혹은 노트북)에서 Curl을 실행하여 api(docker run api)에 접근하려고 하면 접근이 되지 않습니다.

이것이 예상되는 동작입니까? 항구가 외부세계에 노출되어 있기 때문에 외부에서 접근이 가능해야 하는 것 아닌가요? 여기서 뭔가 빠졌나요?

다음은 ifconfig를 실행할 때 나타나는 네트워크 인터페이스 목록입니다.

여기서는 어떤 인터페이스_ip에 대해 이야기하고 있나요? eth0인가요? ifconfig를 실행하면 많은 인터페이스가 보입니다.

ifconfig
cni-podman0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.88.0.1  netmask 255.255.0.0  broadcast 10.88.255.255

cni-podman1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 169.254.2.1  netmask 255.255.255.0  broadcast 169.254.2.255

cni-podman2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 169.254.4.1  netmask 255.255.255.0  broadcast 169.254.4.255

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.23.166.163  netmask 255.255.255.0  broadcast 172.23.166.255

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0        

veth506e78cf: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500 

veth6c80d69f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        
vethe32079e7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

답변1

Doker는 귀하의 컴퓨터에 자체 네트워크 172.16.0.0/12를 가지고 있습니다.

노력하다

-p your_interface_ip:9895:9898

또한 IP 전달이 활성화되어 있는지 확인하십시오.

sysctl -w net.ipv4.ip_forward=1

https://docs.docker.com/config/containers/container-networking/

https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/

답변2

내 서버에서 IP 전달을 활성화하려면 다음 2단계를 따라야 했습니다.

  1. IP 전달을 허용하도록 Linux 커널을 구성합니다. - sysctl net.ipv4.conf.all.forwarding=1
  2. iptables FORWARD 정책을 DROP에서 ACCEPT로 변경 - iptables -P FORWARD ACCEPT

그 후에는 내 노트북은 물론 다른 서버에서도 API에 액세스할 수 있습니다.

관련 정보