Linux와 Docker의 기술적 관계 (2/3) - Network Namespace 기초

출처: ip로 직접 만들어보는 네트워크 네임스페이스와 브리지 네트워크

도커의 기반이 되는 네트워크 네임스페이스 기술에 대해 다룬다.

기준 환경:

Ubuntu 20.04.1 LTS (WSL2 by Windows 10 x64) (Docker Desktop)

일부 기능은 Native Docker에서만 정상 작동하여 아래 환경도 활용하였다.
Ubuntu 20.04.1 LTS (GCP Compute Engine) (Native Docker)


Network Namepsace의 역할

Network Namespace는 프로세스의 네트워크 환경을 분리한다. 기본적으로 프로세스의 네트워크 네임스페이스는 default 네임스페이스에 속한다.


Network Namepsace 사용 방법

아래에서 계속 사용하게 될 프로그램인 ip는 리눅스에서 네트워크를 관리하는 표준 유틸이며, 네트워크 네임스페이스 기능 또한 내장돼있다.


ip link : 네트워크 디바이스 목록 조회

이 결과는 위에서 말했듯, default 네트워크 네임스페이스에 속한 네트워크 디바이스의 목록이 출력된 것이다.


  1. ip netns add {NAMESPACE_TITLE} : 새로운 네트워크 네임스페이스 생성

  2. ip netns exec {NAMESPACE_TITLE} {COMMAND} : 특정 네트워크 네임스페이스에서 특정 명렁 수행

  3. ip link set dev ip netns exec {DEVICE_TITLE} {up|down} : 특정 네트워크 디바이스를 Enable/Disable 하도록 설정


Network Namepsace의 독립성

위에서 소개한 명령으로 네트워크 네임스페이스(direct_netns라고 아래에선 사용했다.)를 하나 생성한 후, default 네임스페이스에서 접속을 시도하는 경우 잘 되지 않는다. 이는 네임스페이스 간의 연결이 격리돼있기 때문이다.

약간의 셋업 과정으로 네트워크 네임스페이스의 격리 기능을 체험할 수 있다.

1
2
3
ip netns add direct_netns
ip netns exec direct_netns ip link set dev lo up
ip netns exec direct_netns nginx -g 'daemon off;'

위 커맨드를 통해 direct_netns 네임스페이스를 만들고, loopback 어댑터를 up 상태로 만들어주고, nginx를 실행하면 아래의 내용을 확인할 수 있다.

default 네트워크 네임스페이스에서는 curl 수행 시 접근할 수 없지만,

direct_netns 네트워크 네임스페이스에서는 curl 수행 시 정상 접근이 된다.

당연히, netstat -nat | grep LISTEN 의 수행 결과도 다르다.


Network Namepsace간의 연결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# veth 생성 및 한 쪽(veth1)을 direct_netns로 이전
ip link add veth0 type veth peer name veth1
ip link set veth1 netns direct_netns

# IP 할당
ip a add 10.200.0.2/24 dev veth0
ip netns exec direct_netns ip a add 10.200.0.3/24 dev veth1

# Up 상태로 지정
ip link set dev veth0 up
ip netns exec direct_netns ip link set dev veth1 up

# ping 수행 (정상 작동 확인)
ping 10.200.0.3
ip netns exec direct_netns ping 10.200.0.2

veth(Virtual Ethernet Device)란 리눅스에서 사용하는 가상 네트워크 인터페이스를 의미하며, ip 명령어로 생성하는 것이 가능하다. 항상 쌍으로 만들어진다고 한다.

위와 같은 형태로 두 네트워크를 이어 통신할 수 있게도 할 수 있다.


TODO:

  • 브릿지 네트워크, NAT 등 소개

Linux와 Docker의 기술적 관계 (2/3) - Network Namespace 기초

https://jsqna.com/linux-namespaces-2/

Author

Seongbin Kim

Posted on

21-05-16

Updated on

21-05-16

Licensed under

댓글