내 잡다한 노트
오버레이 네트워크 본문
오버레이 네트워크는 물리적 네트워크 위에 가상 네트워크를 생성하여 여러 호스트 간 통신을 가능하게 하는 네트워크 기술입니다. 이 가상 네트워크는 물리적 네트워크를 캡슐화(encapsulation)하여 논리적으로 격리된 네트워크 환경을 제공합니다.
오버레이 네트워크는 컨테이너나 VM과 같은 가상 환경 간의 통신을 지원하며, 다음과 같은 주요 구성 요소로 이루어져 있습니다:
1.1. 가상 네트워크 (Virtual Network)
- 물리적 네트워크와 독립적으로 작동하며, 각 컨테이너나 VM은 가상 네트워크를 통해 통신합니다.
- 논리적으로 구성되기 때문에 네트워크를 세분화하고, 격리된 환경을 제공할 수 있습니다.
1.2. 캡슐화 (Encapsulation)
- 네트워크 트래픽은 VXLAN(또는 GRE, IPsec) 프로토콜을 사용해 물리적 네트워크에 캡슐화됩니다.
- 캡슐화된 패킷은 물리적 네트워크를 통해 전달되며, 목적지에서 디캡슐화(decapsulation)되어 원래의 트래픽으로 복원됩니다.
2. 오버레이 네트워크의 작동 원리
- 캡슐화된 트래픽:
- 컨테이너 또는 VM 간의 트래픽은 물리적 네트워크에서 직접 전송되지 않고, 캡슐화된 패킷으로 변환됩니다.
- 캡슐화된 패킷은 물리적 네트워크의 IP와 포트를 통해 전송되며, 수신 측에서 디캡슐화됩니다.
- VXLAN (Virtual Extensible LAN):
- 가장 널리 사용되는 오버레이 네트워크 프로토콜로, UDP 기반의 캡슐화 방식을 사용합니다.
- 각 패킷에는 **VXLAN ID(VNI)**가 포함되어 가상 네트워크를 식별합니다.
- 최대 16M(16777216) 개의 논리적 네트워크를 지원합니다.
- 서비스 디스커버리:
- 오버레이 네트워크는 DNS 기반의 서비스 디스커버리를 통해 컨테이너나 VM 간의 통신을 자동으로 라우팅합니다.
- 컨테이너 이름 또는 서비스 이름을 통해 통신할 수 있습니다.
- 라우팅:
- Docker Swarm이나 Kubernetes는 노드 간 통신 경로를 자동으로 설정하여 패킷을 올바른 컨테이너로 전달합니다.
작동 과정:
- 컨테이너 간 통신 요청:
- 컨테이너가 다른 노드에 있는 컨테이너로 패킷을 전송하려고 하면, Docker는 해당 패킷을 캡슐화합니다.
- 캡슐화된 패킷은 VXLAN 헤더를 포함하며, 이 헤더는 패킷이 어떤 오버레이 네트워크에 속하는지 식별합니다.
- 노드 간 라우팅:
- 캡슐화된 패킷은 물리적 네트워크를 통해 대상 노드로 전달됩니다.
- 이 과정에서 물리적 네트워크 장비(스위치, 라우터)는 VXLAN 캡슐화 정보를 알 필요 없이 단순히 IP 패킷을 전달합니다.
- 목적지 도착 및 디캡슐화:
- 목적지 노드에서 Docker는 VXLAN 캡슐화를 제거한 후, 원래 패킷을 대상 컨테이너에 전달합니다.
보안 측면
"외부 네트워크에 노출되지 않는다"는 것은 다음과 같은 맥락에서 이해할 수 있습니다:
- 캡슐화로 보호:
- VXLAN 캡슐화는 패킷의 실제 데이터를 숨깁니다. 외부 네트워크에서 이 패킷을 스니핑(sniffing)하더라도, 캡슐화되지 않은 원본 데이터를 해석하기 어렵습니다.
- 네트워크 격리:
- 오버레이 네트워크는 Docker가 논리적으로 생성한 가상 네트워크로, 컨테이너가 연결된 오버레이 네트워크 간에는 통신이 격리됩니다.
- 동일한 물리적 네트워크를 공유하더라도, 다른 오버레이 네트워크에 속한 컨테이너와는 통신할 수 없습니다.
- 외부 접근 차단:
- 컨테이너와 컨테이너 간 통신은 오버레이 네트워크 내부에서만 가능하며, 외부 네트워크에서 컨테이너에 직접 접근하려면 별도의 네트워크 설정이 필요합니다(예: 포트 노출).
- 옵션: 암호화:
- Swarm은 노드 간 통신을 암호화할 수 있습니다(--opt encrypted 옵션). 이 경우, 캡슐화된 패킷이 암호화되므로 물리적 네트워크에서 패킷을 가로채더라도 해독이 불가능합니다.
3. 물리적 네트워크를 거치는 한계
말씀하신 대로, 패킷은 물리적 네트워크(스위치, 라우터)를 통해 전달됩니다. 따라서 아래와 같은 상황에서는 오버레이 네트워크도 완전한 보안을 보장하지 못합니다:
- 네트워크 트래픽 가로채기:
- 캡슐화된 상태의 패킷이라도 스니핑 도구로 가로챌 수 있습니다.
- 캡슐화된 데이터를 복호화할 방법을 알면 보안이 깨질 수 있습니다.
- 노드 간 신뢰:
- 오버레이 네트워크는 Swarm 클러스터의 노드 간 신뢰를 전제로 합니다. 악의적인 노드가 클러스터에 추가되면 트래픽을 도청하거나 조작할 수 있습니다.
왜 외부 포트 제한과 상관없이 통신이 가능한가?
1. 오버레이 네트워크의 가상 네트워크 구현
- 오버레이 네트워크는 컨테이너 간 통신을 위한 가상 네트워크를 생성합니다.
- 이 가상 네트워크에서는 물리적 네트워크와는 독립적으로 IP 주소와 포트가 사용됩니다.
- 즉, 컨테이너 A와 B가 오버레이 네트워크 내에서 각각 8000번 포트를 사용하더라도, 물리적 네트워크의 외부 포트와는 무관합니다.
2. 캡슐화된 트래픽
- 컨테이너 간 트래픽은 VXLAN 캡슐화를 통해 물리적 네트워크에서 전송됩니다.
- 캡슐화된 패킷은 물리적 네트워크에서 지정된 포트(VXLAN은 UDP 4789)를 통해 이동합니다. 즉, 외부로 노출된 포트 범위와는 무관합니다.
3. 노드 간 통신에서 사용되는 포트
- Docker Swarm에서 오버레이 네트워크를 구성하면, 노드 간 통신은 VXLAN과 Swarm 관련 포트만 사용합니다:
- UDP 4789: VXLAN 트래픽(노드 간 컨테이너 통신).
- TCP/UDP 7946: 노드 간 클러스터 관리 트래픽.
- TCP 2377: Swarm 초기화 및 관리 트래픽.
컨테이너 간 트래픽은 이 포트들을 통해 캡슐화되어 전달됩니다. 따라서 물리적 네트워크의 외부 포트 제한은 컨테이너 간 통신에 영향을 미치지 않습니다.
'DevOps > docker' 카테고리의 다른 글
Docker buildkit 이란? (0) | 2024.12.26 |
---|---|
도커 컨테이너와 VM의 차이 (0) | 2024.12.05 |
Dockerfile 멀티 스테이지 빌드 (1) | 2024.11.30 |
Dockerfile 최적화 방안 (0) | 2024.11.30 |
도커파일에서 UID를 작성하는 이유 (0) | 2024.11.26 |