Linux 시스템(커널 버전 3.10)에 여러 네트워크 네임스페이스를 설정했으며 이제 각 네트워크 네임스페이스가 고유한 DNS 설정을 갖도록 구성하려고 합니다.
resolv.conf
각 디렉토리에 파일을 생성 했으며 /etc/netns/[namespace]
이제 시스템이 다음과 같이 작동하기를 원합니다.
bash 명령줄에서 특정 네트워크 네임스페이스로 이동하는 컨텍스트를 사용할 때마다 nsenter --net=/run/netns/[namespace name]
명령줄에서 시작된 모든 프로세스(예: nslookup, ping)가 일치를 사용하여 구성한 DNS 설정으로 실행되기를 원합니다 /etc/netns/[namespace name]/resolv.conf
.
다음과 같이 명령을 실행하면:
"ip netns exec [namespace name] [command]"
그런 다음 네임스페이스의 DNS 설정을 적용합니다.
그러나 "ip netns exec" 없이 명령을 실행하면 /etc/resolv.conf
"netns get cur"를 실행하면 컨텍스트가 원하는 네트워크 네임스페이스로 설정되었음을 나타내더라도 DNS 설정은 여기에서 가져옵니다.
적절한 네트워크 네임스페이스의 컨텍스트에서 이를 시도했지만 mount --bind /etc/netns/[namespace name]/resolv.conf /etc/resolv.conf
이는 해당 네트워크 네임스페이스의 컨텍스트가 아닌 전체 시스템에 마운트를 적용합니다.
나는 마운트 네임스페이스를 사용하는 것이 도움이 될 것이라고 의심했기 때문에 마운트 네임스페이스에 대한 매뉴얼 페이지를 읽어보았지만 짧은 작업 시간 안에 아무것도 얻을 수 없었습니다.
이를 달성하는 간단하고 우아한 방법이 있습니까?
솔루션에 대한 도움이나 안내를 주시면 대단히 감사하겠습니다!
답변1
해결책
using 대신 ip netns exec
with를 사용할 수 있습니다 . 즉:bash
nsenter
ip netns exec [namespace name] bash
이렇게 하면 네임스페이스별 네트워크 구성 파일이 다른 세션에 영향을 주지 않고 기본(글로벌) 위치에 자동으로 바인드 설치되는 대화형 셸 세션에 들어갈 수 있습니다.
설명하다
다음은 에서 발췌한 것입니다.ip netns
매뉴얼 페이지:
네트워크 네임스페이스를 인식하는 애플리케이션의 경우 먼저 **/etc/netns/**NAME/에서 전역 네트워크 구성 파일을 찾은 다음/등/. 예를 들어, 다른 버전의/etc/resolv.confVPN을 격리하는 데 사용되는 네트워크 네임스페이스의 경우 이름을 지정할 수 있습니다./etc/netns/myvpn/resolv.conf.
IP netns 실행이 구성은 설치 네임스페이스를 생성하고 모든 네트워크별 네임스페이스 구성 파일을 /etc의 기존 위치에 바인딩 마운트하여 자동으로 처리되며, 네트워크 네임스페이스 인식 애플리케이션의 파일 규칙은 자동으로 처리됩니다.
네트워크 네임스페이스 간의 차이점에 특히 주의하세요.알고 있는애플리케이션 및 네트워크 네임스페이스전혀 모른다앱.
이것nsenter
매뉴얼 페이지반면에 이러한 구별에 대한 언급은 없는 것 같습니다(특히 "aware", "resolv", ".conf" 및 "/etc" 문자열을 검색했지만 결과를 찾지 못했습니다). 이는 nsenter
유틸리티가 네임스페이스를 인식하지 못하는 응용 프로그램에 대해 동일한 유형의 자동 처리를 수행하지 않음 을 나타내는 것 같습니다 .
추가 댓글
또한네트워크 네임스페이스, 당신도 보고 싶을 수도 있습니다사용자 네임스페이스그리고마운트 네임스페이스. DNS 이외의 추가 격리를 원한다면 컨테이너화를 고려할 수도 있습니다.LXC 컨테이너,루스트어바웃, 또는 전체 가상 머신일 수도 있습니다.
답변2
ip netns exec test ...
귀하의 사건이 무엇을 하고 있는지 확인하려면 다음을 사용하십시오.strace
.
발췌:
# strace -f ip netns exec test sleep 1 2>&1|egrep '/etc/|clone|mount|unshare'|egrep -vw '/etc/ld.so|access'
unshare(CLONE_NEWNS) = 0
mount("", "/", 0x55f2f4c2584f, MS_REC|MS_SLAVE, NULL) = 0
umount2("/sys", MNT_DETACH) = 0
mount("test", "/sys", "sysfs", 0, NULL) = 0
open("/etc/netns/test", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
mount("/etc/netns/test/resolv.conf", "/etc/resolv.conf", 0x55f2f4c2584f, MS_BIND, NULL) = 0
따라서 수행 중인 작업을 재현하려면(부분적으로, 예를 들어 /sys
여기서는 처리되지 않음) ip netns exec test ...
다음을 수행하십시오.
~# ip netns id
~# head -1 /etc/resolv.conf
# Generated by NetworkManager
~# nsenter --net=/var/run/netns/test unshare --mount sh -c 'mount --bind /etc/netns/test/resolv.conf /etc/resolv.conf; exec bash'
~# ip netns id
test
~# head -1 /etc/resolv.conf
# For namespace test
~#
그래서 그게 다입니다.nsenter
혼자 있는 것만으로는 충분하지 않습니다.unshare
아직 적합한 기존 네임스페이스가 없기 때문에 기존 네임스페이스를 그대로 사용하는 대신 새로 생성된 설치 네임스페이스(이전 네임스페이스의 복사본을 기반으로 함)를 사용하고 변경하여 변경해야 합니다. 이것이 동일한 이름의 시스템 콜이 실행되는 이유이다 strace
.
답변3
처음 두 답변은 좋은 정보와 답변을 제공하지만 약간 다른 관점에서 답변해 보겠습니다.
네트워크 네임스페이스는 네트워크 인터페이스, 네트워크 경로 및 규칙, 네트워크 필터에 대한 항목을 배치할 수 있는 장소를 제공합니다.
마운트 네임스페이스는 파일을 저장할 장소를 제공합니다. 이러한 파일은 네트워크와 관련되어 있고 특정 네트워크 네임스페이스에서 사용하기 위한 것일 수 있지만 궁극적으로는 파일일 뿐입니다.
새 네트워크 네임스페이스를 생성하면(예: " ip netns add newnetns
" 사용) 새 마운트 네임스페이스가 자동으로 제공되지 않습니다.
" " 명령을 사용하면 ip netns exec newnetns somecomand
새 네트워크 네임스페이스(이전에 생성된 newnetns)를 사용하여 새 프로세스(somecommand)가 생성되고 이 프로세스에 대해 생성된 새 마운트 네임스페이스도 얻게 됩니다. 또한 새 설치 네임스페이스(예: /etc/netns/newnetns/resolv.conf
to /etc/resolv.conf
)에 설치하기 위해 특정 파일을 번들로 제공하게 됩니다. 이제 " "를 사용할 때 ip netns exec
이러한 파일은 일반적으로 resolv.conf와 같이 네트워크와 관련되어 있습니다. 그러나 이러한 파일이 네트워크와 관련되어 있고 새 네트워크 네임스페이스와 함께 사용하기 위해 만들었더라도 새 네트워크 네임스페이스의 일부는 아닙니다. 프로세스(일부 명령)가 종료되면 이를 위해 생성된 마운트 네임스페이스도 사라지지만(다른 프로세스가 다른 방법으로 동일한 마운트 네임스페이스에 연결되지 않는 한) 네트워크 네임스페이스는 유지됩니다.
이 명령을 사용하면 nsenter
선택한 네트워크 네임스페이스에 명령이 배치되지만 nsenter
" "와 같은 ip netns exec
새 마운트 네임스페이스는 생성 되지 않습니다.
ip netns add newnetns
" "는 본질적으로 비어 있는 새 네트워크 네임스페이스를 생성한다는 점은 주목할 가치가 있습니다 . 이 새 네트워크 네임스페이스에 인터페이스나 경로를 추가해야 합니다. " ip netns exec
"해당 네트워크 네임스페이스에 프로세스를 넣고, 로드가 추가된 바인드 마운트만 포함하여 기본 마운트 네임스페이스(메인 파일 시스템을 표시할 가능성이 높음)의 복사본인 새 마운트 네임스페이스를 만듭니다.
ip-netns
매뉴얼 페이지에는 네트워크 네임스페이스 인식 응용 프로그램에서 사용되는 파일 규칙을 나타낼 것이라고 언급되어 있다는 점도 주목할 가치가 있습니다 . 이는 파일 규칙을 사용하는 네트워크 인식 응용 프로그램이 많이 있다는 인상을 줄 수 있습니다. /etc/netns/nsname/...
내가 아는 한, 이것은 사실이 아니다. 현재로서는 이 파일을 사용하는 다른 응용 프로그램이 생각나지 않지만 /etc/netns/nsname/...
아마도 있을 수도 있습니다.