iptables は、Linux オペレーティング システム用に構築された非常に柔軟なファイアウォール ユーティリティです。あなたが初心者の Linux マニアであっても、システム管理者であっても、おそらく iptables を有効に活用できる方法がいくつかあるでしょう。最も汎用性の高い Linux ファイアウォールを構成する方法を説明しますので、読み続けてください。
写真提供 : ezioman
iptables について
iptables は、ポリシー チェーンを使用してトラフィックを許可またはブロックするコマンド ライン ファイアウォール ユーティリティです。システム上で接続が確立しようとすると、iptables はそのリスト内で一致するルールを探します。見つからない場合は、デフォルトのアクションが使用されます。
iptables は、ほとんどの場合、どの Linux ディストリビューションにもプリインストールされています。更新/インストールするには、iptables パッケージを取得するだけです。
sudo apt- get install iptablessudo apt- get install iptables
Firestarter など、 iptables に代わる GUI もありますが、いくつかのコマンドを覚えてしまえば、 iptables はそれほど難しくありません。 iptables ルールを構成するときは、特にサーバーに SSH で接続している場合は細心の注意を払う必要があります。コマンドを 1 つ間違えると、物理マシンで手動で修正するまで永久にロックアウトされる可能性があるためです。ポートを開いた場合は、 SSH サーバーをロックダウンする ことを忘れないでください。
チェーンの種類
iptables は、入力、転送、出力という 3 つの異なるチェーンを使用します。
入力 – このチェーンは、受信接続の動作を制御するために使用されます。たとえば、ユーザーが PC/サーバーに SSH 接続しようとすると、iptables は IP アドレスとポートを入力チェーン内のルールと照合しようとします。
転送 – このチェーンは、実際にはローカルに配信されていない受信接続に使用されます。ルーターについて考えてみましょう。データは常にルーターに送信されますが、実際にルーター自体に送信されることはほとんどありません。データはターゲットに転送されるだけです。システム上で何らかのルーティング、NAT 処理、または転送が必要な何かを実行していない限り、このチェーンは使用することさえありません。
システムがフォワード チェーンを使用しているかどうか、またはフォワード チェーンを必要としているかどうかを確認する確実な方法が 1 つあります。
iptables -L -v
上のスクリーンショットは、数週間稼働しているサーバーのもので、受信接続または送信接続に制限はありません。ご覧のとおり、入力チェーンは 11GB のパケットを処理し、出力チェーンは 17GB を処理しました。一方、順方向チェーンは単一のパケットを処理する必要はありません。これは、サーバーがいかなる種類の転送も行っていない、またはパススルー デバイスとして使用されていないためです。
出力 – このチェーンは発信接続に使用されます。たとえば、.com に ping を実行しようとすると、iptables はその出力チェーンをチェックして、接続試行を許可するか拒否するかを決定する前に、ping と .com に関するルールを確認します。
注意点
外部ホストへの ping は出力チェーンを通過するだけで済むように見えますが、データを返すには入力チェーンも使用されることに注意してください。 iptables を使用してシステムをロックダウンする場合は、多くのプロトコルで双方向通信が必要となるため、入力チェーンと出力チェーンの両方を適切に構成する必要があることに注意してください。 SSH は、両方のチェーンで許可することを忘れてしまう一般的なプロトコルです。
ポリシーチェーンのデフォルト動作
特定のルールを設定する前に、3 つのチェーンのデフォルトの動作をどのようにするかを決定する必要があります。言い換えれば、接続が既存のルールに一致しない場合に iptables に何をさせたいのでしょうか?
一致しないトラフィックに対してポリシー チェーンが現在どのように設定されているかを確認するには、次のコマンドを実行します。
iptables -L
指示。
ご覧のとおり、よりクリーンな出力を得るために grep コマンドも使用しました。このスクリーンショットでは、チェーンは現在トラフィックを受け入れていることがわかります。
多くの場合、システムがデフォルトで接続を受け入れるようにする必要があります。以前にポリシー チェーン ルールを変更していない限り、この設定はすでに構成されているはずです。いずれにしても、デフォルトで接続を受け入れるコマンドは次のとおりです。
iptables --policy INPUT ACCEPTiptables --policy INPUT ACCEPTiptables --policy OUTPUT ACCEPTiptables --policy OUTPUT ACCEPTiptables --policy FORWARD ACCEPTiptables --policy FORWARD ACCEPT
デフォルトで受け入れルールを設定すると、iptables を使用して特定の IP アドレスまたはポート番号を拒否し、他のすべての接続を引き続き受け入れることができます。これらのコマンドについてはすぐに説明します。
すべての接続を拒否し、接続を許可する接続を手動で指定したい場合は、チェーンのデフォルト ポリシーをドロップするように変更する必要があります。これを行うことは、おそらく、機密情報が含まれており、同じ IP アドレスのみが接続されているサーバーにのみ役立ちます。
iptables --policy INPUT DROPiptables --policy INPUT DROPiptables --policy OUTPUT DROPiptables --policy OUTPUT DROPiptables --policy FORWARD DROPiptables --policy FORWARD DROP
接続固有の応答
デフォルトのチェーン ポリシーを構成したら、iptables へのルールの追加を開始できるようになり、特定の IP アドレスまたはポートからの接続、または特定の IP アドレスまたはポートへの接続が発生したときに何をすべきかを認識できます。このガイドでは、最も基本的でよく使用される 3 つの「応答」について説明します。
承諾 – 接続を許可します。
ドロップ – 接続をドロップし、何も起こらなかったかのように動作します。これは、ソースにシステムの存在を認識させたくない場合に最適です。
拒否 – 接続を許可しませんが、エラーを送り返します。これは、特定のソースをシステムに接続したくないが、ファイアウォールによってブロックされていることを知らせたい場合に最適です。
これら 3 つのルールの違いを示す最良の方法は、これらの各設定に対して iptables が構成されている Linux マシンに PC が ping を試行したときにどのように見えるかを示すことです。
接続を許可する:
接続を切断します:
接続を拒否する:
特定の接続を許可またはブロックする
ポリシー チェーンを構成したら、特定のアドレス、アドレス範囲、ポートを許可またはブロックするように iptables を構成できるようになります。これらの例では、接続を次のように設定します。
DROP
、ただし、次のように切り替えることができます。
ACCEPT
または
REJECT
、ニーズとポリシー チェーンの構成方法に応じて異なります。
注: これらの例では、
iptables -A
既存のチェーンにルールを追加します。 iptables はリストの先頭から開始し、一致するルールが見つかるまで各ルールを調べます。ルールを別のルールの上に挿入する必要がある場合は、次のように使用できます。
iptables -I [chain] [number]
リストに含める番号を指定します。
単一の IP アドレスからの接続
この例では、IP アドレス 10.10.10.10 からのすべての接続をブロックする方法を示します。
iptables -A INPUT -s 10 .10 .10 .10 -j DROPiptables -A INPUT -s 10 .10 .10 .10 -j DROP
一定範囲の IP アドレスからの接続
この例では、10.10.10.0/24 ネットワーク範囲内のすべての IP アドレスをブロックする方法を示します。ネットマスクまたは標準のスラッシュ表記を使用して、IP アドレスの範囲を指定できます。
iptables -A INPUT -s 10.10.10.0/24 -j DROPiptables -A INPUT -s 10.10.10.0/24 -j DROP
または
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROPiptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
特定のポートへの接続
この例では、10.10.10.10 からの SSH 接続をブロックする方法を示します。
iptables -A INPUT -p tcp --dport ssh -s 10 .10 .10 .10 -j DROPiptables -A INPUT -p tcp --dport ssh -s 10 .10 .10 .10 -j DROP
「ssh」は任意のプロトコルまたはポート番号に置き換えることができます。の
-p tcp
コードの一部は、プロトコルが使用する接続の種類を iptables に伝えます。 TCP ではなく UDP を使用するプロトコルをブロックしていた場合は、
-p udp
代わりに必要になります。
この例では、任意の IP アドレスからの SSH 接続をブロックする方法を示します。
iptables -A INPUT -p tcp --dport ssh -j DROPiptables -A INPUT -p tcp --dport ssh -j DROP
接続状態
前に述べたように、多くのプロトコルは双方向通信を必要とします。たとえば、システムへの SSH 接続を許可する場合は、入力チェーンと出力チェーンにルールを追加する必要があります。しかし、システムに入る SSH のみを許可したい場合はどうすればよいでしょうか?出力チェーンにルールを追加すると、発信 SSH 試行も許可されませんか?
ここで、接続状態が登場します。これにより、双方向通信を許可するのに必要な機能が得られますが、確立できるのは一方向接続のみです。この例を見てください。10.10.10.10 からの SSH 接続は許可されていますが、10.10.10.10 への SSH 接続は許可されていません。ただし、セッションがすでに確立されている限り、システムは SSH 経由で情報を送り返すことが許可されているため、これら 2 つのホスト間で SSH 通信が可能になります。
iptables -A INPUT -p tcp --dport ssh -s 10 .10 .10 .10 -m state --state NEW , ESTABLISHED -j ACCEPTiptables -A INPUT -p tcp --dport ssh -s 10 .10 .10 .10 -m state --state NEW , ESTABLISHED -j ACCEPTiptables -A OUTPUT -p tcp --sport 22 -d 10 .10 .10 .10 -m state --state ESTABLISHED -j ACCEPTiptables -A OUTPUT -p tcp --sport 22 -d 10 .10 .10 .10 -m state --state ESTABLISHED -j ACCEPT
変更の保存
iptables ルールに加えた変更は、変更を保存するコマンドを実行しない限り、次回 iptables サービスが再起動されるときに破棄されます。このコマンドはディストリビューションによって異なる場合があります。
Ubuntu:
sudo /sbin/iptables-save
レッドハット/CentOS:
/sbin/service iptables save
または
/etc/init.d/iptables save
その他のコマンド
現在構成されている iptables ルールをリストします。
iptables -L
を追加すると、
-v
オプションを使用すると、パケットとバイトの情報が得られます。
-n
すべてを数値でリストします。言い換えれば、ホスト名、プロトコル、ネットワークが数字としてリストされます。
現在構成されているルールをすべてクリアするには、flush コマンドを発行します。
iptables -F
関連: 開発者と愛好家のための最高の Linux ラップトップ





