連載
» 2005年03月18日 00時00分 公開

習うより慣れろ! iptablesテンプレート集(1):ステートフルパケットフィルタを使ったサービスの公開 (3/6)

[鶴長鎮一,@IT]

テンプレート2
不特定ホストへのHTTPサーバ公開

テンプレート2の想定環境

・外部からの接続パケットは基本的にすべて破棄
・内部からの接続パケットは基本的にすべて破棄
・ループバックアドレスに関してはすべて許可
・メンテナンスホストからのping、メンテナンスホストへのpingを許可
・メンテナンスホストからのssh(TCP 22)を許可
・サーバからメンテナンスホストへのsshは許可しない
・任意のサーバからのHTTP(TCP 80)を許可
・サーバから外部のHTTPサーバに対してのHTTP接続は許可しない

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

 

テンプレート2の解説

 HTTPサービスを許可するため、次のような2行をシェルスクリプトに追加します。

41  iptables -A INPUT -p tcp -s $any -d $myhost --dport 80 -j ACCEPT
42  iptables -A OUTPUT -p tcp -s $myhost --sport 80 -d $any -j ACCEPT

 「-p tcp」でTCPプロトコル、「--dport 80」でHTTPが使用するサービスポート80の指定を行い、INPUT/OUTPUTチェインそれぞれで許可します。sshと異なり、HTTPでは接続ホストが特定のマシンではなく不特定のクライアントになるため、INPUTチェインにおいてはソースIPアドレスで、OUTPUTチェインではディスティネーションIPアドレスで、すべてのIPアドレス「$any」を指定する必要があります。

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

 内部からの接続も基本的にすべて拒否しているため、ホスト名解決でDNS問い合わせができず、ログへの出力などで支障が出る場合があります。DNS問い合わせが必要な場合は、次の2行を追加してHTTPサーバから任意の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サーバ側のサービスポートは53で固定されていますが、DNS問い合わせ要求を出すクライアント側のポートは不特定のポート番号を使用します。そのため、フィルタを適用する際はソースポートでの制限ができないので、DNSサーバ側すなわちディスティネーションのサービスポート番号を利用します。つまり、DNS要求を出す場合(OUTPUTチェイン)では、ディスティネーションポートにUDP 53を指定し、DNS問い合わせ結果を受け取る場合(INPUTチェイン)はソースポートにUDP 53を指定することになります。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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