新規ご契約の方
ご契約中のお客様
SiteLock

トップ »  サポート »  サーバー活用ガイド »  iptablesによるアクセス制限

iptablesによるアクセス制限

iptablesとは

iptablesは、Linux(カーネル2.4以降)でパケットフィルタリングのルールを設定するために使われるコマンドラインプログラムです。

理想としては、ファイヤーウォール用の機器を利用したほうが望ましいのですが、お客さまの事情により、弊社で提供しております専用ファイヤーウォールもしくは共用ファイヤーウォールののご利用が難しい場合がございます。
その場合は、iptablesを使い、お客さまサーバー上でパケットフィルタリングを行うことでサーバーのセキュリティーを高めることができます。

管理ツール(Plesk、HDE Controller)からも、iptablesの機能を利用することができますが、iptablesコマンドを直接利用することにより、より柔軟な設定が可能となります。
例えば、iptablesには「コネクション・トラッキング (接続追跡)」という機能があり、TCPコネクションの接続状態に応じて、フィルタリングルールを適用することができます。

しかしながら、シェル上で直接フィルタリングのルールを設定することになるため、設定ミスにより、外部からの接続ができなくなってしまうといったリスクもございます。

ここでは、設定ミスの可能性を極力少なくなるようなコツも含めてiptablesの基本と簡単な設定例をご説明させていただいておりますので、お客さまのサーバー運用にぜひご活用ください。

なお、iptablesは比較的大きなプログラムで仕様も複雑でございますので、実際に運用するにあたりましては、manページ、関連の書籍、Webサイト等をご利用し、お客さまにて理解を深めた上でフィルタリングのルールを設定していただきますようお願い申し上げます。

iptablesの基本概念

iptables では以下のテーブルが用意されています。

  • filter
  • nat
  • mangle

テーブルはフィルタリングのルールをカーネルが保持している場所と考えてください。ファイヤーウォール構築を目的としてパケットフィルタリングを行う場合は、通常fileterテーブルを使用することになります。

iptablesコマンドは本来、「-t filter」のようにテーブルも指定して実行する仕様ですが、何も指定しない場合は、「filter」が指定されるのと同じことになります。
したがって、テーブルという概念は差し当たり意識する必要がありませんので、本マニュアルではfilter以外のテーブルについて説明を省略します。

filterテーブルは以下のチェインから構成されます。

  • INPUT
  • OUTPUT
  • FORWARD

パケットはそれらがどこを出発して、どこに行くかによって、異なるチェイン(鎖)を通って移動します。
チェインを規則の集まりと考えていただければよいでしょう。

INPUTは入ってくるトラフィックが通る鎖、OUTPUTは出て行くトラフィックが通る鎖です。 FORWARDは、ルーター機能をもつホストにファイヤーウォールを構築する場合に使用するチェインとなりますので、説明は省略します。

チェインはユーザーにより定義することも可能です。
各チェインには、指定したパケット群にマッチするルールを追加していきます。
各ルールはマッチしたパケットに対して何をするかを指定できます。
これはターゲットと呼ばれます。

通常は以下のターゲットを主に使用します。

  • ACCEPT
  • DROP
  • QUEUE
  • RETURN

ACCEPTはパケットを通過させることを意味し、DROPはパケットを捨てることを意味します。 QUEUEとRETURNは以下の説明では使用しませんので省略します。

パケットがチェイン内の最初のルールにマッチしない場合、チェイン内の次のルールが評価されます。 パケットがマッチした場合、そのルールのターゲットの値にしたがって次の処理が行われます。 チェインの最後に到達した場合、チェインのポリシーで指定されたターゲットがパケットの行方を決定します。 ポリシーは、チェインにおけるデフォルトのルールと考えてください。

設定の基本フロー

iptables でパケットフィルタリングのルールを設定していく場合の基本的な流れは以下のようになります。

(1) パケットフィルタリングルールをクリア
(2) ポリシーを設定 (最初に全ポートを閉じる)
(3) パケットフィルタリングルールを追加
(4) iptablesの設定を保存
(5)iptablesの再起動

