名前空間管理に ip netns(iproute2) を使用する

名前空間管理に ip netns(iproute2) を使用する

カスタムネームスペースに加えられた変更をどこで見つけることができるか疑問に思います。仮想インターフェイス「vpeer」と「lo」を含む「ns1」名前空間があり、dnsmasqまたはHostapdを介してインターフェイス「vpeer」の設定を変更したいとします。

$ ip netns exec ns1 bash
$ dnsmasq --interface=vpeer-ns1 --dhcp-range=192.168.0.100,192.168.0.200,255.255.255.0

netnsは私のためにインストールし、すべてのタスクを管理するなど、残りのタスクを実行しています。本当にありがとうございます。ただし、グローバル名前空間では、そのファイルの変更を監視したり、ファイルに直接適用したりできます。例えば/etc/dnsmasq.confまたは/etc/hostapd/hostapd.conf

だから私の質問は、特定のnetns名前空間でデフォルトの名前空間動作を複製する方法です。私が何をしたのか、 "ns1"インターフェイスの現在の設定が何であるかを知っておく必要があります。具体的には、ほとんどのチュートリアルではこれらのプロセスを説明しているので、さらにそうです。これIP netns のマニュアルページ設定ファイルが次の場所にあると言います。

$ /etc/netns/ns1/

ただし、「ns1」名前空間を作成した後は、/ etc / netnsディレクトリも存在しません。新しい名前空間は/var/run/netns/ns1にのみ表示されます。上記の dnsmasq コマンドを適用した後でも、ファイルは常に空であり、nano は空のファイルを表示しますが、ファイルを閉じると奇妙なエラーが発生します。

ns1: Argument is invalid.

だから名前空間"ns1"に切り替えて再試行しました。同じ結果。だから私は新しい名前空間のすべてのデバイスをオフにしました。

$ ip netns exec ns1 ip link set dev lo down
$ ip netns exec ns1 ip link set dev vpeer down

今回も同じ結果です。

では、どのように構成にアクセスできますか?文書私が知っている限り、アプリケーションはネイティブではなくネームスペースについて全く知らないので、特定のネームスペースについてどうすればよいですか?よろしくお願いします。

ベストアンサー1

2つの質問が1つに統合されました。

  • 中の空のファイルは何ですか/var/run/netns/
  • /etc/netns/存在しないものをどのように使用しますか?

中の空のファイルは何ですか/var/run/netns/

少し理解名前空間必要です。ここでは詳しく説明できません。名前空間は、作成されたら(ネットワークなどの一部のカーネルリソースの分割)、何かがそれを使用する限り存在します。主に2つの目的に使用されます。プロセスまたは特殊な擬似ファイルシステムのマウントポイントですnsfs。使用を中断または消えると、名前空間も消えます。

ip netns(専門ネットワーク名前空間)ネットワーク名前空間への参照をインストールしてネットワーク名前空間を保存する場合に選択します。これらの参照は/proc/<pid>/net/シンボリックリンクとして提供されます。例:

$ ls -l /proc/$$/ns/net
lrwxrwxrwx. 1 user user 0 Sep 25 01:05 /proc/19120/ns/net -> net:[4026531992]
$ stat -L -f -c %T /proc/19120/ns/net # filesystem type. "df" on this would be confused and point to the wrong mountpoint anyway.
nsfs
$ stat -L -c %i /proc/19120/ns/net # inode
4026531992

ip netns add通常/var/run/netns/<NAME>、マウントディレクトリをディレクトリにバインドしながら、マウントファイルをファイルにバインドすることもできます。また、このファイルはファイルシステムのダミーファイルであることに注意してくださいnsfs。この本は読むように設計されておらず、読むこともできません。主に開いたり(読んだり書いたりしない)、マウントして参照に渡すためのものです。

# strace -e unshare,mount  ip netns add ns1
mount("", "/var/run/netns", 0x5625f6ca80e3, MS_REC|MS_SHARED, NULL) = 0
unshare(CLONE_NEWNET)                   = 0
mount("/proc/self/ns/net", "/var/run/netns/ns1", 0x5625f6ca80e3, MS_BIND, NULL) = 0
+++ exited with 0 +++
# ip netns list
ns1
# ls -l /var/run/netns/ns1
-r--r--r--. 1 root root 0 Sep 25 01:08 /var/run/netns/ns1
# cat /var/run/netns/ns1
cat: /var/run/netns/ns1: Invalid argument
# stat -f -c %T /var/run/netns/ns1
nsfs
# stat -c %i /var/run/netns/ns1
4026532824
# ip netns exec ns1 sleep 99 &
[1] 19620
# ls -l /proc/19620/ns/net
lrwxrwxrwx. 1 root root 0 Sep 25 01:23 /proc/19620/ns/net -> net:[4026532824]

