【実務・中級編】 hping3によるカスタムパケット生成とファイアウォールテスト – トラブルシューティング&ネットワーク運用監視実践ガイド

現場で差がつく!hping3を用いたステートフル・ファイアウォールの「急所」を突く検証術

ネットワークエンジニアとして深夜のデータセンターでラックの熱気に包まれながら、「なぜパケットが届かないのか?」という問いと格闘した経験は数え切れません。GUIの管理画面で「許可」にチェックを入れたはずなのに、実環境ではパケットがブラックホールに吸い込まれる――そんな時、我々が最後に頼る相棒が hping3 です。

単なる ping や traceroute が「道はつながっているか?」を調べるためのツールなら、hping3 は「相手がどれほど賢く(あるいは厳格に)門番をしているか?」を暴くための外科手術用メスです。今日は、教科書には載っていない、実務の泥臭い現場で生き抜くための「パケット操作の極意」を伝授しましょう。

—

1. なぜ「標準ツール」では足りないのか

Web APIの開発やインフラ運用において、curl や Fetch API での疎通確認は日常茶飯事です。しかし、これらはあくまで「アプリケーション層」の通信です。

# よくある疎通確認
curl -I https://api.example.com

これで 200 OK が返ってくれば万事解決ですが、もし返ってこない場合、その原因が「TCPの3ウェイ・ハンドシェイクの失敗」なのか、「ファイアウォールのステートフル検査による破棄」なのか、あるいは「ペイロードの中身を検査するIDS/IPSの誤検知」なのか、標準ツールでは切り分けが困難です。

hping3 は、TCPのヘッダーフラグ(SYN, ACK, FIN, RST, PSH, URG)を自由自在に操れるため、ファイアウォールの「ステートフルな記憶」を揺さぶるような、変則的なパケットを送り込むことが可能です。

—

2. 実践:ファイアウォールの挙動を暴く

SYNスキャンでポートの生死を確認する

まずは基本です。ターゲットのポートが空いているか、あるいはファイアウォールで隠蔽(Drop)されているかを確認します。

# 80番ポートに対してSYNパケットを1回だけ送る
# -S: SYNフラグを立てる, -p: ポート指定, -c 1: 1回のみ送信
sudo hping3 -S -p 80 -c 1 192.168.1.10

もし戻り値として SA (SYN+ACK) が返ってくれば、そのポートはオープンです。しかし、何も返ってこない場合は、途中のファイアウォールが DROP している可能性が高い。ここで traceroute を組み合わせれば、どのホップで弾かれているかが一目瞭然です。

「死んだふり」を装うパケットでテストする

ステートフル・ファイアウォールは、接続のシーケンスを記憶しています。しかし、いきなり ACK だけが飛んできたらどう反応するでしょうか?

# 確立された通信に見せかけたACKパケットを送る
sudo hping3 -A -p 443 -c 3 192.168.1.10

通常、これを受け取った端末は RST を返します。しかし、もしファイアウォールがこのパケットを無視したり、逆に異常なログを吐き出したりする場合、その機器のフィルタリングルールの不備や、設定上の脆弱性が浮き彫りになります。

—

3. アプリケーション層との連携:Pythonで「擬似パケット」を模倣する

インフラ側で hping3 を使って「パケットが通るルート」を確保したら、今度は開発側でその通信がAPIとして正しく解釈されるかを確認します。Pythonの requests ライブラリを使えば、hping3 で確認したルールに基づいたテストコードを簡単に書けます。

import requests

# hping3で疎通確認できたネットワーク経由でAPIを叩く
def test_api_connection(url):
    try:
        # タイムアウトを短めに設定し、ファイアウォールの応答速度も測る
        response = requests.get(url, timeout=2)
        print(f"Status Code: {response.status_code}")
    except requests.exceptions.ConnectionError:
        print("ファイアウォールでブロックされているか、ポートが閉じています")
    except requests.exceptions.Timeout:
        print("パケットは届いているが、レスポンスが返ってきません")

test_api_connection("http://192.168.1.10/api/v1/health")

—

4. 現場のシニアエンジニアからの忠告

最後に、運用現場で hping3 を使う際の「鉄則」を3つお伝えします。

1. 「撃っていい場所」を必ず確認すること
hping3 は攻撃ツールと紙一重です。不用意にフラッディング(-i u1000 などで高速送信)を行うと、IDS/IPSが「DoS攻撃」と判定し、自分自身のIPが自動的にブラックリスト入りする事故が多発します。テストは必ず静かに、最小限の回数で行ってください。
2. ログを疑え
パケットが弾かれているとき、原因は常にファイアウォールとは限りません。送信元OSの iptables や nftables、あるいはクラウド環境であればセキュリティグループの設定を、まずは ss コマンドで確認する習慣を。

# 現在のポート状態を確認
    ss -tuln

3. パケットキャプチャを併用せよ
hping3 で送ったパケットが実際にどう加工されて相手に届いているか、あるいは戻りパケットがどこで捨てられているか。tcpdump を使わずにネットワークトラブルを解決しようとするのは、目隠しで爆弾処理をするようなものです。

—

ネットワークは生き物です。マニュアル通りの設定が、なぜか現場では動かない――その「なぜ」を解き明かす鍵は、常にパケットの挙動の中にあります。hping3 を使いこなせば、皆さんも「ネットワークの深層心理」が少しずつ見えるようになるはずです。

さあ、検証環境を立ち上げて、自分の手でパケットを操ってみてください。理論と実践の境界線を超えたとき、本当のエンジニアリングが始まります。

コメント

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