네임스페이스 관리를 위해 ip netns(iproute2) 사용

네임스페이스 관리를 위해 ip netns(iproute2) 사용

사용자 정의 네임스페이스에 적용된 변경 사항을 어디서 찾을 수 있는지 궁금합니다. 가상 인터페이스 "vpeer" 및 "lo"를 포함하는 "ns1" 네임스페이스가 있고 dnsmasq 또는 Hostapd를 통해 인터페이스 "vpeer"의 구성을 수정하고 싶다고 가정해 보겠습니다.

$ ip netns exec ns1 bash
$ dnsmasq --interface=vpeer-ns1 --dhcp-range=192.168.0.100,192.168.0.200,255.255.255.0

netns는 저를 위해 설치하고 모든 작업을 관리하는 등 나머지 작업을 수행하고 있습니다. 정말 감사합니다. 그러나 전역 네임스페이스에서는 해당 파일의 변경 사항을 모니터링하거나 파일에 직접 적용할 수 있습니다. 예를 들어/etc/dnsmasq.conf또는/etc/hostapd/hostapd.conf.

그래서 제 질문은 특정 netns 네임스페이스에서 기본 네임스페이스 동작을 복제하는 방법입니다. 내가 무엇을 했는지, "ns1" 인터페이스의 현재 구성이 무엇인지 꼭 알아야 합니다. 특히 대부분의 튜토리얼에서는 이러한 프로세스를 설명하기 때문에 더욱 그렇습니다. 이것IP netns 매뉴얼 페이지구성 파일이 다음 위치에 있다고 말합니다.

$ /etc/netns/ns1/

그러나 "ns1" 네임스페이스를 생성한 후에는 /etc/netns 디렉토리도 존재하지 않습니다. 새 네임스페이스는 /var/run/netns/ns1에만 표시됩니다. 위의 dnsmasq 명령을 적용한 후에도 파일은 항상 비어 있으며 nano는 빈 파일을 표시하지만 파일을 닫은 후에는 이상한 오류가 발생합니다.

ns1: Argument is invalid.

그래서 네임스페이스 "ns1"로 전환하고 다시 시도했습니다. 같은 결과. 그래서 새 네임스페이스의 모든 장치를 껐습니다.

$ ip netns exec ns1 ip link set dev lo down
$ ip netns exec ns1 ip link set dev vpeer down

이번에도 같은 결과입니다.

그러면 구성에 어떻게 액세스합니까?문서내가 아는 한 애플리케이션은 기본이 아닌 네임스페이스에 대해 전혀 모르기 때문에 특정 네임스페이스에 대해 어떻게 해야 할까요? 미리 감사드립니다.

답변1

두 가지 질문이 하나로 통합되었습니다.

  • 안에 빈 파일은 무엇입니까 /var/run/netns/?
  • /etc/netns/존재하지도 않는 것을 어떻게 사용하나요 ?

안에 빈 파일은 무엇입니까 /var/run/netns/?

약간의 이해네임스페이스필요합니다. 여기서는 자세히 설명할 수 없습니다. 네임스페이스는 일단 생성되면(네트워킹과 같은 일부 커널 리소스의 분할) 무언가가 이를 사용하는 한 존재합니다. 주로 두 가지 용도로 사용됩니다: 프로세스 또는 특수 의사 파일 시스템의 마운트 지점입니다 nsfs. 사용을 중단하거나 사라지면 네임스페이스도 사라집니다.

ip netns(전문회로망네임스페이스) 네트워크 네임스페이스에 대한 참조를 설치하여 네트워크 네임스페이스를 보존하려면 선택합니다. 이러한 참조는 /proc/<pid>/net/기호 링크로 제공됩니다. 예:

$ ls -l /proc/$$/ns/net
lrwxrwxrwx. 1 user user 0 Sep 25 01:05 /proc/19120/ns/net -> net:[4026531992]
$ stat -L -f -c %T /proc/19120/ns/net # filesystem type. "df" on this would be confused and point to the wrong mountpoint anyway.
nsfs
$ stat -L -c %i /proc/19120/ns/net # inode
4026531992

ip netns add일반적 /var/run/netns/<NAME>으로 마운트 디렉터리를 디렉터리에 바인딩하는 동안 파일에 마운트 파일을 바인딩할 수도 있습니다. 또한 이 파일은 파일 시스템의 더미 파일이라는 점에 유의하세요 nsfs. 이 책은 읽도록 설계되지도 않았고 읽을 수도 없습니다. 주로 열거나(읽거나 쓰지 않음) 마운트하여 참조로 전달하기 위한 것입니다.

# strace -e unshare,mount  ip netns add ns1
mount("", "/var/run/netns", 0x5625f6ca80e3, MS_REC|MS_SHARED, NULL) = 0
unshare(CLONE_NEWNET)                   = 0
mount("/proc/self/ns/net", "/var/run/netns/ns1", 0x5625f6ca80e3, MS_BIND, NULL) = 0
+++ exited with 0 +++
# ip netns list
ns1
# ls -l /var/run/netns/ns1
-r--r--r--. 1 root root 0 Sep 25 01:08 /var/run/netns/ns1
# cat /var/run/netns/ns1
cat: /var/run/netns/ns1: Invalid argument
# stat -f -c %T /var/run/netns/ns1
nsfs
# stat -c %i /var/run/netns/ns1
4026532824
# ip netns exec ns1 sleep 99 &
[1] 19620
# ls -l /proc/19620/ns/net
lrwxrwxrwx. 1 root root 0 Sep 25 01:23 /proc/19620/ns/net -> net:[4026532824]

