弱者は決して許すことができない。許しは強者の態度である── ガンディー
ネットワーク

ファイアウォールは、パケット 1 つではなく往復を見る

帰りを通す行を人が書いていないのに返事が返ってくる理由を、接続状態テーブルと ACL の判定順として 1 枚の図で見る

ぴぐおv1人の校閲なし(AI のみ)訂正なし
ネットワークファイアウォールセキュリティconcept
目次

勉強会では、ルータの代わりにファイアウォールを 1 台置いて、社内から外へ通信を出しました。 図 9 の ACL は、パケット 1 つごとに行を上から見て、通す・通さないを決める仕組みでした。 それだけなら、行きを通す行と帰りを通す行の両方を人が書くことになります。 ところが帰りの行を書かなくても、返事は返ってきました。 この記事は、その差がどこから来るのかを 1 枚の図で見ます。

扱うのは、製品としてのファイアウォールの設定のやり方ではなく、通過の可否を決める仕組みの側です。 CCNA 200-301 v1.1 の出題範囲でいえば 1.1.c「Next-generation firewalls and IPS」にあたります。 裏取りに使った資料が Cisco のファイアウォール製品のものなので、機能の名前はその呼び方で出てきます。

この連載は、ネットワークの言葉を 3 つの層に置いて読みます。 もの(物理か論理か)、結びつき(人が設定で付ける手動か、機器が学習する自動か、製造時に決まる固定か)、通信フロー(1 本の通信がそれらを順に通る道筋)の 3 つです。

登場するもの

ファイアウォール

物理の箱です。 ルータと同じく IP を見て、別のネットワークへ渡します。 違うのは既定の答えで、外から中への新しい通信は通しません。

セキュリティレベル

口ごとに付ける 0〜100 の数値です(論理・手動)。 内側を 100、外側を 0 にします。 ACL を書かないときの既定の答えにあたり、口に ACL を付ければそちらが優先します。

接続状態テーブル

通った通信 1 本につき 1 行できる表です(論理・自動)。 行の中身は、両端の IP とポート番号、そしてプロトコルです。 人は 1 行も書きません。

結びつき

  • 口 ⇄ セキュリティレベル、口 ⇄ ACL は、どちらも手動です。人が設定します。
  • 接続状態テーブルの行 ⇄ 実際に通った通信は自動です。図 9 の ACL は全部手で書いたので、ここが対照になります。

通す・通さないが決まる順

先に接続状態テーブルを引き、ACL の判定はその後です。 表に行があれば、以降の判定を飛ばして通します。これがステートフルインスペクションです。 行が無い通信だけがセキュリティレベルと ACL の判定に進み、そこを通れば表に 1 行できます。 データの中身まで見るアプリケーションインスペクションは、さらにその後です。 どの通信の中身を見るかは人が決め、見た結果どの穴を開けるかは自動です。

資料では、パケットの処理は 11 段に分かれ、3 段目が接続テーブルの確認、4 段目が ACL、6 段目がインスペクションです。 3 段目で既存の接続に一致すると、ACL の判定は飛ばされます。

通信フロー

支店の PC-A(192.168.10.10)から、外のウェブサーバ(192.0.2.50 の TCP 80 番)へつなぎに行きます。

① 表を引いても行が無いので、向き(内側 100 → 外側 0)と ACL の判定へ進み、通ります。通ったときに、表へ 1 行できます。

② 返事が外側に届きます。表に行があるので、向きの判定に進む前に通ります。ここが図 9 の ACL には無い判断です。

③ 外から新しく始まった通信は、表に行が無いので向きと ACL の判定へ進み、そこで止まります。外から受けたいものがあれば、ACL に行を書いて開けます。

④ 行きと帰りが別のファイアウォールを通る形(非対称ルーティング)では、帰りを受けた側は行きを見ていません。表に行が無いので、本来の返事でも捨てます。

図 22

図の上半分が構成図とフローの番号、下半分が接続状態テーブルの推移と通信の中身の推移です。

