トップ » サポート » サーバー活用ガイド » iptablesによるアクセス制限
iptablesは、Linux(カーネル2.4以降)でパケットフィルタリングのルールを設定するために使われるコマンドラインプログラムです。
理想としては、ファイヤーウォール用の機器を利用したほうが望ましいのですが、お客さまの事情により、弊社で提供しております専用ファイヤーウォールもしくは共用ファイヤーウォールののご利用が難しい場合がございます。
その場合は、iptablesを使い、お客さまサーバー上でパケットフィルタリングを行うことでサーバーのセキュリティーを高めることができます。
管理ツール(Plesk、HDE Controller)からも、iptablesの機能を利用することができますが、iptablesコマンドを直接利用することにより、より柔軟な設定が可能となります。
例えば、iptablesには「コネクション・トラッキング (接続追跡)」という機能があり、TCPコネクションの接続状態に応じて、フィルタリングルールを適用することができます。
しかしながら、シェル上で直接フィルタリングのルールを設定することになるため、設定ミスにより、外部からの接続ができなくなってしまうといったリスクもございます。
ここでは、設定ミスの可能性を極力少なくなるようなコツも含めてiptablesの基本と簡単な設定例をご説明させていただいておりますので、お客さまのサーバー運用にぜひご活用ください。
なお、iptablesは比較的大きなプログラムで仕様も複雑でございますので、実際に運用するにあたりましては、manページ、関連の書籍、Webサイト等をご利用し、お客さまにて理解を深めた上でフィルタリングのルールを設定していただきますようお願い申し上げます。
iptables では以下のテーブルが用意されています。
テーブルはフィルタリングのルールをカーネルが保持している場所と考えてください。ファイヤーウォール構築を目的としてパケットフィルタリングを行う場合は、通常fileterテーブルを使用することになります。
iptablesコマンドは本来、「-t filter」のようにテーブルも指定して実行する仕様ですが、何も指定しない場合は、「filter」が指定されるのと同じことになります。
したがって、テーブルという概念は差し当たり意識する必要がありませんので、本マニュアルではfilter以外のテーブルについて説明を省略します。
filterテーブルは以下のチェインから構成されます。
パケットはそれらがどこを出発して、どこに行くかによって、異なるチェイン(鎖)を通って移動します。
チェインを規則の集まりと考えていただければよいでしょう。
INPUTは入ってくるトラフィックが通る鎖、OUTPUTは出て行くトラフィックが通る鎖です。 FORWARDは、ルーター機能をもつホストにファイヤーウォールを構築する場合に使用するチェインとなりますので、説明は省略します。
チェインはユーザーにより定義することも可能です。
各チェインには、指定したパケット群にマッチするルールを追加していきます。
各ルールはマッチしたパケットに対して何をするかを指定できます。
これはターゲットと呼ばれます。
通常は以下のターゲットを主に使用します。
ACCEPTはパケットを通過させることを意味し、DROPはパケットを捨てることを意味します。 QUEUEとRETURNは以下の説明では使用しませんので省略します。
パケットがチェイン内の最初のルールにマッチしない場合、チェイン内の次のルールが評価されます。 パケットがマッチした場合、そのルールのターゲットの値にしたがって次の処理が行われます。 チェインの最後に到達した場合、チェインのポリシーで指定されたターゲットがパケットの行方を決定します。 ポリシーは、チェインにおけるデフォルトのルールと考えてください。
iptables でパケットフィルタリングのルールを設定していく場合の基本的な流れは以下のようになります。
(1) パケットフィルタリングルールをクリア
(2) ポリシーを設定 (最初に全ポートを閉じる)
(3) パケットフィルタリングルールを追加
(4) iptablesの設定を保存
(5)iptablesの再起動
設定作業は、iptablesコマンドでルールを1つ1つ入力してもよいのですが、入力ミスが起こりやすく、サーバーを再起動した場合に同じ設定作業を繰り返すことになります。(*1)
入力ミスを防ぐには、設定に必要なコマンドをシェルスクリプトとして作成することが効果的です。
また、再起動後に同じシェルスクリプトを実行することにより、再度コマンドを入力する手間が省けます。
ディストリビューションの起動スクリプトを使い設定の保存を行えば、OS再起動時に自動的にルールが再適用されますので、シェルを実行する手間も省けます。(*2)
シェルスクリプトを作成した上で、設定を行う方法をおすすめいたします。
以下の説明では、(2)(3)について個々のコマンドを説明した後、シェルスクリプト作成の例を示します。 (1)(4)(5)については、ディストリビューションの起動スクリプトを使って説明します。
ここでの設定例では、以下の簡単な運用環境を想定してファイヤーウォールを構築してみます。
運用環境
フィルタリングの基本方針
フィルタリングの基本は、最低限のトラフィックのみ許可することです。
したがいまして、運用上必要なトラフィックは全て1つ1つルールとして指定する必要があります。
実際にチェインに適用するポリシー、追加するルールはお客さまの運用環境に合わせて設計いただき、サーバーの基本動作、稼動中のサービスに支障が出ないように検証を重ねてください。
ルールの適用により既存のアプリケーションが動かなくなる可能性が高いですが、その場合もアプリケーションが動作するために最小限のルールのみ追加することが望ましいです。
ポリシーは以下の書式を使って設定します。
iptables -P チェイン ターゲット
具体的には、
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
のようにコマンドを実行します。
これにより、どのルールにもマッチしないパケットは破棄されます。
設定例の基本方針にしたがってルールを追加するコマンドを説明します。
ループバックアドレスからのアクセスを許可し、サーバ内部でのパケット送受信を可能にします。
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
「-A」はルールを追加するときのオプションです。
「-i」オプションによりパケットを受け入れるインターフェイスを指定します。
「-o」オプションによりパケットを送出するインターフェイスを指定します。
「lo」はループバックアドレスを意味します。
「-j」オプションはターゲットを指定します。
任意のネットワークからのHTTPアクセスを許可します。
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
「-p」オプションでプロトコルを指定します。この場合は「tcp」となります。
「-p」を使用した場合、「--dport」「--sport」という拡張パラメータが使用できます。
「--dport」で送信先ポート、「--sport」で送信元ポートを指定します。
信頼できる特定ホストからのFTP接続を許可します。
特定ホストのIPアドレスを仮にy.y.y.yとします。
iptables -A INPUT -p tcp -s y.y.y.y --dport 21 -j ACCEPT
「-s」「-d」オプションで、送信元IPアドレス、送信先IPアドレスを指定します。
PASSIVモードでのファイル転送を許可します(*1)。
iptables -A INPUT -p tcp -m state --state NEW -s y.y.y.y --dport 1024: -j ACCEPT
「-m」オプションを使用すると「コネクション・トラッキング (接続追跡)」を使用した制御が可能となります。ここでは、新しい接続についてのルールという条件を設定しています。「1024:」は1024番ポート以降の全ポートを意味します(*1)。
信頼できる特定ホストからのSSH接続を許可します。
iptables -A INPUT -p tcp -s y.y.y.y --dport 22 -j ACCEPT
自ホストから外部DNSサーバーへの問合せを許可します。
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
確立済みの接続及びそれと関連する接続についてパケットは許可し、上記で許可した受入れパケット及び 外部DNSサーバーへの問合せに対する応答パケットを通過させるようにします。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
以上のコマンドを実行すればルールが適用されます。
本マニュアルでは、コマンドをシェルスクリプトから実行する方法でフィルタリングルールを適用する方法を説明します。以下がスクリプトの作成例となります。これはあくまで簡易的な例となりますので、そのまま実行しても失敗しますのでご注意ください。
packet_filter.sh
---------------------------------------------------------------------------
#!/bin/sh
#信頼する特定ホストのIPアドレス
TrustIP='y.y.y.y'
#パケットフィルタリングルールをクリア
#OSの起動スクリプトで処理します。
#お客さまにてクリア処理を実装する場合は、ここに追加してください。
#iptables ?F
#ポリシーを設定 -> その他全ての接続を拒否
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#ループバックアドレスからのアクセスを許可
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#任意のネットワークからのHTTPアクセスを許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#信頼できる特定ホストからのFTP接続を許可
iptables -A INPUT -p tcp -s $TrustIP --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -s $TrustIP --dport 1024: -j ACCEPT
#信頼できる特定ホストからのSSH接続を許可
iptables -A INPUT -p tcp -s $TrustIP --dport 22 -j ACCEPT
#自ホストから外部DNSサーバーへの問合せを許可
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
#確立済みの接続及びそれと関連する接続についてパケットは許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
--------------------------------------------------------------------------------
スクリプトファイルが完成したら、実際にフィルタリングルールを適用します。
以下の適用作業では、iptablesコマンドを直接使わずに、ディストリビューションの起動スクリプトを使用しています。
root権限にスイッチし、以下のコマンドで既存のポリシーとフィルタリングルールを初期化してください。
#/etc/init.d/iptables stop
以下のコマンドで設定内容がクリアされたか確認します。
#iptables -L -n
設定内容が正しくクリアされていれば、以下のような出力を得ます。
-------------------------------------------------------
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
--------------------------------------------------------
初期化が完了しましたら、以下のコマンドでスクリプトに実行権限を与えて実行します。
#chmod 700
#./packet_filter.sh
これで、新しいポリシーとフィルタリングルールが適用されます。
しかし、このままではサーバー起動時に設定が反映されません。そこで次のコマンドを実行し、設定を保存します。
通常ですと、/etc/sysconfig/iptables というファイルに保存されます。
#/etc/init.d/iptables save
念のため、iptablesの起動スクリプトでモジュールの再読み込みを行い、サーバーが再起動された時に保存した内容が正しく読み込まれるか確認してみましょう。
#/etc/init.d/iptables restart
再起動が完了しましたら、以下のコマンドで設定した内容が正しく反映されているかご確認ください。
#iptables -L -n
正しく適用されていれば、以下のような出力を得ます。
--------------------------------------------------------------------------
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 210.172.143.2 0.0.0.0/0 tcp dpt:21
ACCEPT tcp -- 210.172.143.2 0.0.0.0/0 state NEW tcp dpts:1024:65535
ACCEPT tcp -- 210.172.143.2 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
---------------------------------------------------------------------------
以上でパケットフィルタリングの設定作業は完了です。
マイティーサーバーではシリアルコンソールのご利用が可能です
シリアルコンソール 操作ガイド
シリアルコンソール接続にてサーバーへログインし、停止コマンドを実行してください。
#/etc/init.d/iptables stop
停止スクリプトでいったんiptablesを停止し、スクリプトファイルの修正を行ってください。
iptablesによるパケットフィルタリングの設定のみでは、セキュリティー対策としては十分ではございません。不要なサービスの停止、アプリケーションレベルでのアクセス制御等も行うことで、第三者にクラックされ、踏み台にされる危険性が格段に少なくなりますので、お客さまの運用環境にあわせてセキュリティー対策を実行していただくようお願い申し上げます。