ステートフルパケットフィルタを使ったサービスの公開:習うより慣れろ! iptablesテンプレート集(1)(3/6 ページ)
初心者にとって、iptablesは設定が最も困難な機能の1つである。そこで、学習の第1歩としてテンプレートを自分の環境に合わせて修正することから始めよう。(編集部)
テンプレート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.