いよいよパケットフィルタリングの設定を始める。しっかりと不要なパケットをブロックできれば、ファイアウォールの内側の安全度はより向上する。パケットの性質やiptablesの動作をここでマスターしてほしい。
前回はNATの設定方法を説明しました。これで見かけ上の経路ができたことになります。今回はファイアウォールの仕上げとして、パケットフィルタリングの設定を行います。
パケットフィルタリングの設定とはいかなるものかを簡単に説明すると、どのようなパケットを通過させるか、あるいは到達を許可/拒否させるかを定義することです。iptablesではIPアドレスやプロトコル、ポート、フラグメントなどで制限をかけることが可能です。さらに、送信先、送信元なのかといった判断もできます。これを行うのが、filterテーブルに含まれるFORWARD、INPUT、OUTPUTという3つのチェインです。まずは3つのチェインの関係を整理しておきましょう。
パケットを受信した際、まずパケットの送信先をチェックします。送信先がそのパケットを受信したホストそのものであれば、INPUTチェインに送られて定義されているルールに従って処理され、そのパケットを受け取る場合は適切なサービスに渡されます。送信先が別のホストであればFORWARDチェインに送られ、パケットの通過が許可されれば該当するホストへと転送されます。許可されなかったパケットは、そこで破棄されるというわけです。反対に、そのホストのプログラムによって生成されたパケットはOUTPUTチェインでチェックされ、許可されれば送信先へと送り出されます。
ファイアウォールはインターネットとLANの間でパケットを通過あるいは破棄するのが基本的な役目ですから、FORWARDの設定が中心になります。ただし、ファイアウォール自体に対して何らかの働きかけ(リモートメンテナンスなど)を行いたい場合もあるので、INPUTやOUTPUTの設定も行っておくべきでしょう。
FORWARDチェインは、ファイアウォールの肝になるチェインです。必要なパケットだけにDMZ上の目的のホストやサービスへアクセスを許可する(ファイアウォールを通過させる)のが、このFORWARDチェインの仕事です。当然のことながら、FORWARDチェインの基本ポリシーはDROP(パケットを破棄)とします。そして、許可するアクセスのみ「穴をあける」設定を行います。
基本的にFORWARDチェインのポリシーはDROPとするので、まず次のコマンドを実行します。
# /sbin/iptables -P FORWARD DROP
-Pオプションは前回説明したとおり、指定したチェインに対して基本ポリシーを設定するオプションです。これで、ファイアウォールを通過してDMZ上のホストへ到達できる経路はすべて絶たれたことになります。
次にファイアウォールを通過させるパケットの設定です。まずは次のようなルールを想定して設定を行います。
インターネット上のホストからWebサーバ(192.168.0.10)に対するHTTP(80/TCP)のアクセスのみを許可する。
FORWARDチェインに通過を許可するルールを追加するわけですが、注意しなければならないのは、iptablesでは1つのコネクションを1つのルールだけで許可することができないということです。どういうことかをTCPのコネクションを例に説明します。
TCPのセッションは、
という3つの段階を経て開始されます。
iptablesでは、接続元のホストから接続先のホストへのルール(上図の(1)(3))と接続先のホストから接続元のホストへのルール(上図の(2))とを別々のルールで定義する必要があります(注)。
これを踏まえたうえで、実際のルールを設定していきます。インターネット上のホストから、Webサーバへのアクセスを許可するには次のコマンドを実行します。
# /sbin/iptables -A FORWARD -p tcp --dport 80 -d 192.168.0.10 -j ACCEPT
上記のオプションは、次の内容をFORWARDチェインに追加(APPEND)したことを意味します。これにより、上図の(1)と(3)が可能になります。
-p | プロトコル:tcp |
---|---|
--dport | 送信先ポート:80 |
-d | 送信先アドレス:192.168.0.10 |
-j | ターゲット:ACCEPT(パケットの通過を許可) |
次に、Webサーバからインターネット上のホストへの応答パケットを許可するルールを設定します。これが上図の(2)を可能にするルールです。
# /sbin/iptables -A FORWARD -p tcp ! --syn -m state --state ESTABLISHED --sport 80 -s 192.168.0.10 -j ACCEPT
これで、インターネット上のホストからWebサーバへのHTTPのアクセスは許可されたことになります。
上記のオプションは、次の内容をFORWARDチェインに追加(APPEND)したことを意味します。
-p | プロトコル:tcp |
---|---|
--sport | 送信元ポート:80 |
-s | 送信元アドレス:192.168.0.10 |
! --syn | フラグ:SYNフラグ以外 |
-m state --state | ステータス:ESTABLISHED |
-j | ターゲット:ACCEPT(パケットの通過を許可) |
指定したオプションの中に、先ほどとは違うものが含まれています。それは「フラグ」と「ステータス」です。
●flag(フラグ):
フラグを条件とする拡張マッチングで、「-p tcp」(--protocol tcp)パラメータを指定したときのみ使用できます。
TCPパケットには、フラグとしてSYN、SYN/ACK、ACK、RSTなどがセットされています。iptablesでは次のフラグを指定することができます。
SYN、ACK、FIN、RST、URG、PSH、ALL(すべて)、NONE(すべてなし)
通常は「--tcp-flags」として、チェックするフラグとセットされているべきフラグを指定します。例えば、
-p tcp --tcp-flags ALL SYN,ACK
とした場合は「すべてのフラグ(ALL)をチェックし、SYNとACKだけがセットされているTCPパケット」を意味します。
「--syn」は「--tcp-flags SYN,RST,ACK SYN」の省略形で、「SYN、RST、ACKフラグをチェックし、SYNだけがセットされているTCPパケット」という意味になります。上記のオプションには「! --syn」が指定されています。前回も紹介したように「!」は条件を反転させるパラメータですから、「SYNビットがクリアされてACKとFINビットがセットされているTCPパケット」となります。
なぜこのオプションを指定することが必要なのか考えてみましょう。通常、サーバであれば自分自身からほかのホストへ接続することはほとんどないでしょう(注)。上記のルールは、アクセスに対する応答を許可するためのものです。接続の開始にセットされ、シーケンス番号の初期化に使われるSYNフラグがセットされたパケットの通過を許可する必要はないのです。SYNフラグがセットされたパケットの通過を拒否することは、クラッカーに仮に侵入されたとしてもほかのホストへの踏み台とさせないためにとても有効な手段となるのです。
●status(ステータス):
パケットの状態をチェックしたりする際に使用する拡張マッチングで、--stateを使うには「-m state」が必要です。つまり、必ず「-m state --state」という形を取ります。今回の例では引数として「ESTABLISHED」が与えられています。ESTABLISHEDなセッション、つまり双方向のコネクションのパケットを許可するということになります。
NEW | 新コネクションを開始するパケット |
---|---|
ESTABLISHED | 通常の応答パケットあるいは確立中コネクションの応答 |
RELATED | ICMPエラー、FTPデータコネクションなどのパケット |
INVALID | 無効なパケット |
表 --stateのマッチ条件 |
flagとセットで指定することで、クラッカーに侵入されてしまってもほかのホストへの踏み台とされないようにします。これも大切なセキュリティ対策の1つと考えられます。
以上、Webサーバを例に設定方法を紹介しました。メールサーバやDNSサーバへのアクセス許可も、これを参考にすれば設定できるでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.