ウェブサイト検索

Iptables チュートリアル


iptables は、定義されたルールに従ってパケットをフィルタリングするコマンドライン ファイアウォールです。 Iptables を使用すると、ユーザーは接続を承認、拒否、または接続を続行できます。これは信じられないほど多用途であり、nftable に置き換えられているにもかかわらず広く使用されています。

このチュートリアルを読むと、Iptables ポリシーを理解し、ホーム ネットワークを保護するための Iptables ルールを定義できるようになります。

: sudo コマンドは、この iptables チュートリアルで説明されているルールをコピーして貼り付ける必要がある読者のために追加されました。

Iptables 用語集:

ターゲット: iptables を使用する場合、ターゲットとは、パケットがルールに一致したときに iptables に適用するアクションです。

チェーン: チェーンはルールのリストです。利用可能な組み込みチェーンは、INPUT、OUTPUT、FORWARD、PREROUTING、および POSTROUTING です。

テーブル: テーブルは、それぞれの目的に対応した iptables の機能です。たとえば、ルーティング タスク用のテーブルとフィルタリング タスク用の別のテーブルがあります。各テーブルにはルールチェーンが含まれています。

使用可能なテーブルは、filter、nat、raw、security、および mangle です。各テーブルには組み込み (ルール) チェーンが含まれています。次のリストは、各テーブルがどのチェーンに含まれるかを示しています。

FILTER INPUT OUTPUT FORWARD
NAT PREROUTING POSTROUTING OUTPUT
RAW PREROUTING OUTPUT
MANGLE PREROUTING POSTROUTING OUTPUT INPUT FORWARD
SECURITY INPUT OUTPUT FORWARD

iptables に実行させたいアクションに応じて、オプション -t に続いてテーブル名を使用してテーブルを指定する必要があります。このチュートリアルでは、オプション -t は使用されません。このチュートリアルでは、オプション -t が渡されない場合にデフォルトで適用されるフィルター テーブルを使用したフィルター処理に焦点を当てます。このチュートリアルを読みながら、上記の概念のいくつかを学びます。

インストールする方法:

Iptables を Debian とそのベースの Linux ディストリビューションにインストールするには、次のコマンドを実行します。

sudo apt install iptables -y

RedHat ベースの Linux ディストリビューションに Iptables をインストールする前に、次のコマンドを実行して Firewalld を無効にする必要があります。

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask --now firewalld

次に、以下を実行して Iptables をインストールします。

sudo yum install iptables-services
sudo systemctl start iptables
sudo systemctl start ip6tables
sudo systemctl enable iptables
sudo systemctl enable ip6tables
sudo systemctl start ip6tables

Iptables の使用を開始する:

開始する前に、-L (-list) パラメーターを使用して既存のポリシーとルールをリストするように iptables に指示し、以前のルールを確認します。

sudo iptables -L

上の出力には、 Chain INPUT、Chain FORWARD、Chain OUTPUT の 3 行が表示されます。 INPUT は受信トラフィックに関するポリシーを指し、OUTPUT は発信トラフィックに適用されるポリシーを指し、FORWARD はルーティング ポリシーを指します。

出力には、定義されたルールがなく、定義されたすべてのポリシーが受け入れられることも示されています。

ポリシーには受け入れ、拒否、 ドロップの 3 種類があります。

ポリシー ACCEPT では接続が許可されます。ポリシー拒否は、エラーを返す接続を拒否します。 DROP ポリシーは、エラーを生成せずに接続を拒否します。
DROP を使用すると、UDP パケットがドロップされ、動作はサービスのないポートに接続した場合と同じになります。 TCP パケットはACK/RST を返します。これは、サービスのない開いたポートが応答するのと同じ応答です。 REJECT を使用すると、ICMP パケットは宛先到達不能を送信元ホストに返します。

Iptables を扱うときは、まずチェーンごとに 3 つのポリシーを定義する必要があります。その後、例外や仕様を追加できます。ポリシーの追加は次のようになります。

