Iptablesファイアウォールルールを一覧表示および削除する方法
序章
Iptablesは、ほとんどのLinuxシステムのネットワークセキュリティで重要な役割を果たすファイアウォールです。 多くのiptablesチュートリアルでは、サーバーを保護するためのファイアウォールルールの作成方法を説明していますが、これはファイアウォール管理の別の側面であるルールの一覧表示と削除に焦点を当てています。
このチュートリアルでは、次のiptablesタスクを実行する方法について説明します。
- リストルール
- パケットおよびバイトカウンターのクリア
- ルールを削除する
- チェーンをフラッシュする(チェーン内のすべてのルールを削除する)
- すべてのチェーンとテーブルをフラッシュし、すべてのチェーンを削除して、すべてのトラフィックを受け入れます
注:ファイアウォールを使用する場合は、SSHトラフィック(デフォルトではポート:22
)をブロックして、自分のサーバーから自分をロックアウトしないように注意してください。 ファイアウォールの設定が原因でアクセスできなくなった場合は、アクセスを修正するために帯域外コンソールを介してファイアウォールに接続する必要がある場合があります。
前提条件
このチュートリアルでは、iptables
コマンドがインストールされたLinuxサーバーを使用しており、ユーザーがsudo
権限を持っていることを前提としています。
この初期設定についてサポートが必要な場合は、 Ubuntu20.04を使用した初期サーバー設定ガイドを参照してください。 DebianおよびCentOSでも利用できます。
仕様によるリストルール
最初にルールをリストする方法を見てみましょう。 アクティブなiptablesルールを表示するには、テーブル内またはルール仕様のリストとして2つの方法があります。 どちらの方法でも、ほぼ同じ情報が異なる形式で提供されます。
すべてのアクティブなiptablesルールを仕様別に一覧表示するには、-S
オプションを指定してiptables
コマンドを実行します。
sudo iptables -S
Output-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
など)に制限する場合は、[の直後にチェーン名を指定できます。 X147X]オプション。 たとえば、TCP
チェーンのすべてのルール仕様を表示するには、次のコマンドを実行します。
sudo iptables -S TCP
Output-N TCP -A TCP -p tcp -m tcp --dport 22 -j ACCEPT
次に、アクティブなiptablesルールをルールのテーブルとして表示する別の方法を見てみましょう。
ルールをテーブルとしてリストする
テーブルビューにiptablesルールを一覧表示すると、さまざまなルールを相互に比較するのに役立ちます。 テーブル内のすべてのアクティブなiptablesルールを出力するには、-L
オプションを指定してiptables
コマンドを実行します。
sudo iptables -L
これにより、チェーンでソートされた現在のすべてのルールが出力されます。
出力を特定のチェーン(INPUT
、OUTPUT
、TCP
など)に制限する場合は、[の直後にチェーン名を指定できます。 X147X]オプション。
INPUT
チェーンの例を見てみましょう。
sudo iptables -L INPUT
OutputChain 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
)が続きます。 次の行は、テーブルの各列のヘッダーで構成され、その後にチェーンのルールが続きます。 各ヘッダーが何を示しているかを見てみましょう。
target
:パケットがルールに一致する場合、ターゲットはそれをどのように処理するかを指定します。 たとえば、パケットを受け入れたり、ドロップしたり、ログに記録したり、別のチェーンに送信して、他のルールと比較したりできます。prot
:tcp
、udp
、icmp
、all
などのプロトコルopt
:めったに使用されません。この列はIPオプションを示しますsource
:トラフィックの送信元IPアドレスまたはサブネット、またはanywhere
destination
:トラフィックの宛先IPアドレスまたはサブネット、またはanywhere
ラベルが付いていない最後の列は、ルールのオプションを示しています。 これは、前の列で示されていないルールの一部です。 これは、送信元ポートと宛先ポートからパケットの接続状態まで、何でもかまいません。
パケット数と集計サイズの表示
iptablesルールを一覧表示するときに、特定の各ルールに一致したパケットの数とパケットの合計サイズをバイト単位で表示することもできます。 これは、どのルールがパケットと一致しているかを大まかに把握しようとするときに役立つことがよくあります。 これを行うには、-L
オプションと-v
オプションを一緒に使用します。
たとえば、-v
オプションを使用して、INPUT
チェーンをもう一度見てみましょう。
sudo iptables -L INPUT -v
OutputChain 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
リストには、pkts
とbytes
の2つの追加列があることに注意してください。
さまざまな方法でアクティブなファイアウォールルールを一覧表示する方法がわかったので、パケットカウンターとバイトカウンターをリセットする方法を見てみましょう。
パケット数と集計サイズのリセット
ルールのパケットカウンターとバイトカウンターをクリアまたはゼロにする場合は、-Z
オプションを使用します。 また、再起動が発生した場合にもリセットされます。 これは、サーバーが既存のルールに一致する新しいトラフィックを受信しているかどうかを確認する場合に役立ちます。
すべてのチェーンとルールのカウンターをクリアするには、-Z
オプションを単独で使用します。
sudo iptables -Z
特定のチェーン内のすべてのルールのカウンターをクリアするには、-Z
オプションを使用して、チェーンを指定します。 たとえば、INPUT
チェーンカウンターをクリアするには、次のコマンドを実行します。
sudo iptables -Z INPUT
特定のルールのカウンターをクリアする場合は、チェーン名とルール番号を指定します。 たとえば、INPUT
チェーンの最初のルールのカウンターをゼロにするには、次のように実行します。
sudo iptables -Z INPUT 1
iptablesのパケットとバイトカウンターをリセットする方法がわかったので、それらを削除するために使用できる2つの方法を見てみましょう。
仕様によるルールの削除
iptablesルールを削除する方法の1つは、ルールの指定によるものです。 これを行うには、iptables
コマンドを、-D
オプションの後にルール指定を指定して実行します。 この方法を使用してルールを削除する場合は、ルールリストの出力iptables -S
を使用してください。
たとえば、無効な着信パケットをドロップするルール(-A INPUT -m conntrack --ctstate INVALID -j DROP
)を削除する場合は、次のコマンドを実行できます。
sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
ここでは、作成時にルールの位置を示すために使用される-A
オプションを除外する必要があることに注意してください。
チェーンと番号によるルールの削除
iptablesルールを削除するもう1つの方法は、チェーンと行番号です。 ルールの行番号を決定するには、ルールを表形式でリストし、--line-numbers
オプションを追加します。
sudo iptables -L --line-numbers
OutputChain 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 INPUT 3
個々のファイアウォールルールを削除する方法がわかったので、ルールのチェーンをフラッシュする方法を見ていきましょう。
フラッシングチェーン
Iptablesは、チェーン内のすべてのルールを削除する方法、またはチェーンをフラッシュする方法を提供します。 このセクションでは、これを行うためのさまざまな方法について説明します。
警告:デフォルトのポリシーdrop
またはdeny
でチェーンをフラッシュすることにより、SSH経由でサーバーから自分自身をロックアウトしないように注意してください。 その場合、アクセスを修正するためにコンソールを介して接続する必要がある場合があります。
シングルチェーンのフラッシング
チェーン内のすべてのルールを削除する特定のチェーンをフラッシュするには、-F
または同等の--flush
オプションと、フラッシュするチェーンの名前を使用できます。
たとえば、INPUT
チェーン内のすべてのルールを削除するには、次のコマンドを実行します。
sudo iptables -F INPUT
すべてのチェーンをフラッシュする
すべてのファイアウォールルールを削除するすべてのチェーンをフラッシュするには、-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の変更は一時的なものであり、サーバーの再起動後も保持するために保存する必要があることに注意してください。 これについては、一般的なファイアウォールのルールとコマンドのチュートリアルのルールの保存セクションで説明されています。