各ネットワーク名前空間に個別のDNSを構成する

各ネットワーク名前空間に個別のDNSを構成する

Linuxシステム(カーネルバージョン3.10)に複数のネットワークネームスペースを設定し、各ネットワークネームスペースが一意のDNS設定を持つように構成しようとしています。

resolv.conf各ディレクトリにファイルを作成したので、/etc/netns/[namespace]システムは次のように動作するようになりました。

bashコマンドラインから特定のネットワークネームスペースに移動するコンテキストを使用するたびに、nsenter --net=/run/netns/[namespace name]コマンドラインから開始されたすべてのプロセス(nslookup、pingなど)が一致を使用して設定されたDNS設定で実行されることを望みます/etc/netns/[namespace name]/resolv.conf

次のようにコマンドを実行すると:

 "ip netns exec [namespace name] [command]"

次に、名前空間のDNS設定を適用します。

ただし、「ip netns exec」なしでコマンドを実行すると、/etc/resolv.conf「netns get cur」を実行すると、コンテキストが目的のネットワーク名前空間に設定されていることを示していますが、DNS設定はここから取得されます。

適切なネットワーク名前空間のコンテキストでこれを試しましたが、mount --bind /etc/netns/[namespace name]/resolv.conf /etc/resolv.confこれはそのネットワーク名前空間のコンテキストではなくシステム全体にマウントを適用します。

私はマウントネームスペースの使用が役に立つと思ったので、マウントネームスペースのマニュアルページを読んでみましたが、短い作業時間内に何も得られませんでした。

これを達成する簡単でエレガントな方法はありますか?

ソリューションの助けやご案内をいただきありがとうございます!

答え1

解決策

usingの代わりにip netns execwithを使用できます。つまり:bashnsenter

ip netns exec [namespace name] bash

これにより、ネームスペース固有のネットワーク構成ファイルは、他のセッションに影響を与えることなく、デフォルト(グローバル)の場所に自動的にバインドインストールされるインタラクティブシェルセッションに入ることができます。

説明する

以下は から抜粋したものです。ip netnsマニュアルページ:

ネットワークネームスペースを認識するアプリケーションの場合は、まず**/etc/netns/**NAME/でグローバルネットワーク構成ファイルを見つけてから/など/。たとえば、異なるバージョンの/etc/resolv.confVPNを分離するために使用されるネットワーク名前空間の場合は、名前を指定できます。/etc/netns/myvpn/resolv.conf

IP netnsの実行この設定はインストールネームスペースを作成し、すべてのネットワーク固有のネームスペース設定ファイルを/ etcの既存の場所にバインドマウントすることによって自動的に処理され、ネットワークネームスペース対応アプリケーションのファイルルールは自動的に処理されます。

ネットワーク名前空間の違いに特に注意してください。知っているアプリケーションとネットワークの名前空間全く知らないアプリ。

これnsenterマニュアルページ一方、これらの区別への言及はないようです(特に「aware」、「resolv」、「.conf」、および「/ etc」文字列を検索しましたが、結果は見つかりませんでした)。これはnsenter、ユーティリティが名前空間を認識しないアプリケーションに対して同じタイプの自動処理を実行しないことを示すようです。

追加コメント

またネットワークネームスペース、あなたも見たいかもしれませんユーザーネームスペースそしてマウントネームスペース。 DNS以外の追加の分離が必要な場合は、コンテナ化を検討することもできます。LXCコンテナルーストアバウト、または完全な仮想マシンでもかまいません。

答え2

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

答え3

最初の2つの回答は良い情報と回答を提供しますが、少し異なる観点から答えてみましょう。

ネットワーク名前空間は、ネットワークインターフェイス、ネットワークパスとルール、ネットワークフィルタのエントリを配置する場所を提供します。

マウントネームスペースはファイルを保存する場所を提供します。これらのファイルはネットワークに関連付けられており、特定のネットワーク名前空間で使用するためのものかもしれませんが、最終的にはファイルにすぎません。

新しいネットワークネームスペースを作成すると(たとえば、 " ip netns add newnetns"を使用している場合)、新しいマウントネームスペースは自動的には提供されません。

" "コマンドを使用すると、ip netns exec newnetns somecomand新しいネットワークネームスペース(以前に作成されたnewnetns)を使用して新しいプロセス(somecommand)が作成され、このプロセス用に作成された新しいマウントネームスペースも取得されます。また、新しいインストール名前空間(たとえば、/etc/netns/newnetns/resolv.confto /etc/resolv.conf)にインストールするために特定のファイルをバンドルします。今、 ""を使用すると、ip netns execこれらのファイルは通常resolv.confなどのネットワークに関連付けられています。ただし、これらのファイルがネットワークに関連付けられていて、新しいネットワーク名前空間で使用するために作成したとしても、新しいネットワーク名前空間の一部ではありません。プロセス(一部のコマンド)が終了すると、そのために作成されたマウントネームスペースも消えますが(他のプロセスが別の方法で同じマウントネームスペースに接続されていない限り)、ネットワークネームスペースは保持されます。

このコマンドを使用すると、nsenter選択したネットワーク名前空間にコマンドが配置されますが、nsenter""などのip netns exec新しいマウント名前空間は作成されません。

ip netns add newnetns「」は本質的に空の新しいネットワーク名前空間を作成することに注意する価値があります。この新しいネットワーク名前空間にインターフェイスまたはパスを追加する必要があります。プロセスを「ネットワークネームスペースに配置し、ロードが追加されたバインドマウントのみを含むデフォルトのip netns execマウントネームスペース(メインファイルシステムを表示する可能性が高い)のコピーである新しいマウントネームスペースを作成します。

ip-netnsマニュアルページには、ネットワークネームスペース対応アプリケーションで使用されるファイルルールを表すと言及されていることにも注目する価値があります。これは、ファイルルールを使用するネットワーク認識アプリケーションがたくさんあるという印象を与える可能性があります。/etc/netns/nsname/... 私が知る限り、これは本当ではありません。現時点では、このファイルを使用する他のアプリケーションは考えられませんが、おそらく存在する可能性が/etc/netns/nsname/...あります。

関連情報