Linuxシステム(カーネルバージョン3.10)にいくつかのネットワーク名前空間を設定しました。次に、各ネットワーク名前空間に独自のDNS設定を構成します。
各_resolv.conf
_ディレクトリに_/etc/netns/[namespace]
_ファイルを作成しましたが、システムを次のように動作させたいと思います。
Bashコマンドラインで、_nsenter --net=/run/netns/[namespace name]
_を使用して特定のネットワーク名前空間のコンテキストを入力するたびに、コマンドラインから起動されたすべてのプロセス(nslookup、pingなど)を、一致する_/etc/netns/[namespace name]/resolv.conf
_。
次のようなコマンドを実行すると、
_ "ip netns exec [namespace name] [command]"
_
次に、ネームスペースのDNS設定が適用されます。
ただし、「ip netns exec」なしでコマンドを実行すると、「netns get cur」を実行するとコンテキストが目的のネットワーク名前空間に設定されていることが示されていても、DNS設定は_/etc/resolv.conf
_から取得されます。
適切なネットワーク名前空間のコンテキストで_mount --bind /etc/netns/[namespace name]/resolv.conf /etc/resolv.conf
_を実行しようとしましたが、これにより、そのネットワーク名前空間のコンテキストだけではなく、システム全体にマウントが適用されます。
マウント名前空間を使用すると効果があるのではないかと思ったので、マウント名前空間のmanページを読んでみましたが、私がそれに捧げた短時間では何もできませんでした。
この目標を達成する簡単でエレガントな方法はありますか?
解決策への助け/指示は大歓迎です!
何をしているかを見てくださいip netns exec test ...
strace
を使用した状況で。
抜粋:
# strace -f ip netns exec test sleep 1 2>&1|egrep '/etc/|clone|mount|unshare'|egrep -vw '/etc/ld.so|access'
unshare(CLONE_NEWNS) = 0
mount("", "/", 0x55f2f4c2584f, MS_REC|MS_SLAVE, NULL) = 0
umount2("/sys", MNT_DETACH) = 0
mount("test", "/sys", "sysfs", 0, NULL) = 0
open("/etc/netns/test", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
mount("/etc/netns/test/resolv.conf", "/etc/resolv.conf", 0x55f2f4c2584f, MS_BIND, NULL) = 0
再現するには(部分的に、たとえば/sys
はここでは処理されません)ip netns exec test ...
が実行中:
~# ip netns id
~# head -1 /etc/resolv.conf
# Generated by NetworkManager
~# nsenter --net=/var/run/netns/test unshare --mount sh -c 'mount --bind /etc/netns/test/resolv.conf /etc/resolv.conf; exec bash'
~# ip netns id
test
~# head -1 /etc/resolv.conf
# For namespace test
~#
そうです。 nsenter
だけでは不十分です。 unshare
を使用して、新しく作成されたマウント名前空間に変更し(これを以前のもののコピーに基づいて)、変更する必要があります。既存のものをそのまま使用するだけではありません、適合する既存のものはまだないので。これが、strace
に伝えているのと同じ名前のsyscallを実行しているものです。
bash
の代わりにnsenter
とともにip netns exec
を使用できます。つまり、
ip netns enter [namespace name] bash
これにより、名前空間固有のネットワーク構成ファイルが(他のセッションに影響を与えることなく)デフォルト(グローバル)の場所に自動的にバインドマウントされるインタラクティブなシェルセッションに入ることができます。
以下は ip netns
manページ からの抜粋です。
ネットワーク名前空間を認識するアプリケーションの場合、慣例として、最初に/ etc/netns/** NAME /でグローバルネットワーク構成ファイルを探し、次に**/etc /。たとえば、vpnを分離するために使用されるネットワーク名前空間に/ etc/resolv.confの別のバージョンが必要な場合は、/ etc/netns/myvpn/resolv.conf。
ip netns execは、マウントネームスペースを作成し、ネットワークネームスペースごとのすべてをバインドマウントすることにより、この構成、ネットワークネームスペース非対応アプリケーションのファイル規則の処理を自動化します/ etc内の従来の場所にファイルを保存します。
特に、ネットワーク名前空間awareアプリケーションとネットワーク名前空間unawareアプリケーションの違いに注意してください。
一方、 nsenter
manページ は、この区別について言及していないようです(特に、「aware」、「resolv」、「。conf」という文字列を検索しました。 「/ etc」、結果は見つかりませんでした)。これは、nsenter
ユーティリティが名前空間非対応アプリケーションの同じ種類の自動処理を実行しないことを示唆しているようです。
Network Namespaces に加えて、 ser Namespaces および Mount Namespaces も参照する必要があります。 DNSを超えてさらに分離したい場合は、コンテナ化を検討することもできます。 LXCコンテナ または Docker 。