네트워크 구성(가상 브리지/가상 NIC)
개념
Linux에 Docker을 설치하면, 서버의 물리 NIC가 docker0라는 가상 브리지 네트워크로 연결됩니다.
이 docker0는 Docker를 실행 후 디폴트로 만들어집니다.
Docker 컨테이너는 실행 시 컨테이너에 172.17.0.0/16라는 서브넷 마스크를 가진 프라이빗 IP 주소가 eth0로 자동 할당됩니다.
그리고 가상 NIC는 OSI 참조 모델의 레이어 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에서 NAPT 기능을 사용할 때는 컨테이너 시작 시 컨테이너 안에서 사용하고 있는 포트를 가상 브리지인 docker0에 대해 개방합니다. 예를 들어 컨테이너 시작 시에 컨테이너 안 웹 서버가 사용하는 80번 포트를 호스트 OS의 8080번 포트로 전송하도록 설정하면, 호스트 OS의 8080번 포트에 액세스시 컨테이너 안의 80 포트로 연결합니다.
💡 Ubuntu에서 Docker 사용시, ufw를 통해 포트를 개방하지 않더라도 접근 가능한 이유가 Docker가 iptables를 직접 수정해 포트를 개방시킵니다. 참고) https://security-gom.tistory.com/65
NAT와 NAPT의 차이
NAT(Network Address Translation) 라우터는 클라이언트의 프라이빗 IP주소를 NAT가 가지고 있는 글로벌 IP 주소로 상호 변환합니다. NAT의 경우 글로벌 IP 주소와 프라이빗 IP 주소를 1:1로 변환하기 때문에 동시에 여러 클라이언트가 액세스 할 수 없습니다.
NAPT(Network Address Port Translation)은 IP 주소와 함께 포트도 변환합니다. 내부의 클라이언트가 외부에 요청을 보내면 응답을 포트로 구분하여 맞게 받을 수 있습니다. 이로써 내부에 여러 클라이언트가 있어도 포트로 알맞은 응답을 받을 수 있습니다.
'인프라' 카테고리의 다른 글
오픈스택과 TripleO 아키텍처 (0) | 2024.06.08 |
---|---|
클라우드 (0) | 2024.06.05 |
씬 프로비저닝과 씩 프로비저닝 (0) | 2024.05.28 |
IPv4와 서브넷 (0) | 2024.05.28 |