【テクニカル・上級編】 ARPプロトコルの動作とARPキャッシュポイズニング – ネットワーク基礎とWebセキュリティ実践ガイド

ARPの「性善説」が招く悲劇:レイヤー2の盲点とゼロトラストへの警鐘

ネットワークエンジニアとして現場を渡り歩いていると、いまだに「スイッチングハブとケーブルさえ繋がっていれば通信は安泰だ」と信じている層に遭遇することがある。だが、OSI参照モデルの第2層、データリンク層に潜むあまりにも素朴なプロトコル「ARP(Address Resolution Protocol)」が、現代のエンタープライズネットワークにとってどれほど脆い基盤であるか、どれだけのエンジニアが自覚しているだろうか。

今回は、パケットレベルの挙動から、現代のセキュリティアーキテクチャがいかにしてこの「性善説」に基づいたプロトコルと対峙すべきか、その深淵を掘り下げていきたい。

—

ARPの挙動:信頼に基づいた脆弱性

ARPは、IPアドレスという論理的な住所を、イーサネットフレームを運ぶためのMACアドレスという物理的な住所へと変換する。「誰か192.168.1.10のMACアドレスを知らないか?」というブロードキャスト(FF:FF:FF:FF:FF:FF)を投げ、対象が「それは私だ、MACはAA:BB:CC:DD:EE:FFだ」とユニキャストで答える。

ここには、「リクエストを送っていない相手からのリプライ」を、多くのOSが「キャッシュを更新すべき正当な情報」として受け入れてしまうという設計上の甘さが存在する。これが、いわゆるARPキャッシュポイズニングの原点だ。

中間者攻撃(MITM)のメカニズム

攻撃者は、標的の端末とデフォルトゲートウェイの両方に、自分自身のMACアドレスを紐付けた偽のARPパケットを送りつける。すると、通信の両端は互いに「相手へのパケットは攻撃者のMACを経由すべき」と誤認する。この状態で、攻撃者はパケットを傍受し、必要であれば改ざんして転送する。

TLS(Transport Layer Security)が普及した現代でも、最初のハンドシェイク(ClientHello/ServerHello)の段階で通信の全貌を把握されたり、SSLストリッピング攻撃によって平文のHTTPへと強制的にダウングレードさせられたりするリスクは消えていない。

—

現場で打つべき「泥臭い」防衛策

現代のゼロトラストアーキテクチャにおいては、「ネットワーク内部は安全である」という前提自体が棄却されるべきだ。しかし、レガシーなLAN環境を即座にゼロトラストへ移行できない場合、どのような防御が現実的な解となるのか。

1. ダイナミックARPインスペクション(DAI)の導入

スイッチ側で「どのポートにどのMACアドレスが繋がっているか」をDHCPスヌーピングテーブルから動的に学習し、整合性の取れないARPパケットを破棄させる。これが最も直接的な解決策だ。

# Cisco Catalystでの設定例
# DHCPスヌーピングを有効化
ip dhcp snooping
ip dhcp snooping vlan 10,20

# インターフェース単位でARP検証を適用
interface GigabitEthernet0/1
 ip arp inspection trust  # ゲートウェイ側は信頼する
interface GigabitEthernet0/2
 ip arp inspection limit rate 100 # 異常な大量ARPを制限

2. Linuxカーネルパラメータによる「愚直な」防御

サーバー単体でも、ARPの挙動を厳格化できる。/etc/sysctl.confを調整し、ARPの更新条件を厳しく設定する。

# /etc/sysctl.conf への追記
# 相手のIPアドレスが自分のインターフェースに割り当てられている場合のみ応答する
net.ipv4.conf.all.arp_ignore = 1
# 受信したARPの送信元が、自分のサブネット内にある場合のみキャッシュを更新する
net.ipv4.conf.all.arp_announce = 2

—

パフォーマンスとセキュリティのジレンマ:TCPスタックのチューニング

セキュリティを高めると、往々にしてパケット処理のオーバーヘッドが増大する。特に低遅延が求められる高頻度取引システムやリアルタイム通信では、このバランスが重要だ。

TCP接続において、ARP解決が遅れると最初のパケットロスやRTT(Round Trip Time)の増大を招く。これを防ぐためには、キャッシュの寿命を適切に保ちつつ、カーネルのバッファリングを最適化する必要がある。

# TCPウィンドウサイズの動的調整(高トラフィック環境向け)
# ネットワークの帯域幅と遅延積を考慮し、バッファを拡張
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

また、TLS 1.3の導入は必須だ。0-RTTハンドシェイクを有効にすることで、セッション再開時のオーバーヘッドを極限まで削減できるが、これにはリプレイ攻撃のリスクが伴う。認証されたAPIトークンや署名付きリクエストをアプリケーション層で併用することが、真の「強固な」アーキテクチャと言えるだろう。

—

最後に:プロトコルを疑うという姿勢

ARPという古いプロトコルが今もなお現役で動いているのは、そのシンプルさゆえの互換性があるからだ。しかし、エンジニアとして「OSI参照モデルの下位レイヤーなら問題ない」と考えるのは危険な幻想である。

パケットは嘘をつかない。たとえ上位レイヤーで強固な暗号化を施していても、その足元であるレイヤー2が腐っていれば、通信そのものがジャックされる。ネットワークアーキテクトに求められるのは、最新のクラウドセキュリティツールの導入だけではない。プロトコルの隅々にまで目を配り、信頼できないネットワーク環境を前提とした「多層防御」を組み上げる、その泥臭い執念こそが、最強のセキュリティとなるのだ。

次は、このARP汚染を検知するためのPythonによる簡易的なモニタリングスクリプトについて解説しよう。パケットの深淵を覗く準備はできているか?

コメント

タイトルとURLをコピーしました