Dev / App

Container Network - 네트워크 네임스페이스의 활용

Container Network

8 min read
Container Network - 네트워크 네임스페이스의 활용

네트워크 네임스페이스

네트워크 네임스페이스는 리눅스 커널의 핵심적인 기능 중 하나로, 네트워크 리소스를 격리하는 기술입니다. 해당 개념은 Docker와 같은 가상 컨테이너 기술에서 매우 중요한 역할을 합니다.

네트워크 인터페이스

네트워크 인터페이스는 한쌍의 네트워크 장비 혹은 프로토콜이 연결되도록 하는 지점을 의미합니다. 이는 물리적/논리적 통로로 대표적으로 NIC가 있습니다.

네트워크 네임스페이스 생성

네트워크 구성 순서는

1. 네임스페이스 생성 2. 가상 인터페이스 3. 브리지 연결 4. 라우팅 설정이 일반적입니다.

1. Default 네트워크 네임스페이스?

시스템 시작 시마다 운영 체제는 ODM 데이터베이스의 정보를 기반으로 네트워크 인터페이스 소프트웨어를 자동으로 구성합니다. 처음에 네트워크 인터페이스는 디폴트 값으로 구성됩니다.

lsns -t net #네트워크 인터페이스의 디폴트 값을 확인 가능합니다.

2. 네트워크 네임스페이스 생성
ip netns add #네임스페이스 생성이 가능합니다.

현재는 네트워크 네임스페이스를 생성만 했을 뿐, 아무런 설정이 되어 있지 않아 사용중이지 않은 상태로 나옵니다.

3. 네트워크 네임스페이스의 인터페이스 생성

Docker와 같은 컨테이너 환경에 익숙하신 분들은 네임스페이스를 생성하는 의미를 잘 아시리라 생각됩니다. 네임스페이스를 생성했다는 의미는 리소스 격리를 위한 공간을 생성했을 뿐입니다. 즉, 네트워크 연결을 위한 인터페이스 등의 리소스를 생성해줘야 한다는 의미로 이해할 수 있습니다.

ip link add reth0 type veth peer name reth1 #first 네트워크 네임스페이스에 할당할 인터페이스 생성
ip -br -c addr #인터페이스 조회

==> 인터페이스 조회 시, 아직까진 네임스페이스 할당을 하지 않았기에, default 네임스페이스에 존재합니다.
또한, reth1@reth0 과 같이 쌍을 가진 포맷으로 조회됩니다.

4. 인터페이스 -> first 네트워크 네임스페이스에 설정
ip link set reth0 netns first #first 네임스페이스에 reth0 인터페이스를 할당합니다.
ip -br -c addr #default 네임스페이스의 인터페이스 조회
ip netns exec first ip -c a #first 네임스페이스의 인터페이스 조회

==> 2번에서 사라진 reth0 인터페이스가 first 네임스페이스에 할당되어 있는 것을 확인 가능합니다.

second 네임스페이스도 동일하게 진행합니다.

5. 브릿지 생성 후 네임스페이스 연결
ip link show type bridge #브릿지가 없는 것을 확인
bridge vlan show
ip link add bri0 type bridge #브릿지 생성
ip link set reth1 master bri0
ip link set reth3 master bri0
bridge link #브릿지와 연결된 인터페이스 확인

==> 현재까지 설정 요약 및 도식화
1. 네트워크 네임스페이스 (first, second)에 reth0, reth2 인터페이스 할당
2. default 네임스페이스의 reth1, reth3 인터페이스와 브릿지를 연결
3. reth0 <-> reth1 / reth2 <-> reth3 연결

6. 인터페이스 IP할당
ip netns exec first ip addr add 10.10.10.10/24 dev reth0 #reth0 인터페이스에 ip 할당
ip netns exec first ip link set reth0 up #reth0 인터페이스 활성화
ip netns exec first ip -c a #ip 할당 확인

ip link set bri0 up - 브릿지 및 인터페이스 활성화

7. ping 테스트
ip netns exec first ping 10.10.10.10 -c 2 #first 자기 자신 ping 실패
ip netns exec first ping 10.10.10.11 -c 2 #second의 reth2으로는 ping 성공

second도 마찬가지로 자기자신으로 ping을 실패합니다.
이유가 무엇인지 찾아본 결과, loopback 처리와 관련된 이슈였습니다.

loopback 이슈 해결

sudo ip netns exec first ip link show lo #loopback 인터페이스 상태 확인 결과 down으로 확인됩니다.
sudo ip netns exec second ip link show lo
sudo ip netns exec first ip link set lo up #각 네임스페이스의 loopback 인터페이스 활성화
sudo ip netns exec second ip link set lo up
sudo ip netns exec first ping 10.10.10.10 -c 2 #재 확인 결과 정상적으로 loopback 작동 확인

참고: default의 경우 loopback 인터페이스가 자동 활성화가 되어 있습니다.
네임스페이스를 새로 생성하는 경우, 위와 같이 수동 활성화가 필요한 것으로 확인됩니다.

8. 호스트와 가상 네트워크간 통신

호스트와 가상 네트워크 통신을 위해서는 브릿지의 ip 활성화만 해주면 구성한 인터페이스간 통신들이 정상적으로 성공합니다.

ip addr add 11.11.11.11/24 dev bri0 #브릿지 ip 할당
ip netns exec first ping 11.11.11.11
ip netns exec second ping 11.11.11.11

9. 가상 네트워크에서 외부 인터넷으로 통신

가상 네트워크에서 외부로 통신을 하려면 별도 설정이 필요합니다.
예를 들어, first 네임스페이스의 reth0 인터페이스 -> 호스트 브릿지 -> 외부로 통신을 위해서는 라우팅 설정 및 MSAQUERADE 설정이 필요합니다.

MSAQUERADE?

네트워킹에서 NAT 기술과 맥락을 같이합니다.

즉, reth0의 ip를 MSAQUERADE를 통해 특정 인터페이스 ip로 가장/변장됩니다.

라우팅 설정
ip netns exec first ip route add default via 11.11.11.11
ip netns exec second ip route add default via 11.11.11.11
MSAQUERADE 설정
iptables -t nat -A POSTROUTING -s 11.11.11.0/24 -j MASQUERADE

명령어 분석
-t nat: NAT 테이블을 사용
-A POSTROUTING: POSTROUTING 체인에 규칙 추가 (패킷이 라우팅된 후 처리)
-s 11.11.11.0/24: 소스 IP가 11.11.11.0/24 네트워크 대역인 패킷들
-j MASQUERADE: MASQUERADE 액션 적용

적용 효과는 아래와 같습니다.
==> 11.11.11.0/24 네트워크 대역(11.11.11.1 ~ 11.11.11.254)에서 나가는 모든 패킷의 소스 IP 주소가 현재 시스템의 외부 인터페이스 IP 주소로 자동 변경됩니다.

Share This Post

Check out these related posts

개발팀의 애자일 도입 이야기2

개발팀의 애자일 도입 이야기 1

Lambda@Edge 고급 로깅 제어 기능