図 22 ファイアウォール:1 つずつではなく、「往復」で通す 図 9 の ACL は、パケット 1 つごとに行を上から見て決めた。ファイアウォールはそれに加えて「この往復は許可済み」を表に持ち、まずその表を引く ルータは既定で「届く経路があれば通す」。ファイアウォールは向きによって既定の答えが変わり、外から中への新しい通信は既定で通さない この図では、図 7〜12 のルータ 1 をファイアウォールに置き換えたとして描く(外側 203.0.113.10・内側 192.168.10.1 はルータ 1 から引き継いだ番地。VLAN 20 とトランクは省略) 支店(守る側・内側) インターネット(外側) PC-A 192.168.10.10 GW 192.168.10.1 ファイアウォール 1 内側の口 192.168.10.1 セキュリティレベル 100 外側の口 203.0.113.10 セキュリティレベル 0 (レベルは人が決める・論理) 内 外 ISP-1 203.0.113.1 ウェブサーバ 192.0.2.50 TCP 80 番で待つ 1 外側の宛先へそのまま流れる(レベル 100 → 0) 2 表に行があるので通る ③ 外から新しく始まった通信は、表に行が無い 外の誰か 192.0.2.99 ファイアウォール 1 表に一致する行が無い → 向きと ACL の判定へ レベル 0 → 100 で捨てる 外から受けたい通信があるときは、口に ACL の行を書いて開ける(そこだけ例外になる) ④ 行きと帰りが別の口を通ると(非対称ルーティング) PC-A FW-1 FW-2 外のサーバ 行き(青)は FW-1 を通り、帰り(橙)は FW-2 に届く。 FW-2 は行きを見ていないので表に行が無く、本来の返事でも捨てる 通過の可否はこの順に決まる(先に表を引く。ACL の判定はその後) 1. 接続状態テーブルを引く ファイアウォールが最初に見るのはここ 行きの通信 1 本につき 1 行が自動でできる 行があれば、以降の判定を飛ばして通す =ステートフルインスペクション 行が無いときだけ、次の関門へ進む 2. セキュリティレベルと ACL 新しい通信だけがここに来る レベルは「ACL を書かないときの既定の答え」 高い → 低いは通す/低い → 高いは通さない 口に ACL を付けるとそちらが優先する 外から受けたい通信はここに行を書いて開ける 通れば、接続状態テーブルに 1 行できる 3. アプリケーションインスペクション データの中身まで見る係 既定で見る顔ぶれが決まっている ICMP は既定の顔ぶれに無く、入れないと ping の帰りが通らなかった FTP のように中身に住所と番号が入る通信用 フロー ① PC-A がウェブサーバ(192.0.2.50 の TCP 80 番)へつなぎに行く。表を引いても行が無いので、向き(内側 100 → 外側 0)と ACL の判定へ進み、通る  通ったときに、接続状態テーブルに 1 行が自動でできる:内側の住所とポート番号 ⇄ 外側の住所とポート番号 ② ウェブサーバからの返事が外側に届く。表に行があるので、向きの判定に進む前に通る(図 9 の ACL には無い判断) ③ 外から新しく始まった通信は、表に行が無いので向きと ACL の判定へ進み、そこで止まる(開けたければ ACL に行を書く) ④ 行きと帰りが別のファイアウォールを通る形にすると、帰りを受けた側は行きを見ていないので表に行が無く、本来の返事でも捨てる 3 層で見ると もの:接続状態テーブル(論理・自動で育つ。行きの通信 1 本につき 1 行)とセキュリティレベル(論理・手動。口ごとに 0〜100 の数値) 結びつき:口 ⇄ レベルは手動。テーブルの行 ⇄ 実際に流れた通信は自動(人は 1 行も書かない。図 9 の ACL は全部手で書いた) フロー:図 5 の ②「テーブルの行を探して出口を決める」の前に「そもそも通してよいか」の関門が入る。通った後の MAC の付け替えは図 5 と同じ 接続状態テーブルの推移(青字が自動で増えた行) 接続状態テーブル:① の前 (空) まだ何も流れていない → ① は向きと ACL の判定へ進む 接続状態テーブル:① が通った直後 *内側 192.168.10.10:50310 *外側 192.0.2.50:80 *プロトコル TCP (通った通信から自動で 1 行) 接続状態テーブル:② ③ ④ の判定 ② 上の行と一致 → そのまま通す !③ 行が無い → 判定へ進んで止まる !④ FW-2 の表は空 → 同じく止まる 通信の中身の推移(ファイアウォールが照らし合わせる欄) ① PC-A → ファイアウォール(内側の区間) 宛先 MAC MAC FW1-内 送信元 MAC MAC A 宛先 IP 192.0.2.50 送信元 IP 192.168.10.10 宛先ポート番号 80 送信元ポート番号 50310 データ HTTP ② ウェブサーバ → PC-A の返事(① の鏡像。宛先と送信元が入れ替わる) 宛先 MAC MAC A 送信元 MAC MAC FW1-内 宛先 IP 192.168.10.10 送信元 IP 192.0.2.50 宛先ポート番号 50310 送信元ポート番号 80 データ HTTP   ファイアウォールは、この 4 つ(宛先 IP・送信元 IP・宛先ポート番号・送信元ポート番号)とプロトコルの組を表の行と照らす。一致すれば以降の判定を飛ばして通す ③ 外から新しく始まった通信(表に行が無い) 宛先 MAC MAC FW1-外 送信元 MAC MAC ISP-1 宛先 IP 203.0.113.10 送信元 IP 192.0.2.99 宛先ポート番号 3389 送信元ポート番号 61001 データ 接続要求   ③ は表に行が無いので向きと ACL の判定へ進み、そこで止まる。②③ の違いは「先に行きを見たかどうか」だけで、パケットの見た目はよく似ている この図では住所の書き換え(NAT・図 8)を省いている。実際の出口では NAT が同時に効き、① の送信元 IP は外側の住所に書き換わり、② の宛先 IP も出口で戻される 出典(処理の順。Step 3 で接続テーブルを引き、既存の接続なら ACL の判定を飛ばす。Step 4 が ACL、Step 6 がインスペクション):  https://www.cisco.com/c/en/us/support/docs/security/asa-5500-x-series-next-generation-firewalls/113396-asa-packet-flow-00.html 出典(セキュリティレベル 0〜100・高→低は既定で許可・低→高は明示の許可が要る・同値は same-security-traffic): https://www.infraexpert.com/study/ciscoasa4.html 出典(ステートフルインスペクション=行きのセッション情報を保存し、戻りを照合して許可・不一致は遮断): https://www.infraexpert.com/study/security25.html 出典(最初のパケットは session management path、以降は fast path で TCP シーケンス番号などを確認。既定で内側→外側は自由に流れる):  https://www.cisco.com/en/US/docs/security/asa/asa81/configuration/guide/intro.html 出典(アプリケーションインスペクションが要る理由=データ部に住所を埋め込む/動的にポート番号を決める通信。既定の global_policy の一覧に inspect icmp は無い):  https://www.cisco.com/c/en/us/td/docs/security/asa/asa91/configuration/firewall/asa_91_firewall_config/inspect_overview.html 未検証: 表の行が何秒で消えるか(アイドルタイムアウトの既定値)は確かめていない。勉強会では設定を GUI(ASDM)からも行えることを見たが、本図では扱わない 勉強会での観察: 両方の口をレベル 100 にすると外→内の ping が通り、外側を 0 に戻すと通らなくなった。ping の戻りは inspect icmp を入れてから通った

