・受信パケットは基本的にすべて破棄(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では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問い合わせを可能にするには、次の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アドレスやサービスポート番号といったスタティック(静的)な条件に基づいてパケットフィルタリングを実施しました。次回はパケットのステートフル性も考慮したステートフル・インスペクションを実施する方法を解説します。
Copyright © ITmedia, Inc. All Rights Reserved.