・受信パケットは破棄。ただしステートフル性を確認し、サーバから送信されたパケットに関連するものは許可(1)
・送信パケットは基本的にすべて許可(2)
・ループバックアドレスに関してはすべて許可(3)
・メンテナンスホストからのping、メンテナンスホストへのpingを許可(4)
・メンテナンスホストからのssh(TCP 22)を許可(5)
・すべてのホストからのHTTP(TCP 80)を許可(6)
・サーバからのDNS問い合わせ(UDP 53)を許可(7)
テンプレート1〜3までは一貫して、サーバから送信されるパケットをすべて破棄してきました。そのためDNS問い合わせの例(テンプレート2)のように必要なものは、その都度、許可ルールを追加していました。厳密にパケット・フィルタリングを実施するならば、このように必要なサービスに対してのみ許可ルールを設定すべきです。
しかし今回は利便性を考え、サーバから送信されるパケットや、サーバからのリクエストに対する受信パケットは無条件で通過できるようにします。
テンプレート4ではデフォルトルールを見直し、サーバから送信されるパケットは無条件に通過を許可します。
17 /sbin/iptables -P OUTPUT ACCEPT
サーバが受信するパケットはステートフル性を確認し、サーバからのリクエストに対する受信パケットなら許可します。
35 /sbin/iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
新規接続パケットはsshやHTTPサービスに対するもので、それがSYNパケットなら受け入れます。ほかのサービスを公開したい場合は、サービスポート番号を変えるなど、同じ手順でルールを追加します。
39 /sbin/iptables -A INPUT -p tcp --syn -m state --state NEW -s $trusthost -d $myhost --dport 22 -j ACCEPT ... 43 /sbin/iptables -A INPUT -p tcp --syn -m state --state NEW -s $any -d $myhost --dport 80 -j ACCEPT
送信パケットは、UDP/TCPを問わず通過が許可されていますが、受信パケットに関してはデフォルトルールが破棄(DROP)となっています。TCPを使用する受信パケットは、ステートフル性を確認することでフィルタリングを行っていますが、UDPには3ウェイハンドシェイクのようなセッションを確立する手順がありません。そのため、使用するサービスごとにルールを追加する必要があります。
47 /sbin/iptables -A INPUT -p udp -s $any --sport 53 -d $myhost -j ACCEPT
サーバが送信するパケットに対しても、ステートフルインスペクションでフィルタリングを実施することができます。テンプレート4を基に修正を加えましょう。
送信パケットのデフォルトルールを破棄(DROP)に戻し、ステートフル性を確認し、NEW・ESTABLISHED・RELATEDの状態にあるパケットだけ通過を許可します。
/sbin/iptables -P OUTPUT DROP .... /sbin/iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
TCPはステートフル性を確認することで不正なパケットを遮断できますが、UDPはステートフル性を確認できないため、必要なものだけ送信を許可するよう、その都度ルールを追加する必要があります。例えば、UDPを使用するDNSリクエストを送信できるようにするには、次のようにiptablesを実行します。
/sbin/iptables -A OUTPUT -p udp -s $myhost -d $any --dport 53 -j ACCEPT
2回にわたり、iptablesのfilterテーブルを使ったパケットフィルタリングの例を紹介しました。
次回はnatテーブルを使ったNAT機能を取り上げます。NAT機能を使えばパケットのIPアドレス情報を書き換え、市販のブロードバンドルータと同じような働きをLinuxで実現できます。
Copyright © ITmedia, Inc. All Rights Reserved.