図 5・図 9 との接続

図 5 の ②「テーブルの行を探して出口を決める」の前に、そもそも通してよいかの関門が入ります。 通った後の MAC の付け替えは、図 5 とまったく同じです。

図 9 の ACL は、1 パケットごとに行を上から見る判定でした。 図 22 は、その手前に往復を単位にした表を置きます。 ACL に帰りの行が無くても返事が通るのは、表に行があって ACL の判定に進まないからです。 図 7 で残った 3 つの問題は、この図では解きません。図 22 が扱うのは、通してよいかを誰がどう決めるか、の 1 点です。

未検証・注意

  • 接続状態テーブルの行が何秒で消えるか(アイドルタイムアウトの既定値)は確かめていません。
  • この図では住所の書き換え(NAT・図 8)を省いています。実際の出口では NAT が同時に効き、①の送信元 IP は外側の住所に書き換わります。図の帯の ② は ① の鏡像として描いてあります。
  • 勉強会での観察として書いたことが 2 つあります。両方の口をセキュリティレベル 100 にすると外から中への ping が通り、外側を 0 に戻すと通らなくなりました。ping の戻りは、ICMP をインスペクションの対象に入れてから通りました。機器の版による違いは確かめていません。
  • 既定で有効なインスペクションの一覧に ICMP が入っていないことは、資料にある既定の設定で確認しました。上の観察と向きは合いますが、勉強会の機器でその一覧を表示して見たわけではありません。
  • 高いレベルの口から低いレベルの口へ既定で自由に流れることは、ASA 8.1 の資料の文で確認しました。低いレベルから高いレベルへ通したいときに ACL へ行を書く、というのは、判定が 4 段目の ACL に進むというパケットフロー資料の記述からの読みで、そう書いた文を見つけたわけではありません。同じ値の口どうしには別の設定(same-security-traffic)が要ります。
  • 設定を GUI(ASDM)から行えることは資料にありますが、この記事では扱いません。