따라서 sleep 99네트워크 네임스페이스는 마운트 지점의 네트워크 네임스페이스입니다 /var/run/netns/ns1. 예를 들어 이 방법을 사용하면 veth인터페이스를 통해 다른 네임스페이스에 연결되고 프로세스가 필요하지 않기 때문에 프로세스를 실행하지 않는 브리지가 있는 네트워크 네임스페이스를 가질 수 있습니다 .

ip netns다음 명령을 사용하여 생성된 네임스페이스를 수동으로 삭제할 수 있습니다 .

# umount /var/run/netns/ns1 
# rm /var/run/netns/ns1
# ip netns list
#

물론 네트워크 네임스페이스는 이를 사용한 마지막 참조(예: 프로세스)도 사라질 때만 실제로 사라집니다. 이전 sleep 명령이 아직 실행 중인 경우 다시 되돌릴 수도 있습니다.

# touch /var/run/netns/ns1
# mount --bind /proc/19620/ns/net /var/run/netns/ns1
# ip netns
ns1

이는 전체 컨테이너의 네트워크 네임스페이스 부분을 "복사"하는 데 사용할 수 있습니다. 호스트 측의 일부 pid(예: lxc-info -Hp -n container또는 docker inspect --format '{{.State.Pid}}' container)를 알고 해당 네트워크 네임스페이스를 마운트하기만 하면 됩니다. tcpdump컨테이너 내부에서는 사용할 수 없는 디버깅 명령(...)을 편리하게 실행할 수 있습니다 .

위의 모든 내용은 일시적이며 예를 들어 재부팅하면 사라집니다.

/etc/netns/존재하지 않는 것을 어떻게 사용하나요 ?

이것ip netns맨페이지말했다 (굵은 강조 내):

네트워크 네임스페이스를 이해하는 애플리케이션의 경우/etc/netns/, 규칙은 먼저 NAME/에서 전역 네트워크 구성 파일을 찾은 다음 에서 찾는 것입니다 . 예를 들어 VPN을 격리하기 위해 다른 버전의 네트워크 네임스페이스를 /etc/사용하려는 경우 이름을 로 지정할 수 있습니다 ./etc/resolv.conf/etc/netns/myvpn/resolv.conf

이제 dnsmasq네트워크 네임스페이스를 "인식"하고 있습니까? ( ip netns의 정의에 따라) 그렇다면 /etc/netns/어떤 방식으로든 확인됩니다. "netns"에 대한 언급이 없습니다.맨페이지. 현재 데비안(라즈베리 같은) 소스 코드에는 이 단어가 어디에도 포함되어 있지 않습니다 netns. 네트워크 네임스페이스를 지원하지 않습니다.

ip netns맨페이지의 다음 문장이 우리에게 알려주는 이유는 다음과 같습니다 .

ip netns exec이 구성, 파일 규칙을 자동으로 처리합니다.네트워크 네임스페이스를 인식하지 못하는 애플리케이션의 경우, 설치 네임스페이스를 생성하고 모든 네트워크별 네임스페이스 구성 파일을 /etc.

ip netns exec이것이 실제로 설명하지는 않지만 이전 문장과 함께 바인드가 마운트된다는 의미입니다 .소스와 타겟이 모두 존재하는 경우, /etc/netns/<NAME>/whatever존재하다 /etc/whatever. /etc/netns구성을 포함할 내부적으로 선택된 네트워크 네임스페이스 이름먼저 수동으로 생성해야 하며 실제 구성 내용을 내부적으로 복사하여 편집할 수 있습니다.: ip netns exec발견되면 사용되지만 생성되지는 않습니다.

예:

# mkdir -p /etc/netns/ns1
# echo something > /etc/netns/ns1/whatever
# : > /etc/whatever
# ip netns add ns1
# cat /etc/whatever
# ip netns exec ns1 cat /etc/whatever
something

뒤에서 무슨 일이 일어났는가:

# strace -e open,unshare,setns,mount,umount2 ip netns exec ns1 cat /etc/whatever 2>&1 |egrep '^(open.*/etc/netns|unshare|setns|mount|umount|something)'
setns(5, CLONE_NEWNET)                  = 0
unshare(CLONE_NEWNS)                    = 0
mount("", "/", 0x55947eb550e3, MS_REC|MS_SLAVE, NULL) = 0
umount2("/sys", MNT_DETACH)             = 0
mount("ns1", "/sys", "sysfs", 0, NULL)  = 0
open("/etc/netns/ns1", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
mount("/etc/netns/ns1/whatever", "/etc/whatever", 0x55947eb550e3, MS_BIND, NULL) = 0
something

물론 이는 /etc/netns/ns1파일이 아닌 내부 디렉터리에도 동일합니다. 전체 디렉터리는 /etc/존재하는 경우에만 동일한 이름의 보호된 호스트 디렉터리에 직접 나타납니다.

따라서 달리 명시하지 않는 한 dnsmasq의 기본 구성이 다음과 같은 경우 /etc/dnsmasq.confas에 대한 대체 구성을 생성하여 다음과 같이 표시되도록 할 수 있습니다.ns1/etc/netns/ns1/dnsmasq.confip netns exec/etc/dnsmasq.confdnsmasq만약에/etc/dnsmasq.conf비어 있어도 이미 파일이 있습니다. 이는 /etc임시가 아니며 동일한 네트워크 네임스페이스 이름을 다시 만들 때마다 재사용되기 때문 입니다. hostapd전체 디렉토리는 동일 /etc/hostapd/하며 /etc/netns/ns1/hostapd/해당 파일은 내부에서 복사 및 수정이 가능합니다. 외부를 가리키는 기호 링크에 주의하십시오. 이제 평소처럼 내부에서 명령을 실행할 수 있습니다 ip netns exec ns1. 명령은 새 구성 파일을 사용합니다.

관련 정보