사용자 정의 Linux 네트워크 네임 스페이스에서 기본 네임 스페이스로 다시 전환하려면 어떻게해야합니까?


14

ip netns exec 를 사용하면 사용자 정의 네트워크 네임 스페이스에서 명령을 실행할 수 있지만 기본 네임 스페이스에서 명령을 실행할 수있는 방법이 있습니까?

예를 들어,이 두 명령을 실행 한 후 :

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

새로 작성된 bash는 기본 네트워크 네임 스페이스에서 어떻게 프로그램을 실행할 수 있습니까? ip netns exec default 또는 내가 찾은 한 비슷한 것이 없습니다 .

내 시나리오는 다음과 같습니다

별도의 네트워크 네임 스페이스에서 SSH 서버를 실행하고 싶습니다 (시스템이 네트워크 테스트에 사용됨에 따라 나머지 시스템은 네트워크 연결을 인식하지 못합니다). SSH 연결.

내가 지금까지 알아 낸 것 :

답변:


13

최신 배포판 / 커널은 nsenter명령을 지원하므로 원하는 작업을 수행해야합니다.

다음은 예제입니다 (Fedora 20).

[root@home ~]# unshare -n /bin/bash
[root@home ~]# ip a l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
[root@home ~]# ping google.com
ping: unknown host google.com
[root@home ~]# nsenter -t 1 -n -- ping -c 2 google.com
PING google.com (74.125.230.65) 56(84) bytes of data.
64 bytes from lhr14s23-in-f1.1e100.net (74.125.230.65): icmp_seq=1 ttl=56 time=14.2 ms
64 bytes from lhr14s23-in-f1.1e100.net (74.125.230.65): icmp_seq=2 ttl=56 time=15.0 ms

--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 14.239/14.621/15.003/0.382 ms
[root@home ~]# nsenter -t 1 -n -- ip a l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: p4p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 10:bf:48:88:50:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global p4p1
       valid_lft forever preferred_lft forever
    inet6 fe80::12bf:48ff:fe88:50ee/64 scope link 
       valid_lft forever preferred_lft forever
[root@home ~]# 

이것은 setns시스템 호출 에 의존합니다 . 이것이 작동하려면 최소한 3.0 커널과 glibc-2.14가 필요합니다.

RHEL 6.5는 영구 네임 스페이스는 지원하지만 기존 프로세스를 새 네임 스페이스로 이동하는 것은 지원 하지 않습니다 .


이것은 우분투가 nsenter없이 오래된 util-linux 패키지를 제공한다는 사실에 대해 잘 작동합니다. 자세한 내용은 여기에서 찾을 수 있습니다. askubuntu.com/questions/439056/…
Martin

시도 nsenter -t 1 -n했지만 ip netns exec현재 프로세스의 네임 스페이스를 변경하지 않은 것처럼 새 프로세스를 만들었습니다 .
Pavel Šimerda

15

두 가지 간단한 명령으로 기본 네트워크 네임 스페이스로 돌아갈 수 있음을 발견했습니다.

ln -s /proc/1/ns/net /var/run/netns/default
ip netns exec default ifconfig -a

이 방법은 proc파일 시스템을 통해 자신의 네임 스페이스 외부의 프로세스를 볼 수 있다고 가정합니다 . 별도의 PID 네임 스페이스에있는 경우 기본 네임 스페이스로 돌아가는 것이 간단하지 않습니다.

위 명령은 Ubuntu 14.04에서 테스트되었습니다. 접근 방식과 관련된 배포판이 있는지 모르겠습니다.


1
이것은 꽤 소설입니다! 나는 일을 실제로 추천 할 것입니다 mount --bind대신 ln -s는 의미로, ip명령 (설정 지속 네임 스페이스 이러한 네임 스페이스 파일에 대해 --bind 마운트 않습니다 기본적으로 IP)도 그것을 관리 할 수 있습니다.
Matthew Ife

@kasperd는 별도의 PID 네임 스페이스로 간단하지 않다고 말합니다. 그래도 실제로는 가능합니까? 어떻게 말할 수 있습니까?
copumpkin

@copumpkin 나는 그것을 테스트하지 않았습니다.
kasperd

0

"ln -s / proc / 1 / ns / net / var / run / netns / default"<----- 권장하지 않습니다.

"ip netns show"를 출력하는 코드의 카운터

bash 쉘을 실행하면 bash 외부에 간단하게 존재하고 종료하십시오.

netns에 ssh가 있으면 기본 ns의 인터페이스에 ssh를 사용하여 필요한 작업을 수행하십시오.

위와 같이 ln을 최후의 수단으로 사용하지만 완료 되 자마자 ns가 변경되기 전에 제거하는 것이 좋습니다. 그렇지 않으면 카운터가 손상되어 문제가 발생합니다.


2
다른 답변에 대한 의견 인 것 같습니다.
RalfFriedl

불행히도 나는 방금 가입했고 의견을 말할 수 없었다. 이사 해 주셔서 감사합니다. 의견을 게시 할 수 있습니다. @RalfFriedl
Luke A

0
nsenter -n -t <pid of a process running in the default ns>

'ps aux'또는 원하는 경우 상단을 수행하는 pid 양식을 얻을 수 있습니다.

개인적으로 나는 항상 기본 네임 스페이스로 ssh 한 다음 exit를 입력하고 필요한 경우 네임 스페이스를 다시 입력하여 항상 기본값으로 돌아갈 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.