設定作業は、iptablesコマンドでルールを1つ1つ入力してもよいのですが、入力ミスが起こりやすく、サーバーを再起動した場合に同じ設定作業を繰り返すことになります。(*1)
入力ミスを防ぐには、設定に必要なコマンドをシェルスクリプトとして作成することが効果的です。
また、再起動後に同じシェルスクリプトを実行することにより、再度コマンドを入力する手間が省けます。
ディストリビューションの起動スクリプトを使い設定の保存を行えば、OS再起動時に自動的にルールが再適用されますので、シェルを実行する手間も省けます。(*2)
シェルスクリプトを作成した上で、設定を行う方法をおすすめいたします。

(*1)設定はカーネル中にあるだけなので、リブートすると失われてしまいます。 iptables-save及びiptables-restoreコマンドを使えば、設定をファイルに保存しておき、その後、そのファイルから回復することができます。
シェルスクリプトに精通していない場合は、上記コマンドをお使いいただければ、設定を再適用することができます。
(*2)コマンドで各ルールを入力していった場合でも、ディストリビューションの起動スクリプトを使い、設定を保存すれば、再入力の必要はなくなります。しかしながら、設定が複雑な場合はシェルスクリプトとして管理しておくことによりルール変更等のメンテナンスが容易になります。

以下の説明では、(2)(3)について個々のコマンドを説明した後、シェルスクリプト作成の例を示します。 (1)(4)(5)については、ディストリビューションの起動スクリプトを使って説明します。

設定例

ここでの設定例では、以下の簡単な運用環境を想定してファイヤーウォールを構築してみます。

運用環境

  • サーバーは信頼できるクライアントからSSH接続でリモート管理を行う。
  • HTTPサーバーを外部に公開する。
  • 信頼できるクライアントからのFTP接続によりコンテンツをサーバーに転送する。
  • サーバー自身のDNS問合せ用にキャッシュサーバーとしてDNSサービスを起動する。

フィルタリングの基本方針

  • 運用上必要のない受信パケット、送信パケット、転送パケットの通過は許可しない。
  • サーバ内部でのパケット送受信は全て許可する。
  • 任意の外部ホストからのHTTP接続を許可する。
  • 特定の信頼できる外部ホストからのみFTP、SSHでの接続を許可する。
  • DNSキャッシュサーバーの外部ホストへのDNS問合せを許可する。

フィルタリングの基本は、最低限のトラフィックのみ許可することです。
したがいまして、運用上必要なトラフィックは全て1つ1つルールとして指定する必要があります。

実際にチェインに適用するポリシー、追加するルールはお客さまの運用環境に合わせて設計いただき、サーバーの基本動作、稼動中のサービスに支障が出ないように検証を重ねてください。

ルールの適用により既存のアプリケーションが動かなくなる可能性が高いですが、その場合もアプリケーションが動作するために最小限のルールのみ追加することが望ましいです。

ポリシーの設定

ポリシーは以下の書式を使って設定します。
iptables -P チェイン ターゲット

具体的には、

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

のようにコマンドを実行します。
これにより、どのルールにもマッチしないパケットは破棄されます。

SSHにてコマンド入力を行う場合、ポリシーの設定はSSH接続を許可するルールを設定した後に行ってください。
「iptables -P INPUT 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

以上のコマンドを実行すればルールが適用されます。

(*1)この設定内容ですと、1024番ポート以降を使用するサービス、例えば、MySQL、Postgres、各種管理ツール等へ接続するパケットも通過してしまいます。特定ホストからの接続であってもセキュリティー上好ましくありません。
実際にはFTP接続に対応したiptablesの追加モジュールをロードすることで対応可能ですが、本マニュアルの範囲を超えますので、お客さまにて参考書籍等でお調べいただきますようお願い申し上げます。

スクリプトファイル

本マニュアルでは、コマンドをシェルスクリプトから実行する方法でフィルタリングルールを適用する方法を説明します。以下がスクリプトの作成例となります。これはあくまで簡易的な例となりますので、そのまま実行しても失敗しますのでご注意ください。

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によるパケットフィルタリングの設定のみでは、セキュリティー対策としては十分ではございません。不要なサービスの停止、アプリケーションレベルでのアクセス制御等も行うことで、第三者にクラックされ、踏み台にされる危険性が格段に少なくなりますので、お客さまの運用環境にあわせてセキュリティー対策を実行していただくようお願い申し上げます。


Back to Top