連載
» 2009年12月01日 00時00分 公開

スタティックなパケットフィルタリングiptablesテンプレート集 改訂版(1)(4/4 ページ)

[鶴長鎮一,@IT]
前のページへ 1|2|3|4       

テンプレート2
すべてのホストでHTTPサービスだけを公開する
(サービスポート番号で制限)

受信パケットは基本的にすべて破棄(1)
送信パケットは基本的にすべて破棄(2)
ループバックアドレスに関してはすべて許可(3)
メンテナンスホストからのping、メンテナンスホストへのpingを許可(4)
メンテナンスホストからのssh(TCP 22)を許可(5)
サーバからメンテナンスホストへのsshは許可しない(6)
すべてのホストからのHTTP(TCP 80)を許可(7)
サーバから外部のHTTPサーバに対してのHTTP接続は許可しない(8)

 テンプレート1に新しいサービスを追加する場合です。サービスが使用するプロトコル(TCP、UDP、ICMP)とポート番号を調べておき、テンプレート1の36、37行目を参考にして新たなルールを追加します。テンプレート2では、新しいサービスとして「HTTPサービス」を追加する場合を例に考えてみます。

テンプレート2の解説

 テンプレート2ではHTTPサービスを許可するため、テンプレート1に対し、次のような3行を追加しています。

5  any='0.0.0.0/0'
...
42  iptables -A INPUT -p tcp -s $any -d $myhost --dport 80 -j ACCEPT
43  iptables -A OUTPUT -p tcp -s $myhost --sport 80 -d $any -j ACCEPT

 すべてのホスト($any)を表すには、5行目のような「0.0.0.0/0」を用います。ここで設定した$anyは42、43行目で使用します。42、43行目では「--dport 80」でHTTPが使用するサービスポート・80番に対する設定を行います。42行目ではINPUTチェインを使って、送信先ポート番号が80番のパケットに対し、受け入れを許可しています。43行目ではOUTPUTチェインを使って、送信元サービスポートが80番のパケットに対し、送信を許可しています。sshと異なり、HTTPでは接続ホストが特定ホストではなく不特定のホストになる点に注意します。

改造のヒント:DNS問い合わせを可能に

 サーバ内部から外部へ送信されるパケットは基本的にすべて破棄しているため、DNSの問い合わせもできません。ホスト名解決ができないとアクセスログにホスト名を残すことができません。DNS問い合わせを可能にするには、次の2行をテンプレートに追加して、サーバから任意のDNSサーバに対するDNS問い合わせ(UDP 53)を許可します。

iptables -A INPUT -p udp -s $any --sport 53 -d $myhost -j ACCEPT
iptables -A OUTPUT -p udp -s $myhost -d $any --dport 53 -j ACCEPT

 DNS問い合わせでは、iptablesを実施するホストがDNSクライアントになり、DNSサーバに問い合わせを行います。その際、DNS問い合わせを要求する側の送信元ポート番号は不特定です。そのためフィルタを適用する際は、送信元ポート番号ではなくDNSサーバ側、すなわち送信先のサービスポート番号を利用します。

 これを実現するため、DNS要求を出すタイミング(OUTPUTチェイン)では送信先ポート番号がUDP 53番あてのパケットを許可し、DNS問い合わせ結果を受け取るタイミング(INPUTチェイン)では送信元ポート番号がUDP 53番のパケットの受け入れを許可します。

次回予告

 今回はiptablesの基本操作を紹介し、送信元IPアドレスやサービスポート番号といったスタティック(静的)な条件に基づいてパケットフィルタリングを実施しました。次回はパケットのステートフル性も考慮したステートフル・インスペクションを実施する方法を解説します。


前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。