手当たり次第に書くんだ

飽きっぽいのは本能

veth と Linux bridge は何を分離しているのか – コンテナネットワークの基本構造を整理する

Docker や Kubernetes のネットワークを理解しようとすると、veth、Linux bridge、network namespace という用語がすぐに出てきます。これらはコンテナランタイム固有の部品ではなく、Linux が持つネットワーク分離と仮想接続の仕組みです。

前回整理した macvlan / ipvlan は、親インターフェースから L2 または L3 の接続点を作り、コンテナを物理ネットワークへ近い形で参加させる技術でした。一方、一般的なコンテナネットワークでは、まず network namespace でネットワーク空間を分け、その間を veth ペアで接続し、ホスト側では Linux bridge に収容します。

本記事では、veth と Linux bridge が何を分離し、何を接続しているのかを、CNI や Docker の bridge ネットワークまでつながる形で整理します。

network namespace はネットワーク空間を分ける

network namespace は、Linux 上でネットワークスタックを分離する仕組みです。namespace ごとにネットワークインターフェース、IP アドレス、ルーティングテーブル、ARP / NDP テーブル、ソケット、iptables / nftables の見え方などが分かれます。

分離されるもの意味
インターフェースnamespace ごとに見える NIC が異なる
IP アドレス同じホスト上でも別の namespace なら別の IP 設計を持てる
ルーティングテーブル宛先ごとの転送判断を namespace ごとに分けられる
ARP / NDPL2 隣接情報を namespace ごとに分離できる
ソケットプロセスが属する namespace のネットワークだけを使う

ただし、network namespace は分離するだけです。分離した namespace が外部と通信するには、どこかに接続点が必要です。その接続点として頻繁に使われるのが veth ペアです。

veth は namespace 間をつなぐ仮想ケーブル

veth は Virtual Ethernet device の略で、2 つのインターフェースがペアになって動作する仮想ネットワークデバイスです。片方へ入ったパケットは、もう片方から出てきます。物理的なケーブルで 2 つの NIC を直結したような関係を、Linux カーネル内で作る仕組みだと考えると分かりやすいです。

コンテナで使う場合、veth ペアの片方をコンテナ側の network namespace に移動し、もう片方をホスト側に残します。コンテナから見ると、自分専用の NIC が 1 つ存在するように見えます。ホストから見ると、そのコンテナへつながるケーブルの反対側が見えます。

veth の片側置かれる場所役割
コンテナ側 vethコンテナの network namespaceコンテナが使う NIC として見える
ホスト側 vethホストの network namespacebridge やルーティングへ接続する出口になる

ここで大事なのは、veth 自体はスイッチではないという点です。veth は 2 点を結ぶ仮想ケーブルであり、複数のコンテナをまとめて収容したり、L2 セグメントを作ったりする役割は持ちません。複数の veth を集約するために Linux bridge が使われます。

Linux 上では、概念的には次のようなコマンドで veth ペアを作成できます。これは説明用の最小例であり、実運用では namespace 作成、IP アドレス、経路、bridge 接続、NAT やフィルタリングを合わせて設計します。

ip link add veth-host type veth peer name veth-container
ip link set veth-container netns container-ns

Linux bridge はホスト内の仮想スイッチ

Linux bridge は、ホスト内で複数のインターフェースを L2 的に接続する仮想スイッチです。複数のホスト側 veth を bridge に接続すると、コンテナ同士が同じ L2 セグメントにいるように通信できます。

構成要素役割
Linux bridgeホスト内の仮想スイッチ
ホスト側 veth各コンテナから bridge へつながるポート
コンテナ側 vethコンテナ内の NIC
物理 NIC必要に応じて外部ネットワークへ出る出口

bridge は MAC アドレスを学習し、宛先 MAC アドレスに応じてフレームを転送します。この点では物理スイッチに近い動作をします。ただし、Linux bridge はホスト内のソフトウェア機能です。物理スイッチのように見えても、実体は Linux カーネル内のブリッジング機能です。

Docker の bridge ネットワークや CNI の bridge プラグインは、この考え方を利用します。コンテナごとに veth ペアを作り、ホスト側を bridge へ接続し、コンテナ側を個別の network namespace へ入れることで、複数のコンテナを同じ仮想 L2 ネットワークに収容します。

veth と bridge は役割が違う

veth と bridge は一緒に登場するため混同されがちですが、役割は明確に異なります。veth は 2 点間の接続を作る部品であり、bridge は複数の接続点を集約する部品です。

要素何をするか何をしないか
network namespaceネットワーク空間を分離する外部との接続は作らない
veth2 つのネットワーク空間を 1 対 1 で接続する複数ポートを集約しない
Linux bridge複数の veth や NIC を L2 的に接続するnamespace 自体を分離しない
ルーティングL3 で経路を選ぶL2 セグメントを作るわけではない

この分担を誤ると、コンテナネットワークの問題を見たときに原因の切り分けが難しくなります。コンテナ内にインターフェースが見えないのか、veth ペアが切れているのか、bridge に接続されていないのか、bridge から外部へ出る経路や NAT がないのかでは、調べる場所が違います。

bridge 構成では通信がどこを通るのか

一般的な bridge 構成では、コンテナから外部へ出る通信は、コンテナ側 veth、ホスト側 veth、Linux bridge、ホスト側のルーティングまたは NAT、物理 NIC という順に進みます。コンテナ同士が同じ bridge に接続されている場合は、bridge 内で L2 転送され、物理 NIC まで出ないこともあります。

  1. コンテナ内のアプリケーションがパケットを送信する。
  2. コンテナ側 veth からホスト側 veth へパケットが渡る。
  3. ホスト側 veth が Linux bridge のポートとして扱われる。
  4. bridge が宛先 MAC アドレスに基づいて転送先を決める。
  5. 外部宛てであれば、ホスト側のルーティング、NAT、フィルタリングを経由して物理 NIC へ出る。

