先月号で解説したように, TCP パケットのヘッダーには次の情報が含まれます。 それぞれの項目が特定の条件を満たしたとき, そのパケットを捨てることによってフィルタリングを行います。 この「特定の条件」を定めることがフィルタリングの設定です。
(1) | 送信元アドレス |
(2) | 送信元ポート番号 |
(3) | あて先アドレス |
(4) | あて先ポート番号 |
(5) | シーケンス番号 |
(6) | 確認応答番号 |
(7) | SYN フラグ |
(8) | ACK フラグ |
(9) | FIN フラグ |
NIC を複数枚差しているマシン(デュアルホーム・ホスト), あるいはルーターの場合, 上記情報に加えて, パケットがどのインタフェース(NIC)に届いたかを示した
(10) | 到着インタフェース |
をフィルタリングの条件として用いることができます。
もし送信元アドレスが内部 LAN に属するものであるにもかかわらず, インターネット側のインタフェースに届いたら, そのパケットは送信元アドレスが偽造されています (IP アドレス・スプーフィング)。 そのようなパケットを内部 LAN に入れては大変です。 送信元アドレスと到着インタフェースが矛盾するパケットは 必ず捨てる設定にしましょう(図 1)。
図 1 送信元アドレスと到着インタフェースが矛盾するパケットを廃棄 |
このフィルタリングが正しく行われていれば, 内部 LAN 上のホストは, 送信元アドレスを見ることにより, 届いたパケットがインターネットからのものか, それとも同じ LAN 上のホストからのものか判断することができます。
まとめると, インターネットから届いた内部 LAN 上のホストあてのパケット (以下,「内向きパケット」と呼びます)は, 次のように判断できます。
さて, インターネットから内部 LAN 上のホストあてのTCP 接続 (図 2,以下,「内向き接続」と呼びます)を拒否したい場合, 内向きパケットをすべて捨てれば OK かというと, そうではありません。 このような設定だと内部 LAN から外部のサイトのサーバーに対する TCP 接続 (以下,「外向き接続」と呼びます)までできなくなってしまいます。 これは, 外向き接続における外部のサーバーからの ACK パケットや応答データも, 外部から入ってくる内向きパケットであるためです(図 3 参照)。 この種の内向きパケットは通してやらないと, 外部のサーバー(例えばWeb サーバー)へアクセスできなくなってしまいます。
図 2 内向き接続 |
図 3 外向き接続 |
多くの TCP のサービスにおいて, サーバーが返すパケットの送信元ポート番号は, サービスを受け付けるポート番号と同一です。 例えば, Web サーバーであれば 80 番, telnet サーバーであれば 23 番, SMTP サーバーであれば25 番, といった具合です。
よく使われるサービスのポート番号は 1023 番以下であり, かつクライアントが送信するパケットの送信元ポート番号は 1024 番以上ですから, 送信元ポートが 1023 番以下の内向きパケットのみ通せば, 外向き接続を許可し, 内向き接続は禁止することができそうです*7 。
実際, 1023 番以下のポートは, 特権ポートとも呼ばれ, root 権限がないとパケットを送信できないポートです。 つまり送信元のマシンの管理者が 正規にインストールしたサーバーのみが使用できるポートですから, 送信元ポートが 1023 番以下のパケットは受け入れても問題なさそうに見えます*7 。
しかし, これが成り立ったのはインターネットが普及する以前, 今から 10 年以上も昔の話*8 です。 現在では, だれでも自分のマシンに Linux などをインストールすれば root になることができ, インターネットにつなぐのも簡単です。 特権ポートと言ってもだれでも得られる特権では何の意味もありません。 そもそも UNIX 互換な OS でなければ(例えば Windows), 特権ですらありません。 したがって, 送信元ポートを用いたフィルタリングを行ってはいけません。
送信元ポートがフィルタリングの条件として使えず, 内部のホストの 1024 番以上のポートで サーバーが立ち上がってしまう可能性を考えると, 内向き接続における内向きパケットと, 外向き接続における内向きパケットを区別することはできません。
では, どうすれば良いのでしょうか?。
本稿は日経Linux 2000 年 11 月号に掲載された、 実践で学ぶ、一歩進んだサーバ構築・運用術, 第 8 回「ファイアウォール (後編)」を日経BP 社の許可を得て転載したものです。
Copyright(C)2000 by 仙石浩明 <sengoku@gcd.org>
無断転載を禁じます