Network Namespaceの概念と基本操作
Network Namespaceは、Linuxカーネルが提供するネットワークスタックの分離機能です。これにより、独立したルーティングテーブル、IPアドレス、ファイアウォール(iptables)ルールを持つ複数の仮想ネットワーク環境を単一のホスト上に構築できます。コンテナ技術(DockerやLXC)のネットワーク基盤として不可欠な要素です。
各Namespaceは完全に隔離されており、デフォルトでは自分自身のループバック(lo)インターフェースのみを持ち、他のNamespaceのリソースにはアクセスできません。また、物理デバイスは一度に一つのNamespaceにしか所属できません。
# Namespaceの作成
sudo ip netns add sandbox-ns
# 作成済みNamespaceの確認
ip netns list
# 特定のNamespace内でコマンドを実行
sudo ip netns exec sandbox-ns ip addr
# Namespace内でループバックを有効化
sudo ip netns exec sandbox-ns ip link set lo up
Network Namespace作成の内部メカニズム
ip netns addコマンドが実行される際、システム内部では/var/run/netns/ディレクトリにファイルを作成し、新しいNamespaceをそこにバインド(mount --bind)しています。これにより、プロセスが存在しなくなってもNamespaceが維持されます。
# 手動でのNamespaceシミュレーション
# 1. Namespace保存用ディレクトリの準備
sudo mkdir -p /var/run/netns
sudo touch /var/run/netns/manual-ns
# 2. 新しいネットワーク名前空間でシェルを起動
sudo unshare --net bash
# 3. 現在のプロセスの名前空間をファイルにバインド(別ターミナルで実行)
# プロセスIDを確認して実行
sudo mount --bind /proc/[PID]/ns/net /var/run/netns/manual-ns
Tun/Tap:ユーザ空間とカーネル空間の架け橋
TunとTapは、物理的なハードウェアを持たないソフトウェア仮想デバイスです。カーネルのネットワークプロトコルスタックと、ユーザ空間のアプリケーションを接続する役割を果たします。
- TUN (Network TUNnel): L3(IPパケット)レベルで動作します。VPNやトンネリングで主に使用されます。
- TAP (Network TAP): L2(イーサネットフレーム)レベルで動作します。仮想マシンのNICとして振る舞い、ブリッジに接続することが可能です。
物理NICがパケットをネットワーク線へ送出するのに対し、Tun/Tapデバイスはユーザ空間のプログラム(ファイル記述子)へパケットを渡します。
Veth Pair:仮想的なネットワークケーブル
Veth (Virtual Ethernet) デバイスは、常にペアで作成されます。一方のインターフェースに送られたデータは、もう一方から即座に出力されます。これは、異なるNetwork Namespace同士を接続するための「仮想ケーブル」として機能します。
# Vethペア(v-link-a と v-link-b)の作成
sudo ip link add v-link-a type veth peer name v-link-b
# 片方をNamespaceへ移動
sudo ip link set v-link-b netns sandbox-ns
# それぞれのデバイスを活性化
sudo ip link set v-link-a up
sudo ip netns exec sandbox-ns ip link set v-link-b up
Bridge:仮想的なL2スイッチ
Linux Bridgeは、複数のネットワークデバイス(物理・仮想問わず)を接続し、MACアドレス学習に基づいてパケットを転送する仮想スイッチです。ハブのように機能し、異なるNamespaceや仮想マシン、ホストの物理ネットワークを橋渡しします。
# ブリッジの作成(ipコマンドを使用)
sudo ip link add name br-lab0 type bridge
sudo ip link set br-lab0 up
# インターフェースをブリッジに追加
sudo ip link set v-link-a master br-lab0
実践演習:BridgeとVethを用いたNamespace間通信の構築
ここでは、2つの独立したNamespaceを1つの仮想ブリッジで相互接続する構成を構築します。
# 1. 環境のクリーンアップとNamespaceの作成
sudo ip netns add node-1
sudo ip netns add node-2
sudo ip link add name br-core type bridge
sudo ip link set br-core up
# 2. node-1接続用のVethペア設定
sudo ip link add veth1-host type veth peer name veth1-node
sudo ip link set veth1-node netns node-1
sudo ip link set veth1-host master br-core
sudo ip link set veth1-host up
sudo ip netns exec node-1 ip addr add 192.168.50.1/24 dev veth1-node
sudo ip netns exec node-1 ip link set veth1-node up
# 3. node-2接続用のVethペア設定
sudo ip link add veth2-host type veth peer name veth2-node
sudo ip link set veth2-node netns node-2
sudo ip link set veth2-host master br-core
sudo ip link set veth2-host up
sudo ip netns exec node-2 ip addr add 192.168.50.2/24 dev veth2-node
sudo ip netns exec node-2 ip link set veth2-node up
# 4. 疎通確認
sudo ip netns exec node-1 ping -c 3 192.168.50.2
この構成では、node-1から送信されたICMPパケットはveth1-nodeを通り、ペアであるveth1-hostからブリッジbr-coreへ届きます。ブリッジは宛先MACアドレスを解決し、veth2-hostを経由して最終的にnode-2のveth2-nodeへパケットを転送します。これが近代的なコンテナネットワークの基本的なパケットフローの原型です。