मैं एक कस्टम लिनक्स नेटवर्क नाम स्थान से डिफ़ॉल्ट एक पर कैसे स्विच कर सकता हूं?


14

IP नेट्स के साथ आप एक कस्टम नेटवर्क नेमस्पेस में कमांड निष्पादित कर सकते हैं - लेकिन क्या डिफ़ॉल्ट नेमस्पेस में कमांड निष्पादित करने का एक तरीका भी है?

उदाहरण के लिए, इन दोनों आदेशों को निष्पादित करने के बाद:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

डिफ़ॉल्ट नेटवर्क नेमस्पेस में नए बने बैश प्रोग्राम कैसे निष्पादित कर सकते हैं? जहाँ तक मैंने पाया है, वहाँ कोई आईपी ​​नेटन डिफ़ॉल्ट या कुछ भी समान नहीं है।

मेरा परिदृश्य है:

मैं एक अलग नेटवर्क नेमस्पेस में एसएसएच सर्वर चलाना चाहता हूं (नेटवर्क कनेक्शन के लिए सिस्टम को अनजान रखने के लिए, जैसा कि सिस्टम नेटवर्क परीक्षण के लिए उपयोग किया जाता है), लेकिन डिफ़ॉल्ट नेटवर्क नेमस्पेस के माध्यम से प्रोग्राम निष्पादित करने में सक्षम होना चाहते हैं SSH कनेक्शन।

मैंने अब तक क्या पाया है:

  • बनाए गए नेटवर्क नेमस्पेस को / var / run / netns के तहत फाइल के रूप में सूचीबद्ध किया गया है (लेकिन डिफ़ॉल्ट नामस्थान के लिए कोई फाइल नहीं है)

  • आईपी netns कार्यकारी कोड यहां पाया जा सकता: http://git.kernel.org/cgit/linux/kernel/git/shemminger/iproute2.git/tree/ip/ipnetns.c#n132 - मैं सब कुछ समझा नहीं किया है यह अभी तक कर रहा है, लेकिन यह बहुत आशाजनक नहीं है।

  • आईपी ​​नेटवर्क्स $ $ की पहचान करते हैं जैसा कि हाउटो क्वेरी द्वारा सुझाया गया है और लिनक्स पर नेटवर्क नेमस्पेस को बदल दिया है ? डिफ़ॉल्ट नेटवर्क नेमस्पेस में कुछ भी नहीं लौटाता है

जवाबों:


13

नए डिस्ट्रोस / गुठली nsenterकमांड का समर्थन करते हैं, जो आपको चाहिए वह करना चाहिए, बशर्ते आप इसे करते समय जड़ हों।

यहाँ एक उदाहरण है (फेडोरा 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 कर्नेल और ग्लिब-2.14 चाहिए।

आरएचईएल 6.5 लगातार नाम स्थान के लिए समर्थन प्रदान करता है लेकिन मौजूदा प्रक्रियाओं को नए नामस्थान में स्थानांतरित करने के लिए समर्थन नहीं करता है।


यह ठीक काम करता है, इस तथ्य के लिए निष्पादित करता है कि उबंटू बिना उपयोग के एक पुराना उपयोग-लिनक्स पैकेज प्रदान करता है। मुझे यहाँ विस्तृत निर्माण निर्देश मिले, हालाँकि: askubuntu.com/questions/439056/…
मार्टिन

मैंने कोशिश की, nsenter -t 1 -nलेकिन इसने एक नई प्रक्रिया बनाई ip netns execऔर वर्तमान प्रक्रिया के नाम स्थान को नहीं बदला।
पावेल Paमेरदा

15

मैंने पाया कि आप दो साधारण कमांड के साथ डिफ़ॉल्ट नेटवर्क नेमस्पेस पर लौट सकते हैं:

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

यह विधि स्पष्ट रूप से मानती है कि आप procफ़ाइल सिस्टम के माध्यम से अपने स्वयं के नामस्थान के बाहर की प्रक्रिया देख सकते हैं । यदि आप एक अलग पीआईडी ​​नामस्थान में हैं, तो डिफ़ॉल्ट नामस्थान पर लौटना उतना सरल नहीं है।

उपरोक्त आदेशों का परीक्षण Ubuntu 14.04 पर किया गया था। मुझे नहीं पता कि दृष्टिकोण के बारे में कुछ वितरण विशिष्ट है या नहीं।


1
यह सुंदर उपन्यास है! मैं mount --bindइसके बजाय वास्तव में करने की सलाह दूंगा ln -s, क्योंकि इसका मतलब है कि ipकमांड इसे भी प्रबंधित कर सकता है (आईपी मूल रूप से माउंट करता है - इन नाम स्थान फ़ाइलों के खिलाफ लगातार नामस्थान सेटअप करने के लिए)।
मैथ्यू इफ सिप

@kasperd आप कहते हैं कि यह एक अलग पीआईडी ​​नाम स्थान के साथ सरल नहीं है। क्या यह वास्तव में अभी भी संभव है, हालांकि? क्या आप बता सकते हैं कैसे?
कॉप्पकिन

@ copumpkin मैंने वह परीक्षण नहीं किया है।
कैस्परल्ड

0

"ln -s / proc / 1 / ns / net / var / run / netns / default" <----- बिल्कुल भी अनुशंसित नहीं है।

कोड के लिए काउंटर जो "आईपी नेटन्स शो" को आउटपुट करता है

यदि आपने एक बैश शेल निष्पादित किया है, तो बैश से बाहर मौजूद है, बाहर निकलें।

यदि आप एक netns के लिए ssh है, तो डिफ़ॉल्ट ns के इंटरफ़ेस पर ssh करें और वहीं करें जो आपको करने की आवश्यकता है।

एक अंतिम उपाय के रूप में ऊपर के रूप में ln, लेकिन मैं इसे जल्द से जल्द हटाने का सुझाव दूंगा, और इससे पहले कि कोई भी ns में परिवर्तन हो। अन्यथा काउंटर दूषित हो जाएगा और मुद्दों का कारण होगा।


2
यह एक और जवाब पर एक टिप्पणी लगती है।
राल्फफ्राइडल

यह दुर्भाग्य से, मैंने अभी साइन अप किया था और टिप्पणी करने में असमर्थ था। आगे बढ़ने पर खुशी है कि मैं टिप्पणी पोस्ट कर सकता हूं। @ राल्फफ्राइडल
ल्यूक ए

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

यदि आप चाहते हैं तो आप पीआईडी ​​फॉर्म प्राप्त कर सकते हैं 'ps aux' या एक शीर्ष।

व्यक्तिगत रूप से मैं हमेशा मुख्य नामस्थान पर ssh करता हूं, फिर मैं हमेशा बाहर निकलकर डिफ़ॉल्ट पर वापस आ सकता हूं और यदि आवश्यक हो तो नामस्थान में फिर से प्रवेश कर सकता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.