sudo iptables -P INPUT         <ACCEPT/DROP/REJECT>
sudo iptables -P OUTPUT     <ACCEPT/DROP/REJECT>
sudo iptables -P FORWARD <ACCEPT/DROP/REJECT>

iptables の許容ポリシーと制限ポリシー:

明示的にドロップまたは拒否する接続を除くすべての受信接続を受け入れることにより、寛容なポリシーで Iptables を適用できます。この場合、特に拒否するルールを定義しない限り、すべての接続が許可されます。

逆に、制限ポリシーでは、特に受け入れた接続を除き、すべての接続が拒否されます。この場合、接続を受け入れるルールを定義しない限り、すべての接続は拒否されます。

Iptables を使用した制限ポリシーの適用:

次の例は、許可されたトラフィックを除くすべての受信トラフィックをドロップすることにより、Iptables で制限ポリシーを適用する方法を示しています。

受信トラフィックをブロックします。

重要: 次の 3 つのルールを適用すると、インターネットに接続できなくなる可能性があります。 「Iptables の追加ルールと Iptables の状態」で説明されているルールを使用して、インターネットへのアクセスを復元するために必要な例外を追加します。 sudo iptables -F を一貫して実行してルールをフラッシュできます。

すべての受信トラフィックをブロックし、送信トラフィックのみが Web および必要なアプリケーションを参照できるようにすることができます。

sudo iptables -P INPUT DROP

sudo iptables -P OUTPUT ACCEPT

sudo iptables -P FORWARD DROP

どこ :

-P=ポリシー

sudo iptables -P INPUT DROP: ソースに応答せずにすべての受信トラフィックを拒否するように iptables に指示します。

sudo iptables -P OUTPUT ACCEPT: 送信トラフィックの ACCEPT ポリシーを定義します。

sudo iptables -P FORWARD DROP: iptables に、別のホスト宛てのすべてのパケット (ファイアウォールで保護されたデバイスを通過しようとする) を応答なしにドロップするルーティング タスクを実行しないように指示します。

上記の例では、Web の閲覧とローカル デバイス (-P OUTPUT ACCEPT) によって開始された接続は許可されますが、ssh などの別のホストによって開始された接続 (-P INPUT DROP) は禁止されます。デバイスにアクセスしようとしてもエラー メッセージが返されません。

前の例のように、制限ポリシーを使用して Iptables を有効にする場合は、ルールを追加して構成を調整する必要があります。たとえば、ループバック (lo) インターフェイスに適切な例外を追加せずに上記の設定を維持すると、一部のアプリケーションが正しく動作しない可能性があります。また、デバイスによって開始された接続に属する、またはそれに関連する受信トラフィックを許可する必要もあります。

iptables 追加ルールと iptables の状態

Iptables は順序に従ってルールを適用することを理解することが重要です。前のルールの後にルールを定義すると、パケットが同じルールに一致する場合、2 番目のルールが最後のルールを書き換えます。

前の例は気に入っています。すべての受信トラフィックをブロックした場合は、ループバック インターフェイスの例外を追加する必要があります。これは、-A (追加) パラメータを追加することで実現できます。

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

モジュール (-m) conntrack –ctstate ESTABLISHED,RELATED は、定義されたルール ポリシーを適用する前に、接続状態が既存の接続に対してESTABLISHED または RELATEDであるかどうかを確認するように Iptables に指示します。

Iptables が確認できる状態は 4 つあります。

iptables 状態は NEW: 許可またはブロックしたパケットまたはトラフィックは、新しい接続の開始を試みます。

iptables 状態 ESTABLISHED: 許可またはブロックしたパケットまたはトラフィックは、確立された接続の一部です。

Iptables 状態 関連: パケットまたはトラフィックは新しい接続を開始しますが、既存の接続に関連しています。

iptables 状態が無効: パケットまたはトラフィックは状態がなければ不明です。

