ฉันจะสลับจากเนมสเปซเครือข่าย linux ที่กำหนดเองกลับไปเป็นค่าเริ่มต้นได้อย่างไร


14

ด้วยip netns execคุณสามารถรันคำสั่งในเนมสเปซเครือข่ายที่กำหนดเองได้ แต่มีวิธีการรันคำสั่งในเนมสเปซเริ่มต้นด้วยหรือไม่

ตัวอย่างเช่นหลังจากรันคำสั่งทั้งสองนี้:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

bash ที่สร้างขึ้นใหม่สามารถรันโปรแกรมในเนมสเปซเครือข่ายเริ่มต้นได้อย่างไร ไม่มีเป็นIP netns exec เริ่มต้นหรืออะไรที่คล้ายกันเท่าที่ผมได้พบ

สถานการณ์ของฉันคือ:

ฉันต้องการเรียกใช้เซิร์ฟเวอร์ SSH ในเนมสเปซเครือข่ายแยกต่างหาก (เพื่อให้ระบบที่เหลือไม่รู้จักการเชื่อมต่อเครือข่ายเนื่องจากระบบใช้สำหรับการทดสอบเครือข่าย) แต่ต้องการให้สามารถรันโปรแกรมในเนมสเปซเครือข่ายเริ่มต้นผ่าน การเชื่อมต่อ SSH

สิ่งที่ฉันค้นพบแล้ว:

คำตอบ:


13

distros / kernels ที่ใหม่กว่ารองรับnsenterคำสั่งที่ควรทำสิ่งที่คุณต้องการโดยให้คุณเป็น root เมื่อคุณทำ

นี่คือตัวอย่าง (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 ให้การสนับสนุนสำหรับเนมสเปซแบบถาวร แต่ไม่รองรับการย้ายกระบวนการที่มีอยู่ไปสู่เนมสเปซใหม่


วิธีนี้ใช้ได้ผลดีสำหรับ Ubuntu ที่มีแพ็กเกจ util-linux ที่ล้าสมัยโดยไม่มี nsenter ฉันพบคำแนะนำการสร้างโดยละเอียดที่นี่อย่างไรก็ตาม: 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คำสั่งสามารถจัดการมันได้ด้วย (โดยทั่วไป ip ติด - ผูกกับไฟล์ namespace เหล่านี้เพื่อติดตั้ง namespaces ถาวร)
Matthew Ife

@kasperd คุณบอกว่ามันไม่ง่ายเลยที่มี namespace PID แยกต่างหาก จริง ๆ แล้วมันยังคงเป็นไปได้จริงไหม? คุณพูดถึงได้อย่างไร
copumpkin

@copumpkin ฉันยังไม่ได้ทดสอบ
kasperd

0

"ln -s / proc / 1 / ns / net / var / run / netns / default" <----- ไม่แนะนำเลย

ตัวนับสำหรับรหัสที่แสดงผลลัพธ์ "ip netns show"

ถ้าคุณมีเปลือก bash, มีอยู่อย่างง่ายจาก bash, exit.

หากคุณมี ssh ไปยัง netns แล้ว ssh ไปยังอินเทอร์เฟซของ ns เริ่มต้นและทำสิ่งที่คุณต้องทำที่นั่น

เป็นทางเลือกสุดท้ายดังนั้น ln ดังกล่าว แต่ฉันขอแนะนำให้ลบออกทันทีที่เสร็จสิ้นและก่อนการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับ ns ใด ๆ มิฉะนั้นตัวนับจะเสียหายและทำให้เกิดปัญหา


2
นั่นดูเหมือนจะเป็นความเห็นต่อคำตอบอื่น
RalfFriedl

มันเป็นโชคไม่ดีที่ฉันเพิ่งสมัครและไม่สามารถแสดงความคิดเห็นได้ มีความสุขที่จะย้ายตอนนี้ฉันสามารถโพสต์ความคิดเห็น @RalfFriedl
ลุค

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

คุณสามารถรับแบบ pid ทำ 'ps aux' หรือแม้แต่ด้านบนถ้าคุณต้องการ

โดยส่วนตัวฉันมักจะ ssh ที่เนมสเปซหลักจากนั้นฉันสามารถกลับไปที่ค่าเริ่มต้นได้โดยพิมพ์ exit จากนั้นป้อน namespace อีกครั้งหากจำเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.