[Docker] 네트워크 구성, NAT vs NAPT
네트워크 구성(가상 bridge/ 가상 NIC)
- Linux는 Docker를 설치하면 서버의 물리 NIC(Network Interface Card)가 docker0이라는 가상 브리지 네트워크로 연결된다
- docker0은 Docker를 실행시키면 기본적으로 만들어진다
- Docker 컨테이너가 실행되면 컨테이너에 172.17.0.0/16라는 서브넷 마스크를 가진 Private IP가 eth0으로 자동 할당된다
- 이 가상 NIC는 OSI Layer 2인 가상 네트워크 인터페이스로, 페어인 NIC와 터널링 통신을 한다
- 가상 NIC(vethxxx)는 컨테이너에서 eth0으로 인식된다
- Docker 컨테이너와 외부 네트워크가 통신할 때는 가상 브리지 docker0와 호스트 OS의 물리 NIC에서 패킷을 전송하는 장치가 필요
- Docker에서는 NAPT 기능을 사용하여 연결한다
NAPT(Network Address Port Translation)란 하나의 IP 주소를 여러 컴퓨터가 공유하는 기술로, IP 주소와 포트 번호를 변환하는 기능이다. 프라이빗 IP 주소와 글로벌 IP 주소를 투과적으로 상호 변환하는 기술로, TCP/IP의 포트 번호까지 동적으로 변환하기 때문에 하나의 글로벌 IP 주소로 여러 대의 머신이 동시에 연결할 수 있다. Docker에서는 NAPT로 Linux의 iptables를 사용한다.
- Docker에서는 컨테이너 시작 시에 컨테이너 안에서 사용하고 있는 포트를 가상 브리지인 docker0에 대해 개방한다.
- ex) 컨테이너 시작 시에 컨테이너 안의 웹 서버가 사용하는 80 포트를 호스트 OS의 8080 포트로 전송하도록 설정
- 외부 네트워크에서 호스트 OS의 8080 포트에 액세스 하면 컨테이너 안의 80 포트로 연결됨
NAT와 IP 마스커레이드(NAPT) 차이
NAT(Network Address Translation)
프라이빗 IP 주소가 할당된 클라이언트가 인터넷상에 있는 서버에 액세스 할 때 NAT 라우터는 클라이언트의 프라이빗 IP 주소를 NAT가 갖고 있는 퍼블릭 IP 주소로 변환하여 요청을 송신한다. 응답은 NAT 라우터가 송신처를 클라이언트의 프라이빗 IP 주소로 변환하여 송신한다.
이러한 주소 변환에 의해 프라이빗 네트워크상의 컴퓨터와 인터넷상의 서버 간의 통신이 성립된다. 그런데 NAT의 경우 퍼블릭 IP 주소와 프라이빗 IP 주소를 1:1로 변환하기 때문에 동시에 여러 클라이언트가 액세스 할 수 없다.
NAPT(Network Address Port Translation)
프라이빗 IP 주소와 함께 포트 번호도 같이 변환하는 기술이다. 프라이빗 IP 주소를 퍼블릭 IP 주소로 변환할 때 프라이빗 IP 주소별로 서로 다른 포트 번호로 변환한다.
예를 들어 클라이언트 A가 보낸 요청은 포트 번호 23479로 하고, 클라이언트 B가 보낸 요청은 포트 번호 3000으로 한다. 인터넷상의 서버로부터 NAPT의 퍼블릭 IP 주소의 서로 다른 포트 번호 앞으로 응답이 되돌아온다.
NAPT는 포트 번호를 바탕으로 프라이빗 IP 주소로 변환할 수 있다. 이로써 하나의 퍼블릭 IP 주소와 여러 개의 프라이빗 IP 주소를 변환할 수 있다.
<참고자료>
'완벽한 IT 인프라 구축을 위한 Docker 2판'
https://kimjingo.tistory.com/39?category=944803