이것이 점프 투 공작소

리눅스 NameSpace에 대해 알아보자 본문

리눅스

리눅스 NameSpace에 대해 알아보자

겅겅겅 2023. 2. 4. 16:58

리눅스 네임스페이스란?

 리눅스에서 프로세스를 격리 시킬 수 있는 가상화 기술입니다.

 cgroup은 자원의 양을 제한한다면 namespace는 자원의 종류를 제한합니다.

 

네임스페이스의 종류 

종류 설명
PID  Process ID를 격리하여, 네임스페이스 외 다른 프로세스에 접근이 불가능하게 합니다.
NetWork IP, 포트, 라우팅 테이블 등 네트워크 리소스를 격리합니다.
User 프로세스별 UID, GID 정보를 격리합니다.
Mount 프로세스별 마운트되는 파일시스템을 격리합니다.
지정된 파일시스템을 루트처럼 생각하여 동작하게됩니다.
IPC IPC(프로세스간 통신)를 격리하여, 다른 프로세스의 접근이나 제어를 방지합니다.
UTS 호스트명이나 도메인 명을 격리합니다.
Time 시간을 격리시킬 수 있습니다.
cgroup 프로세스는 /proc/self/cgroup에 가상화된 새로운 cgroup 마운트를 가지게됩니다.

 

프로세스의 NameSpace 조회

ls -alh /proc/{PID}/ns 

위 명령어로 1번 PID를 조회한 결과

 

NameSpace 생성 (unshare)

unshare : NameSpace생성 명령어

옵션

  • -i, --ipc: IPC 네임스페이스의 공유를 해제합니다. 파일이 지정된 경우 영구 네임스페이스는 바인드 마운트에 의해 생성됩니다.
  • -m, --mount : 마운트 네임스페이스를 공유 해제합니다
  • -p, --pid : PID 네임스페이스의 공유를 해제합니다.
  • -u, --uts : UTS 네임스페이스 공유를 해제합니다.
  • -U, --user : 사용자 네임스페이스 공유를 해제합니다.
  • -C, --cgroup : cgroup 네임스페이스 공유를 해제합니다.
  • -T, --time : 시간 네임스페이스 공유를 해제합니다.
  • -f, --fork : 지정된 프로그램을 실행하지 않고 공유 해제의 하위 프로세스로 포크합니다. 새로운 PID 네임스페이스를 생성할 때 유용합니다.
  • --keep-caps --user : 옵션이 주어지면 사용자에게 권한이 부여되었는지 확인합니다.
  • --kill-child : 공유하제가 종료되면 포크된 자식 프로세스로 신호 이름을 보내도록 합니다.
  • --mount-proc : 프로그램을 실행하기 직전 proc 파일 시스템을 mountpoint에 마운트 합니다 (기본값 /proc)
  • --mpa-user=uid : uid가 매핑된 후에만 프로그램을 실행합니다.
  • --map-group=gid : gid가 매핑된 후에만 프로그램을 실행합니다.

더 많은 옵션은 공식문서 https://manpages.ubuntu.com/manpages/jammy/en/man1/unshare.1.html 에 있습니다.

 

Ubuntu Manpage: unshare - run program in new namespaces

Powered by the Ubuntu Manpage Repository, file bugs in Launchpad © 2019 Canonical Ltd. Ubuntu and Canonical are registered trademarks of Canonical Ltd.

manpages.ubuntu.com

 

새로운 NameSpace 생성 및 확인

1. unshare -pmif 명령어로 새로운 PID, mount, IPC, 자식프로세스 네임스페이스를 생성합니다. 

-pid, mount, IPC, 자식 프로세스 네임스페이스 생성

2. echo $$ 명령어로 현재 프로세스를 조회하면 1번 프로세스로 조회 성공 (네임스페이스 생성완료)

3. 새로운 proc 파일 시스템을 마운트

4. /proc 과 ps를 조회해보면 정상적으로 생성된 네임스페이스를 확인할 수 있습니다.

 

 

NameSpace간 통신

격리된 NameSpace간에 VETH를 통해 연결을 가능하게 합니다.

이미지 출처 : https://developers.redhat.com/blog/2018/10/22/introduction-to-linux-interfaces-for-virtual-networking

Bridge (br0)

리눅스 네트워크에서 라우터, 게이트웨이, vm 등에서 패킷을 목적지로 전달하는 역할을 하게됩니다. 

STP, VLAN filter, multicast snooping 등의 기능도 제공합니다.

Bridge를 통해 다른 네트워크 인터페이스와 연결하게됩니다.

 

VETH (Virtual Ethernet) (veth0)

pair로 만들어지며 네임스페이스들을 터널로 연결하거나, 물리 디바이스와 다른 네트워크 네임스페이스의 정비를 연결하는 용도로 사용됩니다.

$ ip link add <veth0_name> type veth peer name <veth1_name>

위 명령어로 veth0_name과 veth1_name 쌍으로된 veth를 생성합니다.

 

veth는 기본적으로 루트 네임스페이스에 속하게 되며, 활성화되지 않은 상태로 생성됩니다. 또한 페어로 동작하기에 두개의 veth는 항상 동시에 활성/비활성 됩니다.

 

1. 2개의 네트워크 네임스페이스 생성

네임스페이스는 생성 하면 기본적인 루프백 주소를 가집니다.

ip netns add ns0
ip netns add ns1

2. 두 네임스페이스를 연결할 브릿지 생성

ip link add br0 type bridge

3. 생성한 네임스페이스 및 브릿지 활성화

생성한 네트워크 인터페이스 및 브릿지를 활성화 시켜줍니다.

ip netns exec ns0 ip link set lo up
ip netns exec ns1 ip link set lo up 
ip link set br0 up

4. 브릿지에 IP 할당

 ip addr add IP주소 dev 브릿지명

5. VETH 생성

네트워크 네임스페이스 간 연결을 가능하게 하는 veth를 2개 생성합니다.

ip link add veth0 type veth peer name ceth0
ip link add veth1 type veth peer name ceth1

# 활성화
 ip link set veth0 up
 ip link set veth1 up

6. veth를 브릿지 및 네임스페이스에 연결

 # 브릿지에 연결
 ip link set veth0 master br0
 ip link set veth1 master br0
 
 # 네임스페이스에 연결
 ip link set ceth0 netns ns0
 ip link set ceth1 netns ns1

7. 연결된 ceth를 활성화 및 주소 할당

ip netns exec ns0 ip link set ceth0 up
ip netns exec ns1 ip link set ceth1 up

# 주소할당
netns exec ns0 ip addr add IP주소 dev ceth0
netns exec ns1 ip addr add IP주소 dev ceth1

8. 두 네임스페이스간 연결 확인

 ip netns exec ns0 ping -c 2 <ns1의 IP주소>

ip netns exec ns0 ping -c 2 <ns1의 IP주소> 의 결과

 

 

 

참조

이 포스팅은 아래 블로그 및 이동원님의 강의로 공부한 내용을 토대로 작성되었습니다.

https://www.44bits.io/ko/post/container-network-2-ip-command-and-network-namespace

 

ip로 직접 만들어보는 네트워크 네임스페이스와 브리지 네트워크 - 컨테이너 네트워크 기초 2편

네트워크 네임스페이스는 프로세스 간의 네트워크를 격리해주는 매우 강력한 도구입니다. 리눅스에서는 ip를 사용해 네트워크를 조회하는 것 뿐만 아니라 네트워크 네임스페이스를 제어하는

www.44bits.io