前書き

Iptablesは、ほとんどのLinuxシステムのネットワークセキュリティで重要な役割を果たすファイアウォールです。 多くのiptablesチュートリアルがhttps://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands [サーバーを保護するためのファイアウォールルールの作成方法]を教えますが、このチュートリアルでは焦点を当てますファイアウォール管理の別の側面:ルールの一覧表示と削除。

このチュートリアルでは、次のiptablesタスクの実行方法について説明します。

  • リスト規則

  • パケットおよびバイトカウンターのクリア

  • ルールを削除

  • チェーンのフラッシュ(チェーン内のすべてのルールを削除)

  • すべてのチェーンとテーブルをフラッシュし、すべてのチェーンを削除し、すべてのトラフィックを受け入れます

前提条件

このチュートリアルの使用を開始する前に、サーバー上に別の非ルートスーパーユーザーアカウント(sudo権限を持つユーザー)を設定する必要があります。 これを設定する必要がある場合は、適切なガイドに従ってください。

最初にルールをリストする方法を見てみましょう。 アクティブなiptablesルールを表示するには、2つの異なる方法があります。1つはテーブルで、もう1つはルール仕様のリストです。 どちらの方法でも、ほぼ同じ情報が異なる形式で提供されます。

仕様ごとのルールのリスト

すべてのアクティブなiptablesルールを仕様別に一覧表示するには、 `+ -S `オプションを指定して ` iptables +`コマンドを実行します。

sudo iptables -S
Example: Rule Specification Listing-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N ICMP
-N TCP
-N UDP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

ご覧のとおり、出力は、前の `+ iptables `コマンドなしで、作成に使用されたコマンドのように見えます。 これは、 ` iptables-persistent `または ` iptables save +`を使用したことがある場合、iptablesルール設定ファイルに似ています。

特定のチェーンのリスト