上記の例の最初の行は、デバイスによって開始された接続からのトラフィック、またはデバイスによって開始された接続に関連するトラフィックからの受信パケットを受け入れるように Iptables に指示します。 2 行目は、すでに確立されている接続からの送信トラフィックのみを受け入れるように Iptables に指示します。

ループバック トラフィックを受け入れ、インターフェイスを定義するための iptables Append:

ループバック インターフェイスは、ローカルホストと対話する必要があるプログラムによって使用されます。ループバック トラフィックを許可しない場合、一部のアプリケーションが動作しなくなる可能性があります。

次のコマンドはループバック接続を許可します。

sudo iptables -A INPUT -i lo -j ACCEPT

sudo iptables -A OUTPUT -o lo -j ACCEPT

ここで、-i と -o は、受信トラフィック (-i) と送信トラフィック (-o) のネットワーク デバイスを指定するために使用されます。

Iptables を使用して寛容なポリシーを適用する:

指定したドロップまたは拒否されたトラフィックを除くすべてのトラフィックを許可する寛容なポリシーを定義することもできます。特定の IP または IP 範囲を除くすべてを有効にすることも、ヘッダーに基づいてパケットを拒否することもできます。

次の例は、ssh サービスに対してブロックされた IP 範囲を除くすべてのトラフィックを許可する寛容ポリシーを適用する方法を示しています。

sudo iptables -P INPUT ACCEPT

sudo iptables -P OUTPUT ACCEPT

sudo iptables -P FORWARD DROP

sudo iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.1.100-192.168.1.110 -j REJECT

上記の例では、許容ポリシーを適用しますが、192.168.1.100 と 192.168.1.110 の範囲に属するすべての IP への SSH アクセスをブロックします。

-p はプロトコルを指定し、-dport (または -destination-port) は宛先ポート (22,ssh) を指定し、引数 -src-range (送信元範囲) を伴うモジュール iprange を使用すると IP 範囲を定義できます。オプション -j (–jump) は、iptables にパケットの処理方法を指示します。この場合は REJECT を表します。

Iptables によるポートのブロック

次の例は、すべての接続に対して特定のポート (ssh ポート) をブロックする方法を示しています。

sudo iptables -A INPUT -p tcp --destination-port 22 -j DROP

Iptables の変更を保存する

iptables ルールは永続的ではありません。再起動後、ルールは復元されません。ルールを永続的にするには、次のコマンドを実行します。最初の行ではルールをファイル /etc/iptables.up.rules に保存し、2 行目では再起動後に iptables を起動するためのファイルを作成します。

sudo  iptables-save > /etc/iptables.up.rules

nano /etc/network/if-pre-up.d/iptables

以下をファイルに追加し、変更の保存を閉じます (CTRL+X)。

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules

最後に、次のコマンドを実行してファイルに実行権限を与えます。

chmod +x /etc/network/if-pre-up.d/iptables

Iptables ルールのフラッシュまたは削除:

次のコマンドを実行すると、すべての Iptables ルールを削除できます。

sudo iptables -F

INPUT などの特定のチェーンを削除するには、次のコマンドを実行します。

sudo iptables -F

結論:

iptables は、市場で最も洗練され、柔軟なファイアウォールの 1 つです。置き換えられたにもかかわらず、最も普及している防御およびルーティング ソフトウェアの 1 つとして残っています。

その実装は、TCP/IP の基本知識を持つ新しい Linux ユーザーであればすぐに学ぶことができます。ユーザーが構文を理解すると、ルールの定義は簡単な作業になります。

この入門チュートリアルではカバーされていない追加のモジュールやオプションがさらにたくさんあります。その他の iptables の例は、初心者向けの Iptables でご覧いただけます。

この Iptables チュートリアルがお役に立てば幸いです。さらに多くの Linux のヒントやチュートリアルについては、Linux ヒントに従ってください。