ネットワークの「裏口」を見抜く!ICMPトンネリングという名の「手紙の隠し文字」を暴く方法
こんにちは!ネットワークセキュリティの世界へようこそ。
皆さんは、日々何気なく送っているメールやWebサイトの閲覧が、実は「封筒」に入れられて運ばれていることをご存知でしょうか? 通常、通信というものは「宛先」と「中身」がしっかり整理されて運ばれます。
しかし、世の中には「封筒の端っこに、こっそり秘密のメッセージを書き込んで送る」という、ちょっとズルい通信手法が存在します。それが今回お話しする「ICMPトンネリング」です。
「難しそう……」と身構える必要はありません。一緒にパケットの世界を覗いてみましょう!
—
1. ICMPって何者?:ネットワーク界の「郵便屋さん」
まずは基本から。ICMP(Internet Control Message Protocol)は、ネットワークの世界では「郵便屋さん」のような存在です。
私たちが「相手にデータが届くかな?」と確認するために ping コマンドを打つことがありますが、あれは郵便屋さんが「おーい、そこにいるかーい?」と叫んで、「はい、ここにいますよ!」と返事が返ってくるのを確認している状態なんです。
- エコーリクエスト(叫び声): 「届いてる?」
- エコーリプライ(返事): 「届いてるよ!」
このやり取り、本来は「通信確認」のためだけのものです。しかし、この郵便屋さん、ご丁寧なことに「手紙の余白にメモを添える」という謎の仕様(データ領域)を持っています。
2. なぜ危ないの?:「隠し文字」による秘密通信
この「余白」を悪用するのがICMPトンネリングです。
攻撃者は、本来の「届いてる?」というメッセージの裏側に、こっそり盗んだパスワードや機密データを細切れにして詰め込みます。これを外部のサーバーに送ることで、ファイアウォールを「ただの通信確認だ」と騙してすり抜けてしまうのです。
これがなぜ厄介かというと、多くのセキュリティ機器は「ping は通信確認だから、ブロックしちゃダメだよね」と甘く設定されていることが多いからです。いわば、「挨拶しかしないはずの郵便屋さんが、実はスパイだった」という状態ですね。
3. どうやって見抜く?:怪しい動きの「パターン」を知る
では、どうやってこの「スパイ」を見抜けばいいのでしょうか? 現場のエンジニアは、パケットの「量」と「頻度」に注目します。
怪しいパケットの兆候
1. 頻度が高すぎる: 1秒間に何百回も「おーい!」と叫ぶ郵便屋さんはおかしいですよね。
2. 中身が大きすぎる: 本来、通信確認のメモはごくわずか。それが毎回パンパンに詰め込まれていたら、何かを運んでいる証拠です。
3. 連続性がある: 普通の ping はポツリポツリと送られますが、トンネリングは一定のリズムでダラダラと続きます。
—
4. 防御の第一歩:レートリミットの設定
「怪しい動きは制限する」。これがゼロトラストの基本です。例えば、Linuxのファイアウォールである iptables を使って、「ICMPの通信回数を制限する」という設定をしてみましょう。
# 1秒間に1回だけICMPを受け付け、それ以上は「バースト(一時的な急増)」を許容しない設定
# これにより、大量のデータを送りつけようとするトンネリングを物理的に阻止します
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
解説:
--limit 1/s:1秒間に1回までのペースに制限します。--limit-burst 1:「バースト(急増)」も1回しか許しません。これを超えると容赦なくDROP(破棄)されます。
こうすることで、通信確認に必要な最低限のやり取りは残しつつ、データを大量に送りつけるようなスパイ活動を封じ込めることができます。
5. 現場の知恵:監視の目を光らせる
さらに高度な監視をするなら、Pythonなどでパケットをキャプチャして「データサイズ」をチェックするのも有効です。
# 簡易的なパケット監視のイメージ(Scapyライブラリを使用)
from scapy.all import sniff, ICMP
def check_packet(pkt):
# ICMPかつ、データ領域(load)が一定サイズを超えているかチェック
if pkt.haslayer(ICMP) and len(pkt[ICMP].payload) > 64:
print(f"警告!不審な大きなICMPパケットを検知しました: {pkt.summary()}")
# ネットワークインターフェースを監視
sniff(filter="icmp", prn=check_packet)
このコードでは、ping の標準サイズ(通常32〜64バイト程度)を超える大きなパケットを見つけるたびに警告を出します。
—
最後に:ネットワークは「疑う」ことから始まる
いかがでしたか? 難解に思えるセキュリティの仕組みも、「郵便屋さん」に例えてみると、案外シンプルですよね。
「便利そうな通信」や「昔からある機能」の中にこそ、攻撃者は隠れています。すべてをブロックするのではなく、「正常な振る舞い」を定義し、そこから外れるものを検知する。 これが、これからのインフラエンジニアに求められる最も大切なセンスです。
明日から、皆さんのネットワークに流れる「郵便屋さん」の様子を、少しだけ気にかけてみてくださいね。それでは、また次回のブログでお会いしましょう!
コメント