出力を特定のチェーン( + INPUT、` + OUTPUT`、 + TCP`など)に制限する場合は、 + -S + `オプションの直後にチェーン名を指定できます。 たとえば、すべてのルール仕様を `+ TCP +`チェーンで表示するには、次のコマンドを実行します。

sudo iptables -S
Example: TCP Chain Rule Specification Listing-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

アクティブなiptablesルールをルールの表として表示する別の方法を見てみましょう。

ルールをテーブルとしてリストする

テーブルビューでiptablesルールをリストすると、異なるルールを相互に比較するのに役立ちます。

すべてのアクティブなiptablesルールをテーブルに出力するには、 `+ -L `オプションを指定して ` iptables +`コマンドを実行します:

sudo iptables -L

これにより、現在のすべてのルールがチェーン順にソートされて出力されます。

出力を特定のチェーン( + INPUT、` + OUTPUT`、 + TCP`など)に制限する場合は、 + -L + `オプションの直後にチェーン名を指定できます。

INPUTチェーンの例を見てみましょう。

sudo iptables -L
Example: Input Chain Rule Table ListingChain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere             ctstate INVALID
UDP        udp  --  anywhere             anywhere             ctstate NEW
TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
ICMP       icmp --  anywhere             anywhere             ctstate NEW
REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable

出力の最初の行は、チェーン名(この場合はINPUT)を示し、その後にデフォルトポリシー(DROP)が続きます。 次の行は、表の各列のヘッダーで構成され、その後にチェーンのルールが続きます。 各ヘッダーが示す内容を見ていきましょう。

  • ターゲット:パケットがルールに一致する場合、ターゲットはそれで何をすべきかを指定します。 たとえば、パケットを受け入れたり、ドロップしたり、ログに記録したり、別のチェーンに送信して、より多くのルールと比較したりできます。

  • * prot *:「+ tcp 」、「 udp 」、「 icmp 」、「 all +」などのプロトコル

  • * opt *:ほとんど使用されません。この列はIPオプションを示します

  • * source *:トラフィックのソースIPアドレスまたはサブネット、または + anywhere +

  • * destination *:トラフィックの宛先IPアドレスまたはサブネット、または + anywhere +

ラベルが付いていない最後の列は、ルールの*オプション*を示しています。 つまり、前の列で示されていないルールの部分。 これは、送信元ポートと宛先ポートから、パケットの接続状態まで、何でもかまいません。

パケット数と集約サイズを表示する

iptablesルールをリストするとき、各特定のルールに一致したパケットの数、およびパケットの合計サイズ(バイト単位)を表示することもできます。 これは、どのルールがパケットと一致しているかの大まかなアイデアを取得しようとする場合に役立ちます。 そのためには、単に「+ -L 」オプションと「 -v +」オプションを一緒に使用します。

たとえば、 `+ -v +`オプションを使用してINPUTチェーンをもう一度見てみましょう。

sudo iptables -L  -v
Example: Verbose ListingChain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
284K   42M ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
   0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
   0     0 DROP       all  --  any    any     anywhere             anywhere             ctstate INVALID
 396 63275 UDP        udp  --  any    any     anywhere             anywhere             ctstate NEW
17067 1005K TCP        tcp  --  any    any     anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
2410  154K ICMP       icmp --  any    any     anywhere             anywhere             ctstate NEW
 396 63275 REJECT     udp  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable
2916  179K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-proto-unreachable
   0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED

リストには、2つの追加列、「+ pkts 」と「 bytes +」が追加されています。

アクティブなファイアウォールルールをさまざまな方法でリストする方法がわかったので、パケットカウンターとバイトカウンターをリセットする方法を見てみましょう。

パケットカウントと集計サイズのリセット

ルールのパケットカウンターとバイトカウンターをクリアまたはゼロにする場合は、 `+ -Z +`オプションを使用します。 また、再起動が発生するとリセットされます。 これは、サーバーが既存のルールに一致する新しいトラフィックを受信して​​いるかどうかを確認する場合に役立ちます。

すべてのチェーンとルールのカウンターをクリアするには、単独で `+ -Z +`オプションを使用します:

sudo iptables -Z

特定のチェーンのすべてのルールのカウンターをクリアするには、「+-Z +」オプションを使用してチェーンを指定します。 たとえば、INPUTチェーンカウンターをクリアするには、次のコマンドを実行します。

sudo iptables -Z INPUT

特定のルールのカウンターをクリアする場合は、チェーン名とルール番号を指定します。 たとえば、INPUTチェーンの最初のルールのカウンターをゼロにするには、次を実行します。

sudo iptables -Z INPUT 1

iptablesパケットとバイトカウンターをリセットする方法がわかったので、それらを削除するために使用できる2つの方法を見てみましょう。

仕様によるルールの削除

iptablesルールを削除する方法の1つは、ルール仕様によるものです。 そのためには、 `+ -D `オプションの後にルール仕様を指定して ` iptables `コマンドを実行します。 この方法を使用してルールを削除する場合は、ルールリストの出力である ` iptables -S +`を使用してください。

たとえば、無効な着信パケットを破棄するルールを削除する場合( + -A INPUT -m conntrack --ctstate INVALID -j DROP +)、次のコマンドを実行できます。

sudo iptables -D

ここで、作成時のルールの位置を示すために使用される「+ -A +」オプションを除外する必要があることに注意してください。

チェーンと番号によるルールの削除

iptablesルールを削除するもう1つの方法は、*チェーン*と*行番号*です。 ルールの行番号を決定するには、テーブル形式でルールをリストし、 `+-line-numbers +`オプションを追加します。

sudo iptables -L --line-numbers
[secondary_output Example Output: Rules with Line Numbers]
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  anywhere             anywhere
3    DROP       all  --  anywhere             anywhere             ctstate INVALID
4    UDP        udp  --  anywhere             anywhere             ctstate NEW
5    TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
6    ICMP       icmp --  anywhere             anywhere             ctstate NEW
7    REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
8    REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
9    REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable
10   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED
...

これにより、* num *ヘッダーで示される各ルール行に行番号が追加されます。

削除するルールがわかったら、ルールのチェーンと行番号を書き留めます。 次に、 `+ iptables -D +`コマンドに続けてチェーンとルール番号を実行します。

たとえば、無効なパケットをドロップする入力ルールを削除する場合、「+ INPUT 」チェーンのルール「+3」であることがわかります。 したがって、次のコマンドを実行する必要があります。

sudo iptables -D

個々のファイアウォールルールを削除する方法がわかったので、ルールのチェーンを*フラッシュ*する方法を見ていきましょう。

フラッシュチェーン

Iptablesは、チェーン内のすべてのルールを削除する方法、またはチェーンを*フラッシュ*する方法を提供します。 このセクションでは、これを行うためのさまざまな方法について説明します。

シングルチェーンをフラッシュする

チェーン内のすべてのルールを削除する特定のチェーンをフラッシュするには、 `+ -F `または同等の `-flush +`オプションとフラッシュするチェーンの名前を使用できます。

たとえば、 `+ INPUT +`チェーンのすべてのルールを削除するには、次のコマンドを実行します。

sudo iptables -F

すべてのチェーンをフラッシュ

すべてのファイアウォールルールを削除するすべてのチェーンをフラッシュするには、 `+ -F `または同等の `-flush +`オプションを単独で使用できます。

sudo iptables -F

すべてのルールをフラッシュ、すべてのチェーンを削除、すべてを受け入れる

このセクションでは、すべてのファイアウォールルール、テーブル、およびチェーンをフラッシュし、すべてのネットワークトラフィックを許可する方法を示します。

まず、各組み込みチェーンのデフォルトポリシーを `+ ACCEPT +`に設定します。 これを行う主な理由は、SSHを介してサーバーからロックアウトされないようにするためです。

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

次に、 + nat +`および `+ mangle +`テーブルをフラッシュし、すべてのチェーン( `+ -F +)をフラッシュし、デフォルト以外のチェーンをすべて削除します( + -X +):

sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X

これで、ファイアウォールはすべてのネットワークトラフィックを許可します。 ここでルールをリストすると、何も表示されず、3つのデフォルトチェーン(INPUT、FORWARD、およびOUTPUT)のみが残ります。

結論

このチュートリアルを終えた後、iptablesファイアウォールルールを一覧表示および削除する方法を理解する必要があります。

`+ iptables +`コマンドによるiptablesの変更は一時的なものであり、サーバーを再起動しても保持されるように保存する必要があることに注意してください。 これについては、共通ファイアウォールルールとコマンドチュートリアルのhttps://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands#saving-rules [ルールの保存セクション]で説明されています。