Bagaimana saya bisa beralih dari namespace jaringan linux kustom kembali ke yang standar?

14

Dengan ip netns exec Anda dapat menjalankan perintah di namespace jaringan khusus - tetapi apakah ada juga cara untuk mengeksekusi perintah di namespace default?

Misalnya, setelah menjalankan dua perintah ini:

sudo ip netns add test_ns
sudo ip netns exec test_ns bash

Bagaimana bash yang baru dibuat dapat menjalankan program di namespace jaringan default? Tidak ada ip netns exec default atau yang serupa sejauh yang saya temukan.

Skenario saya adalah:

Saya ingin menjalankan server SSH di namespace jaringan yang terpisah (untuk menjaga agar sistem tidak mengetahui koneksi jaringan, karena sistem ini digunakan untuk pengujian jaringan), tetapi ingin dapat menjalankan program di namespace jaringan default melalui koneksi SSH.

Apa yang saya temukan sejauh ini:

Martin
sumber

Jawaban:

13

Distro / kernel baru mendukung nsenterperintah yang, harus melakukan apa yang Anda inginkan, asalkan Anda root ketika Anda melakukannya.

Berikut ini sebuah contoh (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 ~]# 

Ini bergantung pada setnspanggilan sistem. Anda membutuhkan setidaknya kernel 3.0 dan glibc-2.14 agar ini berfungsi.

RHEL 6.5 menyediakan dukungan untuk ruang nama yang persisten tetapi tidak mendukung untuk memindahkan proses yang ada ke ruang nama yang baru.

Matthew Ife
sumber
Ini berfungsi dengan baik, kecuali fakta bahwa Ubuntu menyediakan paket util-linux yang ketinggalan zaman tanpa nsenter. Namun, saya menemukan petunjuk pembuatan terperinci di sini: askubuntu.com/questions/439056/…
Martin
Saya mencoba nsenter -t 1 -ntetapi ia menciptakan proses baru sama seperti ip netns execdan tidak mengubah namespace dari proses saat ini.
Pavel Šimerda
15

Saya menemukan bahwa Anda dapat kembali ke namespace jaringan default dengan dua perintah sederhana:

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

Metode ini jelas mengasumsikan bahwa Anda dapat melihat proses di luar namespace Anda sendiri melalui procsistem file. Jika Anda berada di namespace PID yang terpisah juga, kembali ke namespace default tidak sesederhana itu.

Perintah di atas diuji pada Ubuntu 14.04. Saya tidak tahu apakah ada distribusi khusus tentang pendekatan ini.

kasperd
sumber
1
Ini novel yang bagus! Saya akan merekomendasikan melakukan sebenarnya mount --bindbukan ln -s, karena itu berarti ipperintah dapat mengelolanya juga (ip pada dasarnya melakukan mount --bind terhadap file namespace ini untuk mensetup ruang nama yang persisten).
Matthew Ife
@kasperd Anda mengatakan itu tidak sesederhana dengan namespace PID yang terpisah. Apakah ini sebenarnya masih mungkin? Bisakah Anda menyebutkan caranya?
copumpkin
@ Copumpkin saya belum mengujinya.
kasperd
0

"ln -s / proc / 1 / ns / net / var / run / netns / default" <----- Tidak direkomendasikan sama sekali.

Penghitung untuk kode yang menampilkan "ip netns show"

Jika Anda memiliki exec bash shell, ada yang sederhana dari bash, keluar.

Jika Anda memiliki ssh ke jaringan, kemudian ssh ke antarmuka default ns dan lakukan apa yang perlu Anda lakukan di sana.

Sebagai upaya terakhir, jadi seperti di atas, tapi saya sarankan menghapusnya segera setelah selesai, dan sebelum perubahan terjadi pada ns. Kalau tidak konter akan rusak dan menyebabkan masalah.

Luke A
sumber
2
Itu sepertinya komentar tentang jawaban lain.
RalfFriedl
Sayangnya, saya baru saja mendaftar dan tidak dapat berkomentar. Senang bergerak sekarang saya dapat memposting komentar. @RalfFriedl
Luke A
0
nsenter -n -t <pid of a process running in the default ns>

Anda bisa mendapatkan bentuk pid melakukan 'ps aux' atau bahkan gasing jika Anda mau.

Secara pribadi saya selalu ssh ke namespace utama, maka saya selalu bisa kembali ke default dengan mengetikkan exit dan kemudian memasukkan kembali namespace jika diperlukan.

Luke A
sumber