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 네트워크 네임스페이스에 속한 네트워크 디바이스의 목록이 출력된 것이다.
ip netns add {NAMESPACE_TITLE}
: 새로운 네트워크 네임스페이스 생성ip netns exec {NAMESPACE_TITLE} {COMMAND}
: 특정 네트워크 네임스페이스에서 특정 명렁 수행ip link set dev ip netns exec {DEVICE_TITLE} {up|down}
: 특정 네트워크 디바이스를 Enable/Disable 하도록 설정
Network Namepsace의 독립성
위에서 소개한 명령으로 네트워크 네임스페이스(direct_netns
라고 아래에선 사용했다.)를 하나 생성한 후, default 네임스페이스에서 접속을 시도하는 경우 잘 되지 않는다. 이는 네임스페이스 간의 연결이 격리돼있기 때문이다.
약간의 셋업 과정으로 네트워크 네임스페이스의 격리 기능을 체험할 수 있다.
1 | ip netns add direct_netns |
위 커맨드를 통해 direct_netns 네임스페이스를 만들고, loopback 어댑터를 up 상태로 만들어주고, nginx를 실행하면 아래의 내용을 확인할 수 있다.
default 네트워크 네임스페이스에서는 curl 수행 시 접근할 수 없지만,
direct_netns 네트워크 네임스페이스에서는 curl 수행 시 정상 접근이 된다.
당연히, netstat -nat | grep LISTEN
의 수행 결과도 다르다.
Network Namepsace간의 연결
1 | # veth 생성 및 한 쪽(veth1)을 direct_netns로 이전 |
veth(Virtual Ethernet Device)란 리눅스에서 사용하는 가상 네트워크 인터페이스를 의미하며, ip 명령어로 생성하는 것이 가능하다. 항상 쌍으로 만들어진다고 한다.
위와 같은 형태로 두 네트워크를 이어 통신할 수 있게도 할 수 있다.
TODO:
- 브릿지 네트워크, NAT 등 소개
Linux와 Docker의 기술적 관계 (2/3) - Network Namespace 기초