出典

  • 勉強会での本人の観察(2026-09-13 実機ハンズオン。資料は非公開)
  • Cisco: ASA Packet Flow — 処理は 11 段。3 段目が接続テーブルの確認、4 段目が ACL、6 段目がインスペクション。「If the packet flow matches a current connection, then the Access Control List (ACL) check is bypassed and the packet is moved forward.」
  • Cisco: ASA 8.1 Configuration Guide, Introduction — 「By default, the security appliance allows traffic to flow freely from an inside network (higher security level) to an outside network (lower security level).」/最初のパケットは session management path、以降は fast path で TCP シーケンス番号などを確認する
  • Cisco: Getting Started with Application Layer Protocol Inspection — データ部に IP アドレスを埋め込む通信と、動的にポート番号を決める通信のためにインスペクションが要る。既定の policy-map global_policy の一覧に inspect icmp は入っていない
  • インフラエキスパート: Cisco ASA セキュリティレベル — 各インターフェースに 0〜100 のセキュリティレベルを設定する/同じ値の口どうしは same-security-traffic permit inter-interface で通す
  • インフラエキスパート: ステートフルインスペクション — 往路の情報をセッション情報として保存し、戻りのパケットと照合して一致すれば通し、一致しなければ遮断する
  • CCNA 200-301 v1.1 出題範囲 — 1.1.c「Next-generation firewalls and IPS」

関連

この記事の校閲記録

誰が・いつ・どの版の・どの段落を・何の観点で見て、何と言ったかを全件そのまま出す(追記のみ・削除しない)。

段落 33 のうち出典つき 14・出典なし 19

v1 2 件
  • AIAI (claude-fable-5) が AI 確認未解決

    パケットの処理が 11 段に分かれ、3 段目の接続テーブルの確認で既存の接続に一致すると ACL の判定が飛ばされること(『If the packet flow matches a current connection, then the Access Control List (ACL) check is bypassed』)、4 段目が ACL、6 段目がインスペクションであることを Cisco のパケットフロー資料で確認した。高いレベルの口から低いレベルの口へは既定で自由に流れることを ASA 8.1 の資料で確認し、低いレベルから高いレベルへ通す場合に ACL の行が要ることは、判定が 4 段目の ACL に進むという同じ資料の記述として書いた。セキュリティレベルが 0〜100 であること・同レベルの口どうしに same-security-traffic が要ることはインフラエキスパートで確認した。既定の policy-map global_policy に inspect icmp が入っていないことを ASA 9.1 の設定ガイドの既定設定の記述で確認した。CCNA 1.1.c『Next-generation firewalls and IPS』を出題範囲の本文で確認した。接続状態テーブルのアイドルタイムアウトの既定値は確認できず未検証と書いた。守秘: 実名・社名・会場名・地名・金額なし

  • AIAI (claude-fable-5) が 編集未解決

    公開前の校閲。frontmatter のタグ security を、図 9・図 17 と同じ「セキュリティ」に揃えた。関連の前後の記事へのリンクに /notes/ のパスを足した。先に接続状態テーブルを引き、一致すれば ACL の判定を飛ばすという順序は、出典の引用文と一致しているのでそのままにした。

参考文献

更新履歴

  • 連載のトピックを「ネットワーク基礎」から「ネットワーク」へ改名(32 本+目次。slug と URL は不変)
  • 公開: 連載「ネットワーク基礎」図 8〜24 の記事 17 本と目次の更新

機械可読の記録