したがって、sleep 99ネットワークネームスペースはマウントポイントのネットワークネームスペースです/var/run/netns/ns1。たとえば、この方法を使用すると、vethインターフェイスを介して別の名前空間に接続し、プロセスを必要としないため、プロセスを実行しないブリッジを持つネットワーク名前空間を持つことができます。

ip netns次のコマンドを使用して、生成された名前空間を手動で削除できます。

# umount /var/run/netns/ns1 
# rm /var/run/netns/ns1
# ip netns list
#

もちろん、ネットワークネームスペースは、それを使用した最後の参照(プロセスなど)も消えたときにのみ実際に消えます。以前のsleepコマンドがまだ実行されている場合は、元に戻すこともできます。

# touch /var/run/netns/ns1
# mount --bind /proc/19620/ns/net /var/run/netns/ns1
# ip netns
ns1

これは、コンテナ全体のネットワーク名前空間部分を「コピー」するために使用できます。ホスト側の一部のpid(例えば、lxc-info -Hp -n containerまたはdocker inspect --format '{{.State.Pid}}' container)を知って、そのネットワークネームスペースをマウントするだけです。tcpdumpコンテナ内では使用できないデバッグコマンド(...)を便利に実行できます。

上記の内容はすべて一時的であり、たとえば再起動すると消えます。

/etc/netns/存在しないものをどのように使用しますか?

これip netnsマンページ言った(太い強調私):

ネットワークネームスペースを理解するアプリケーションの場合/etc/netns/、ルールは最初にNAME /でグローバルネットワーク設定ファイルを見つけ、次にそれを見つけることです。たとえば、VPNを分離するために異なるバージョンのネットワーク名前空間を/etc/使用する場合は、名前をとして指定できます。/etc/resolv.conf/etc/netns/myvpn/resolv.conf

dnsmasqネットワークネームスペースを「認識」していますか? (ip netnsの定義に従って)そうであれば、/etc/netns/どのような方法でも確認されます。 「netns」への言及はありません。マンページ。現在、Debian(ラズベリーのような)ソースコードにはこの単語はどこにも含まれていませんnetns。ネットワーク名前空間をサポートしていません。

ip netnsマンページの次の文が私たちに知らせる理由は次のとおりです。

ip netns execこの設定は、ファイルルールを自動的に処理します。ネットワークネームスペースを認識しないアプリケーションの場合、インストール名前空間を作成し、すべてのネットワーク固有の名前空間設定ファイルを/etc

ip netns execこれは実際には説明しませんが、前の文と一緒にバインドがマウントされるという意味です。ソースとターゲットの両方が存在する場合/etc/netns/<NAME>/whatever存在する/etc/whatever/etc/netns構成を含める内部で選択されたネットワーク名前空間名まず、手動で作成する必要があり、実際の構成内容を内部的にコピーして編集できます。ip netns exec見つかった場合に使用されますが、生成されません。

例:

# mkdir -p /etc/netns/ns1
# echo something > /etc/netns/ns1/whatever
# : > /etc/whatever
# ip netns add ns1
# cat /etc/whatever
# ip netns exec ns1 cat /etc/whatever
something

後ろで何が起こったか:

# strace -e open,unshare,setns,mount,umount2 ip netns exec ns1 cat /etc/whatever 2>&1 |egrep '^(open.*/etc/netns|unshare|setns|mount|umount|something)'
setns(5, CLONE_NEWNET)                  = 0
unshare(CLONE_NEWNS)                    = 0
mount("", "/", 0x55947eb550e3, MS_REC|MS_SLAVE, NULL) = 0
umount2("/sys", MNT_DETACH)             = 0
mount("ns1", "/sys", "sysfs", 0, NULL)  = 0
open("/etc/netns/ns1", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
mount("/etc/netns/ns1/whatever", "/etc/whatever", 0x55947eb550e3, MS_BIND, NULL) = 0
something

もちろん、これは/etc/netns/ns1ファイルではなく内部ディレクトリでも同じです。フルディレクトリは、/etc/存在する場合にのみ同じ名前の保護されたホストディレクトリに直接表示されます。

したがって、特に明記しない限り、dnsmasq のデフォルト設定が次の場合、/etc/dnsmasq.confas の代替設定を作成して、次のように表示することができます。ns1/etc/netns/ns1/dnsmasq.confip netns exec/etc/dnsmasq.confdnsmasqもし/etc/dnsmasq.conf空でもすでにファイルがあります。これは/etc一時ではなく、同じネットワーク名前空間名を再作成するたびに再利用されるためです。hostapdディレクトリ全体は同じ/etc/hostapd/で、/etc/netns/ns1/hostapd/ファイルは内部でコピーおよび変更できます。外部を指すシンボリックリンクに注意してください。これで、通常どおり内部でコマンドを実行できますip netns exec ns1。コマンドは新しい構成ファイルを使用します。

おすすめ記事