10秒でネットワークがダウン:DHCP Starvationを理解する
DHCP Starvation(DHCP枯渇攻撃)は古くからある手法ですが、今なお非常に効果的な攻撃です。これはローカルネットワークがIPアドレスを割り当てる仕組みを標的にします。攻撃者は Yersinia のようなツールを使用し、偽装したMACアドレスを使ってDHCPサーバーに数千のリクエストを送りつけます。
一般的な/24ネットワークでは、1台のノートPCがわずか2秒足らずで利用可能な254個のIPアドレスをすべて使い果たしてしまう可能性があります。プールが空になると、正当なデバイスは接続できなくなります。これは通常、攻撃者が不正なDHCPサーバーを設置してデータをハイジャックする「中間者攻撃(Man-in-the-Middle attack)」の足がかりとなります。
エンタープライズ向けのスイッチには、通常これを防ぐ設定が組み込まれています。しかし、Proxmoxクラスター、KVMホスト、エッジゲートウェイといった現代的なセットアップの多くは、Linux Bridgeに依存しています。私は、数百台のVMが稼働する本番環境で、これらのソフトウェア定義の防御策を導入してきました。その結果は非常に堅牢で、高価なマネージドスイッチを購入することなく、ハードウェア級のセキュリティを実現できています。
防御戦略の選択
DHCPの脅威からネットワークを保護するには、主に3つの方法があります。ハードウェアや規模に応じて、それぞれ適したユースケースがあります。
- ハードウェアベース의 Snooping: CiscoやJuniperなどの製品に標準搭載されています。高速でシンプルですが、特定のベンダーに縛られ、高額なサポート契約が必要になります。
- Linux Bridge フィルタリング (ebtables/nftables): 手動で設定する柔軟性の高いアプローチです。あらゆるLinuxマシンで動作し、クラウドプロバイダーや自作ルーターにとってのゴールドスタンダードです。
- MAC制限: 攻撃を発生源で食い止めます。単一の仮想ポートを1つか2つのMACアドレスに制限することで、最初のパケットがサーバーに届く前に枯渇攻撃を無効化します。
Linuxベースの防御は最適か?
メリット
- ライセンス料が不要: カーネルに標準搭載されている
ebtablesなどのツールを使用します。 - きめ細やかな制御: 新しいVMがプロビジョニングされたときに、ルールを自動更新するスクリプトを作成できます。
- 監査の向上:
journalctlを使用して、ポートが不審なパケットをドロップした瞬間にアラートを飛ばすことができます。
トレードオフ
- 学習曲線: Linuxのネットワーキングスタックを理解する必要があります。Web UIでボタンをクリックするほど単純ではありません。
- CPUへの影響: 膨大なパケットが流れる10Gbps以上のリンクでは、ソフトウェアフィルタリングによってごくわずかな遅延が発生します。一般的なオフィスネットワークや管理用LANでは、その影響は実質ゼロです。
多層防御アーキテクチャ
単一のファイアウォールルールだけに頼ってはいけません。私は、MACアドレス制限とDHCP Snoopingのエミュレーションを組み合わせた2段構えの戦略を推奨しています。MAC制限は、単一のポートがIPプール全体を占有するのを防ぎます。一方で、DHCP Snoopingは、許可されたサーバーだけがIPアドレスを配布できるようにします。この構成により、悪意のある攻撃者と、善意の従業員が誤って接続してしまった「野良ルーター」の両方に対処できます。
ステップバイステップの実装
1. カーネルの準備
開始する前に、ブリッジが iptables および ebtables を通過するように設定されているか確認してください。DebianやUbuntuなどの最新のディストリビューションでは、通常デフォルトで有効になっています。
# ブリッジフィルタリングが有効か確認
sysctl net.bridge.bridge-nf-call-iptables
# 0が返される場合は、すぐに有効化する
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
2. MACアドレスの固定
スプーフィングを防ぐ最も効果的な方法は、特定のMACアドレスをポートに紐付けることです。veth-customer1 が特定のVMに属していることが分かっている場合、それ以外のパケットはすべてドロップします。これにより、そのVMがランダムな身元で数千のリクエストを送信することを防げます。
# 許可されたMACアドレスと一致しないveth-customer1からのパケットをすべてドロップ
ebtables -A FORWARD -i veth-customer1 -s ! 52:54:00:12:34:56 -j DROP
3. DHCP Snoopingのエミュレーション
「信頼済み(Trusted)」ゾーンと「非信頼(Untrusted)」ゾーンを定義する必要があります。本物のDHCPサーバーは信頼済みポートに配置し、それ以外はすべて非信頼とします。目標は、非信頼ポートから送信されるDHCPの「OFFER」または「ACK」パケットをブロックすることです。
この例では、eth0 をサーバーへのアップリンクとし、br0 がクライアントを処理します。
# 1. DHCPトラフィック専用のチェインを作成
ebtables -N DHCP_SNOOPING
ebtables -P DHCP_SNOOPING RETURN
# 2. DHCPサーバーのレスポンス(UDPポート67)を新しいチェインに転送
ebtables -A FORWARD -p IPv4 --ip-proto udp --ip-sport 67 --ip-dport 68 -j DHCP_SNOOPING
# 3. 鉄則:eth0 以外からDHCPレスポンスが来た場合は破棄する
ebtables -A DHCP_SNOOPING -i ! eth0 -j DROP
4. レート制限によるセーフティネットの追加
ポートがサブスイッチに接続されているなどの理由でMACアドレスを固定できない場合は、レート制限を使用します。これにより、攻撃のスピードを極限まで遅らせることができます。2秒で終わるネットワークダウンを、成功までに数時間かかるイベントに変えることで、監視ツールが管理者を呼び起こす時間を稼げます。
# DHCPリクエストを毎秒5回に制限。通常の使用にはこれで十分です。
iptables -A FORWARD -p udp --dport 67 -m limit --limit 5/s -j ACCEPT
iptables -A FORWARD -p udp --dport 67 -j DROP
防御のテスト
ルールを適用したら、実際に攻撃を試してみてください。スクリプトを使用して偽装したDHCP DISCOVERパケットを生成します。正当なノートPCは遅延なくIPを取得できる一方で、DROP カウンターが増加していくのが確認できるはずです。
# ルールの動作状況を確認するために統計を表示
sudo ebtables -L --lc
テスト中に DHCP_SNOOPING チェインの DROP 数が増えていれば、フィルターは正しく機能しています。正当なクライアントは影響を受けず、接続を維持できます。
まとめ
Linux Bridgeのセキュリティ対策は、マネージドスイッチを使うよりも手間がかかりますが、得られる制御能力にはそれだけの価値があります。MACフィルタリングと ebtables を組み合わせることで、基本的なソフトウェアブリッジをセキュリティを意識したゲートキーパーへと変えることができます。私はこの構成を実際に使用して、ブロードキャストストームや悪意のある攻撃者を阻止してきました。適切な設定を行えば、オープンソースツールでもエンタープライズ級の保護が可能であることを証明しています。