この構造では、コンテナは物理ネットワークへ直接ぶら下がっているわけではありません。ホスト内の仮想 L2 ネットワークに収容され、必要に応じてホストが外部ネットワークとの境界になります。ここが macvlan / ipvlan と大きく異なる点です。

参考
書籍
参考書籍

Linux ネットワーク namespace / bridge / veth 関連資料を探す

Linux の network namespace、仮想ネットワーク、CNI、コンテナネットワークを確認したい場合の検索リンクです。価格、在庫、内容はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

CNI bridge プラグインは何を自動化するのか

CNI の bridge プラグインは、コンテナを Linux bridge へ接続する処理を自動化します。CNI はコンテナランタイムから呼び出され、指定された network namespace に対してインターフェース作成、bridge 接続、IP アドレス設定などを行います。処理の流れは、概念的には次のように整理できます。

  1. ホスト側に Linux bridge を用意する。
  2. コンテナ用の veth ペアを作成する。
  3. 片方をコンテナの network namespace に移動する。
  4. もう片方を Linux bridge に接続する。
  5. IPAM によって IP アドレスを割り当てる。
  6. 必要に応じてルーティング、NAT、hairpin、フィルタリングを設定する。

CNI bridge プラグインは、Linux bridge というデータプレーンを新しく発明しているわけではありません。Linux の既存機能を、コンテナ作成と削除のライフサイクルに合わせて呼び出していると見る方が正確です。

Docker bridge ネットワークとの関係

Docker の bridge ネットワークも、基本的には同じ考え方に立っています。Docker デーモンは bridge ネットワークを作成し、コンテナごとに veth ペアを用意し、ホスト側を bridge へ接続します。デフォルトの bridge ネットワークでは、外部通信のために IP マスカレードやポート公開の仕組みも関係します。

ただし、Docker の bridge ネットワークと Kubernetes の CNI bridge 構成は、管理主体や設定モデルが異なります。Docker では Docker デーモンがネットワークを管理します。Kubernetes では kubelet とコンテナランタイムが CNI プラグインを呼び出し、クラスタの Pod ネットワークとして構成します。どちらも Linux の同じ部品を使うことがありますが、運用上の責任分界は同じではありません。

macvlan / ipvlan との違い

veth + bridge 構成と macvlan / ipvlan 構成は、どちらもコンテナにネットワークインターフェースを見せます。しかし、物理ネットワークからの見え方が異なります。

方式コンテナからの見え方物理ネットワークからの見え方主な設計意図
veth + bridge専用 NIC があるように見えるホスト配下の仮想ネットワークホスト内でコンテナを集約し、必要に応じて外部へ出す
macvlan専用 NIC があるように見える複数 MAC アドレスを持つ端末群既存 L2 ネットワークへ端末として直接収容する
ipvlan専用 NIC があるように見える共通 MAC に複数 IP がぶら下がるMAC 数を抑えつつ IP 単位で接続点を分ける

bridge 構成は、ホスト内に仮想的な L2 セグメントを作り、コンテナをそこへ収容する考え方です。macvlan / ipvlan は、親インターフェースを起点に、コンテナを物理ネットワークへより直接的に見せる考え方です。どちらが上位互換という話ではなく、何を分離し、どこを境界にするかが違います。

障害解析ではどこを見るべきか

veth と bridge の役割を分けて理解しておくと、障害解析の入口が明確になります。コンテナ内で IP アドレスがない場合、まず container 側の namespace と CNI / IPAM を見ます。ホスト側 veth が bridge に接続されていない場合は、CNI 実行や bridge 設定を見ます。コンテナ同士は通信できるが外部へ出られない場合は、ホスト側のルーティング、NAT、フィルタリング、物理 NIC 側を確認します。

症状主に見る場所
コンテナ内にインターフェースがないnetwork namespace、CNI 実行結果、veth 作成
コンテナ内に IP アドレスがないIPAM、CNI 設定、アドレスプール
同一ホスト内のコンテナ同士が通信できないveth、Linux bridge、bridge のポート状態
外部へ出られないホストのルーティング、NAT、フィルタリング、物理 NIC
外部から入れないポート公開、Service、Node 側の経路、ファイアウォール

コンテナネットワークの問題は、すぐに Kubernetes や Docker の設定だけに見えてしまいます。しかし下には Linux の network namespace、veth、bridge、ルーティング、フィルタリングがあり、どの層で止まっているかを分けて見る必要があります。

まとめ

veth と Linux bridge は、コンテナネットワークの基本を支える Linux の部品です。network namespace はネットワーク空間を分け、veth は分離された空間どうしを 1 対 1 で接続し、Linux bridge は複数の veth をホスト内の L2 ネットワークとして集約します。

Docker の bridge ネットワークや CNI bridge プラグインは、この組み合わせをコンテナのライフサイクルに合わせて自動化しています。したがって、veth や bridge を理解することは、Docker や Kubernetes の表面的な設定を覚えることとは別の意味を持ちます。どこで分離し、どこで接続し、どこから物理ネットワークへ出すのかを理解するための土台になります。

macvlan / ipvlan が物理ネットワークへの見せ方を変える技術だとすれば、veth + bridge はホスト内でコンテナをどう収容するかを決める基本構造です。この違いを押さえておくと、CNI の選定、Multus の利用、NetworkPolicy、ホスト側ファイアウォール、物理ネットワークとの責任分界を考えやすくなります。

参考資料

Linux ネットワーク仮想化の関連記事
veth と Linux bridge は何を分離しているのか – コンテナネットワークの基本構造を整理する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る