Network Namespace

Yu Sang Min·2025년 6월 26일

CKA

목록 보기
73/110

🌐 Network Namespace in Linux


🔥 Network Namespace란?

  • 하나의 리눅스 호스트 안에서 독립된 네트워크 스택을 제공
  • 컨테이너(도커, 쿠버네티스)가 네트워크를 격리하는 기술의 핵심
  • 각 네임스페이스는 자신의 네트워크 인터페이스, 라우팅 테이블, ARP 테이블을 가짐

🏠 네임스페이스 개념 비유

  • 🏠 Host = 집
  • 🚪 Namespace = 방
  • 각 방(네임스페이스)은 독립적이며, 서로 보이지 않음
  • 부모인 호스트는 모든 방을 볼 수 있음

🧠 Process Namespace와의 관계

  • 컨테이너 안에서는 PID 1로 보임 (자신만 존재한다고 인식)
  • 호스트에서는 해당 컨테이너의 프로세스가 일반 프로세스로 보임
  • 결론: 컨테이너 안팎에서 다른 프로세스 ID로 실행되는 동일한 프로세스
  • 호스트 내부에서 컨테이너가 생성되면 고유한 인터페이스를 갖는다 (+ Routing Table, ARP Table)

⚙️ Network Namespace 생성 및 확인

1️⃣ 네임스페이스 생성

ip netns add red
ip netns add blue

2️⃣ 리스트 확인

ip netns list

3️⃣ 네임스페이스 내부에서 명령어 실행

ip netns exec red ip link
ip -n red link
ip netns exec red arp # 네임스페이스 내부 ARP 테이블 조회 명령어
ip netns exec red route

🚫 격리 상태 확인

  • 네임스페이스 내에서는 호스트의 네트워크 인터페이스가 보이지 않음
  • lo (loopback)만 존재

🔗 Namespace 간 연결 — veth 가상 케이블

  • veth pair 생성
ip link add veth-red type veth peer name veth-blue
  • 각 인터페이스를 네임스페이스에 연결
ip link set veth-red netns red
ip link set veth-blue netns blue
  • IP 할당 및 활성화
ip netns exec red ip addr add 192.168.15.1/24 dev veth-red
ip netns exec blue ip addr add 192.168.15.2/24 dev veth-blue

ip netns exec red ip link set veth-red up
ip netns exec blue ip link set veth-blue up

ip netns exec red ping 192.168.15.2

ip netns exec red arp # 해당 호스트의 ARP 테이블 조회
ip netns exec blue arp

✅ → Namespace 간 통신 성공


🏗️ 다수 Namespace 연결 — Linux Bridge 사용

1. 브릿지 생성

  • 여러 솔루션이 있지만 예시에선 LINUX BRIDGE 사용
  • 이것은 호스트안에 격리된 네트워크인 네임스페이스 끼리의 통신을 위한 가상의 스위치로 생각하면 됨
ip link add v-net-0 type bridge
ip link # 추가된 v-switch 인터페이스 확인 가능, default는 DOWN 되어있음 고로 up 명령어 실행
ip link set v-net-0 up

2. veth 생성 및 브릿지 연결

ip -n red del veth-red # 기존 케이블 삭제, 기존 링크를 삭제하면 반대쪽 통신의 끝도 자동으로 삭제됨
ip link add veth-red type veth peer name veth-red-br # 가상 스위치에 설정할 가상 인터페이스 생성
ip link add veth-blue type veth peer name veth-blue-br
ip link set veth-red netns red
ip link set veth-blue netns blue
ip link set veth-red-br master v-net0
ip link set veth-blue-br master v-net0

3. 네임스페이스 내 설정

ip netns exec red ip addr add 192.168.15.1 dev veth-red
ip netns exec blue ip addr add 192.168.15.2 dev veth-blue
ip netns exec red ip link set veth-red up
ip -n blue link set veth-blue up 

✔️ 호스트에서 브릿지에 IP 할당 (호스트 ↔ 네임스페이스 통신)

ip addr add 192.168.15.5/24 dev v-net-0
# 네임스페이스 내부가 아닌 호스트와 통신하기 위한 IP를 가상 스위치에 부여
# 192.168.15.5는 네임스페이스에서 호스트와 통신이 가능한 
# 가상 스위치의 게이트웨이이고 호스트는 게이트웨이 역할을 하여 외부 네트워크인 
# 192.168.1.0 (LAN) 과 통신 가능
# 외부 네트워크에는 192.168.1.3 IP를 가진 호스트가 따로 존재한다고 가정
  • 이제 호스트에서ping 192.168.15.1 → red 네임스페이스로 연결됨

🌍 외부 네트워크 연결 (NAT + 라우팅)

1. 라우팅 추가

ip netns exec red ip route add default via 192.168.15.5

2. NAT 설정 (IP Masquerading)

iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
  • 🔥 이제 네임스페이스에서 외부 인터넷 접근 가능
ip netns exec red ping 8.8.8.8

🔥 외부 → 네임스페이스 접근 (Port Forwarding)

  • 예시: 호스트의 8080 포트를 네임스페이스의 80 포트로 포워딩
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.15.1:80
  • 호스트의 http://<호스트IP>:8080 → 네임스페이스의 웹 서비스로 연결

🧠 핵심 정리

기능도구
네임스페이스 생성ip netns add
가상 인터페이스 연결ip link add type veth
브릿지 생성 및 연결ip link add type bridge
네임스페이스간 통신브릿지 + veth
외부 연결IP Masquerade + Routing
외부에서 내부로 포워딩iptables DNAT (Port Forward)

🏆 이해하면 Docker, Kubernetes가 보인다

  • Docker는 내부적으로 network namespace + veth + bridge + NAT 구조
  • Kubernetes는 CNI 플러그인 (Calico, Flannel, Weave) 를 통해 이 구조를 자동화

profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글