Linuxネットワーク名前空間とvethペアによるパケット経路
名前空間が分離するネットワーク状態と、vethペアが結ぶ範囲を整理し、リンク作成だけでは通信経路が完成しない理由を説明します。
発行・訂正窓口:infostoa · 編集基準
この記事の個別の執筆者・専門査読者の情報は提供されていません。
Linuxのネットワーク名前空間は、ネットワークデバイス、IPスタック、ルーティングテーブル、ファイアウォール規則、ソケットのポート空間を分けます。vethペアは一方の端に送ったパケットをもう一方へ届ける仮想リンクです。ただし、リンクを作っただけでIPアドレスや経路、転送設定まで自動で整うわけではありません。
名前空間ごとに分かれるネットワーク状態
ネットワーク名前空間は、プロセスから見えるネットワーク資源の範囲を分けます。インターフェースやアドレス、経路表、ファイアウォール規則はそれぞれの名前空間で管理されます。そのため、別々の名前空間で同じインターフェース名やポート番号を使っても、同じネットワーク上の設定を共有するとは限りません。一方の経路を変更しても、もう一方の経路表が自動で書き換わることはありません。
確認コマンドも実行した場所に結び付いています。ホスト上で表示した経路表はホストの状態を示し、コンテナや別の名前空間が選ぶ経路とは異なる場合があります。ファイアウォールを調べるときも、どの名前空間の規則を見ているかを最初に確かめます。
vethペアは両端がつながった仮想リンク
vethデバイスはペアで作られ、一方に送信したフレームは相手側の端で受信されます。両端を別々のネットワーク名前空間に配置すると、名前空間間の仮想ケーブルになります。Red Hatの実例では、二つの名前空間に片端ずつ置き、アドレスを設定して直接接続された端点間の通信を試します。
vethが提供するのはリンクです。ルーターやネットワーク全体の自動設定ではありません。インターフェースを有効にし、意図したサブネットに合うアドレスを設定して初めて、IPレベルの通信条件が整います。一方の端が停止するとペアのもう一方もリンク状態を失うため、通信が消えたときは両端を調べます。
リンクの接続とルートは別に設定する
同じサブネットにある二つのアドレスは、インターフェースが有効で隣接先の解決ができれば直接通信できます。別のネットワーク宛てに送るには、次の転送先を選ぶルートが必要です。複数の名前空間やホストを通る構成では、通過する各境界で次の経路が正しく設定されている必要があります。一つの名前空間の経路表が、他の名前空間の経路を代わりに決めることはありません。
コンテナ環境では、ホスト側のvethをブリッジなどに接続する構成もよく使われます。しかし装置をつないでも、パケット転送が自動で許可されるとは限りません。外部ネットワークへ到達させるには、IPフォワーディング、ファイアウォール規則、構成によってはアドレス変換も必要です。これらは実行環境や管理者が決めて設定する項目です。
パケットが止まった境界を順に調べる
vethが見えるのに通信できない場合は、まずプロセスが実際に属する名前空間から確認します。インターフェースの状態とアドレス、送信先に対して選ばれた経路を見て、次にペアの反対側へパケットが届くかを確かめます。その先へ進む必要があれば、次の名前空間やホストの経路表を追い、転送設定とファイアウォール規則を確認します。
キャプチャやカウンターを使う場合も、観測する名前空間を取り違えないことが大切です。vethの両側で確認すれば、パケットがどの境界まで進んだかを切り分けやすくなります。経路全体を一度に推測するより、リンク、経路選択、転送ポリシーの順で見れば原因を絞れます。
ネットワーク名前空間は共有Linuxカーネル内でネットワーク資源を分ける機能であり、完全な仮想マシンではありません。vethペアだけでセキュリティや完全な隔離が保証されるわけでもありません。到達可能性と分離の程度は、権限、インターフェースの配置、経路、転送設定、ファイアウォール規則に左右されます。