익명 네트워크 네임스페이스

익명 네트워크 네임스페이스

너무 길어요.Linux에는 특히 . 플래그를 통해 런타임에 생성된 네임스페이스가 사용될 때 표시되지 않는 network namespaces것 같습니다 (호스트 또는 생성된 네임스페이스에서). 실제로 Linux 네임스페이스를 처리하거나 처리 하지 않습니다(제 생각에는 다음과 같습니다:-nsystemd-nspwawnip netns listsystemd-nspawnip netnshttps://lwn.net/Articles/531114/#series_index)?

더 긴 이야기:
다음 명령을 사용하여 Arch Linux 내에서 Arch Linux의 "경량 컨테이너"를 실행합니다.

systemd-nspawn -nbUD /mntpointArchLinuxSysFs

데이터 /mntpointArchLinuxSysFs가 부팅되고 정상적으로 "실행/부팅"됩니다. 남성systemd-nspawn-n옵션 플래그가 무엇을 의미하는지 알려주세요 :

-n,--network-veth

veth호스트와 컨테이너 사이에 가상 이더넷 링크(" ")를 만듭니다. 이더넷 링크의 호스트 측은 접두사가 --machine=" "인 컨테이너 이름( 으로 지정됨)을 따라 명명된 네트워크 인터페이스로 사용됩니다 ve-. 이더넷 링크의 컨테이너 측 이름은 " host0"로 지정됩니다. 이 --network-veth옵션은 을 의미합니다 --private-network.

암묵적인 --private-network설명은 다음과 같습니다.

--private-network

Disconnect networking of the container from the host. This makes all network interfaces unavailable in the container, with the

루프백 장치와 --network-interface=지정 및 구성된 장치는 예외입니다 --network-veth. 이 옵션을 지정하면 CAP_NET_ADMIN컨테이너가 보유하는 기능 세트에 해당 기능이 추가됩니다. 후자는 를 사용하여 비활성화할 수 있습니다 --drop-capability=. 이 옵션이 지정되지 않으면(또는 아래 나열된 옵션 중 하나가 암시하는 경우) 컨테이너는 호스트 네트워크에 대한 전체 액세스 권한을 갖게 됩니다.

이는 달성한 성과인 것으로 보인다.리눅스 네임스페이스, 특히Linux 네트워크 네임스페이스이는 시작된 프로세스(즉, init컨테이너의 프로세스 /mntpointArchLinuxSysFs/bin/init와 모든 하위 프로세스)가 서로 다른 네트워크 네임스페이스에 있음을 나타냅니다. 즉, 네임스페이스/시스템에 대한 나머지 연결로는 (가상 이더넷 쌍) --private-network만 있습니다 .vethhost

사용LSNSsystemd-nspawn네임스페이스가 실제로 생성되었음을 나타냅니다.

root@host$> lsns | grep net
4026531992 net       183     1 root     /sbin/init
4026532332 net         1   824 rtkit    /usr/lib/rtkit-daemon
4026532406 net         7  4697 vu-mnt-0 /usr/lib/systemd/systemd

그러나 ip netns list"협력"을 거부합니다.

root@host$> ip netns list
root@host$>

그런 다음 이해하기 위해 다음 ip netns을 수행하여 가상 네임스페이스를 만들었습니다.

root@host$> ip netns add dummy_netns
root@host$> ip netns list
dummy_netns
root@host$>

그러나 아이러니하게도 네트워크 네임스페이스는 lsns.

어쨌든, "네트워크 네임스페이스"라는 용어가 에서 어떻게 사용되는지 명확하지 않은 것 같습니다 systemd-nspawn. ip netns제가 테스트해 본 결과 두 용어가 실제로 동일하지 않을 수도 있는 것으로 나타났기 때문입니다. 어쩌면 단어가 모호한가요?

고쳐 쓰다

매뉴얼 페이지의 이 부분에는 systemd-nspawnIMHO가 나와 있지만 실제로는 둘 다 동일한 내용을 iproute나타냅니다 .systemd-nspawn네트워크 네임스페이스.

--network-namespace-path= 컨테이너가 실행되어야 하는 커널 네트워크 네임스페이스를 나타내는 파일의 경로를 가져옵니다. 지정된 경로는 아래 커널에 의해 노출된 대로 (아마도 바인드 마운트된) 네트워크 네임스페이스 파일을 참조해야 합니다 /proc/$PID/ns/net. 그러면 컨테이너가 지정된 네트워크 네임스페이스에 배치됩니다. 일반적인 사용 사례 중 하나는 에서 만든 네트워크 네임스페이스를 제공하는 것 /run/netns입니다 ip-netns(8). --network-namespace-path=/run/netns/foo이 옵션은 --private-network 또는 --network-interface=와 같은 다른 네트워크 관련 옵션과 함께 사용할 수 없습니다.

해당 옵션과 함께 다시 사용할 수 없다는 마지막 부분은 --private-network일종의 차이를 암시하는 것 같습니다. 여기서 무슨 일이 일어나고 있는 걸까요?

답변1

네임스페이스, 특히 네트워크 네임스페이스를 모두 사용 systemd-nspawn합니다 . ip-netns차이점은 에서 설명했듯이ip-netns 매뉴얼, ip-netns처리 중명명 된네트워크 네임스페이스.

관례적으로 명명된 네트워크 네임스페이스는 /var/run/netns/NAME열 수 있는 개체입니다. 파일을 연 후 생성된 파일 설명자는 /var/run/netns/NAME지정된 네트워크 네임스페이스를 참조합니다. 파일 설명자를 열어두면 네트워크 네임스페이스가 활성 상태로 유지됩니다.

익명 네트워크 네임스페이스

이것네임스페이스(7) 매뉴얼일반적으로 네임스페이스는 그 안에 있는 프로세스의 수명 주기와 관련된 추상화라고 설명합니다.

각 프로세스 /proc/[pid]/ns/에는 지원되는 각 네임스페이스에 대한 항목이 포함된 하위 디렉터리가 있습니다 setns(2). 이 디렉터리에 있는 파일 중 하나(또는 이러한 파일 중 하나에 바인드 마운트된 파일)를 열면 해당 네임스페이스가 반환됩니다. pid로 지정된 프로세스의 파일 핸들 . 네임스페이스의 모든 프로세스가 종료되더라도 이 파일 설명자가 열려 있는 한 네임스페이스는 활성 상태로 유지됩니다.

내 시스템에서는 가장 최근에 시작된 systemd프로세스( ) 가 pgrep -f -n systemd\$기본 템플릿 단위로 시작된 컨테이너의 init 프로세스이므로 [email protected]활성화 되어 있습니다 ( ). 이 명령은 컨테이너의 익명 네트워크 네임스페이스가 루트 네트워크 네임스페이스와 다르며 컨테이너의 루트 사용자가 소유하고 있음을 보여줍니다.--network-veth--private-network--private-users

# ls -l /proc/1/ns/net /proc/$(pgrep -f -n systemd\$)/ns/net
lrwxrwxrwx 0 root           /proc/1/ns/net -> net:[4026532008]
lrwxrwxrwx 0 vu-container-0 /proc/700/ns/net -> net:[4026532656]

컨테이너가 종료되면 이 익명 네트워크 네임스페이스는 사라집니다. 그러나 ip-netns컨테이너 수명 동안 관리할 수 있는 명명된 네트워크 네임스페이스를 원할 경우 다음 위치에 바인드 마운트할 수 있습니다 /run/netns.

# mount --bind /proc/$(pgrep -f -n systemd\$)/ns/net /run/netns/container
# ip netns list
container (id: 1)

systemd를 사용하여 명명된 네트워크 네임스페이스 만들기

또한 에 설명된 설정 과 동일한 systemd-nspawn옵션을 지적하셨습니다.--network-namespace-pathNetworkNamespacePath=시스템 유닛(5). 기존 네트워크 네임스페이스에는 컨테이너와 유닛만 할당할 수 있습니다. 프로세스는 하나의 네임스페이스에만 있을 수 있으므로 --network-namespace-path익명 네트워크 네임스페이스를 만들고 그 안에 컨테이너를 격리하는 등의 옵션과 호환되지 않습니다.--private-network

것 같다Namespace=systemd는 설정 을 얻습니다v246 이후 일부 향후 버전의 systemd(v245는 2020년 3월에 출시됨). 이를 통해 유닛은 기존 네임스페이스에 대한 할당을 사용하거나 NetworkNamespacePath=새로운 익명 네임스페이스를 생성하는 대신 자체 명명된 네트워크 네임스페이스를 생성할 수 있습니다 PrivateNetwork=. 이 기능을 통합한 후에는 컨테이너의 네트워크 네임스페이스 이름이 기본적으로 지정되도록 템플릿 Namespace=%i에 추가하는 것이 좋습니다 .[email protected]

관련 정보