はじめに
KVM仮想化環境を構築する際、libvirtが自動生成するiptablesルールに戸惑うことがあります。
本記事では、iptables -L -n
および iptables -t nat -L -n
の出力をもとに、iptablesの構造とlibvirtのネットワーク制御について整理します。
iptablesの基本構造
iptablesはLinuxの通信制御を担うツールで、以下のような構造を持ちます:
🔹 テーブル(tables)
テーブル名 | 目的 |
---|---|
filter |
通信の許可・拒否(基本) |
nat |
IPやポートの変換(NAT) |
mangle |
パケットの詳細変更(TTLなど) |
raw |
conntrack前の処理(高度な用途) |
🔸 チェイン(chains)
チェイン名 | 意味 |
---|---|
INPUT |
外部 → ホスト(受信) |
OUTPUT |
ホスト → 外部(送信) |
FORWARD |
ホストを経由する通信(VMなど) |
PREROUTING |
通信が届く前の処理(nat用) |
POSTROUTING |
通信が出ていく直前の処理(nat用) |
libvirtによるiptablesルールの自動生成
libvirtが仮想ネットワーク(例:virbr0)を作成すると、以下のようなチェインが追加されます:
-
LIBVIRT_INP
/LIBVIRT_OUT
:DNS・DHCP通信の許可 -
LIBVIRT_FWO
/LIBVIRT_FWI
:VMと外部ネットワークの通信制御 -
LIBVIRT_FWX
:VM同士の通信許可 -
LIBVIRT_PRT
:NAT変換(MASQUERADE)
実際のiptablesルールの読み解き
🔹 filterテーブル
Chain INPUT
→ LIBVIRT_INP: DNS(53), DHCP(67)の受信許可
Chain OUTPUT
→ LIBVIRT_OUT: DNS(53), DHCP(68)の送信許可
Chain FORWARD
→ LIBVIRT_FWX: VM間通信を許可
→ LIBVIRT_FWO: VM → 外部通信を許可(172.16.1.0/24)
→ LIBVIRT_FWI: 外部 → VM通信は応答のみ許可(RELATED,ESTABLISHED)
🔹 natテーブル
Chain POSTROUTING
→ LIBVIRT_PRT: VMのIPをホストIPに変換(MASQUERADE)
Chain LIBVIRT_PRT
→ RETURN: マルチキャスト・ブロードキャストは変換対象外
→ MASQUERADE: VM → 外部通信をSNATで変換
通信の流れとセキュリティ設計
VMが外部へ通信 → FORWARD → LIBVIRT_FWO → 許可
通信が外へ出る → POSTROUTING → LIBVIRT_PRT → MASQUERADE
外部からの応答 → LIBVIRT_FWI が RELATED,ESTABLISHED を許可
VM間通信 → LIBVIRT_FWX が許可
この構成により、VMは外部と通信可能でありつつ、不要な外部からの接続は拒否される設計になっています。
まとめ
iptablesは「テーブル」と「チェイン」で構成される通信制御の仕組み
libvirtは仮想ネットワークに必要なルールを自動生成してくれる
DNS・DHCP・NAT・VM間通信など、用途ごとにチェインが分かれている
セキュリティと利便性を両立した構成になっている