序章

Iptablesは、ほとんどのLinuxシステムのネットワークセキュリティで重要な役割を果たすファイアウォールです。 多くのiptablesチュートリアルでは、サーバーを保護するためのファイアウォールルールの作成方法を説明していますが、これはファイアウォール管理の別の側面であるルールの一覧表示と削除に焦点を当てています。

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

  • リストルール
  • パケットおよびバイトカウンターのクリア
  • ルールを削除する
  • チェーンをフラッシュする(チェーン内のすべてのルールを削除する)
  • すべてのチェーンとテーブルをフラッシュし、すべてのチェーンを削除して、すべてのトラフィックを受け入れます

注:ファイアウォールを使用する場合は、SSHトラフィック(デフォルトではポート:22)をブロックして、自分のサーバーから自分をロックアウトしないように注意してください。 ファイアウォールの設定が原因でアクセスできなくなった場合は、アクセスを修正するために帯域外コンソールを介してファイアウォールに接続する必要がある場合があります。

前提条件

このチュートリアルでは、iptablesコマンドがインストールされたLinuxサーバーを使用しており、ユーザーがsudo権限を持っていることを前提としています。

この初期設定についてサポートが必要な場合は、 Ubuntu20.04を使用した初期サーバー設定ガイドを参照してください。 DebianおよびCentOSでも利用できます。

仕様によるリストルール

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

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

  1. 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ルール構成ファイルに似ています。

特定のチェーンの一覧表示

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

  1. sudo iptables -S TCP
Output
-N TCP -A TCP -p tcp -m tcp --dport 22 -j ACCEPT

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

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

テーブルビューにiptablesルールを一覧表示すると、さまざまなルールを相互に比較するのに役立ちます。 テーブル内のすべてのアクティブなiptablesルールを出力するには、-Lオプションを指定してiptablesコマンドを実行します。

  1. sudo iptables -L

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

出力を特定のチェーン(INPUTOUTPUTTCPなど)に制限する場合は、[の直後にチェーン名を指定できます。 X147X]オプション。

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

  1. sudo iptables -L INPUT
Output
Chain 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:パケットがルールに一致する場合、ターゲットはそれをどのように処理するかを指定します。 たとえば、パケットを受け入れたり、ドロップしたり、ログに記録したり、別のチェーンに送信して、他のルールと比較したりできます。
  • prottcpudpicmpallなどのプロトコル
  • opt:めったに使用されません。この列はIPオプションを示します
  • source:トラフィックの送信元IPアドレスまたはサブネット、またはanywhere
  • destination:トラフィックの宛先IPアドレスまたはサブネット、またはanywhere

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

パケット数と集計サイズの表示

iptablesルールを一覧表示するときに、特定の各ルールに一致したパケットの数とパケットの合計サイズをバイト単位で表示することもできます。 これは、どのルールがパケットと一致しているかを大まかに把握しようとするときに役立つことがよくあります。 これを行うには、-Lオプションと-vオプションを一緒に使用します。

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

  1. sudo iptables -L INPUT -v
Output
Chain 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

リストには、pktsbytesの2つの追加列があることに注意してください。

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

パケット数と集計サイズのリセット

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

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

  1. sudo iptables -Z

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

  1. sudo iptables -Z INPUT

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

  1. sudo iptables -Z INPUT 1

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

仕様によるルールの削除

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

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

  1. sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP

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

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

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

  1. sudo iptables -L --line-numbers
Output
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であることがわかります。 したがって、次のコマンドを実行する必要があります。

  1. sudo iptables -D INPUT 3

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

フラッシングチェーン

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

警告:デフォルトのポリシーdropまたはdenyでチェーンをフラッシュすることにより、SSH経由でサーバーから自分自身をロックアウトしないように注意してください。 その場合、アクセスを修正するためにコンソールを介して接続する必要がある場合があります。

シングルチェーンのフラッシング

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

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

  1. sudo iptables -F INPUT

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

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

  1. sudo iptables -F

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

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

警告:これにより、ファイアウォールが効果的に無効になります。 ファイアウォールの構成を最初からやり直す場合にのみ、このセクションに従う必要があります。

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

  1. sudo iptables -P INPUT ACCEPT
  2. sudo iptables -P FORWARD ACCEPT
  3. sudo iptables -P OUTPUT ACCEPT

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

  1. sudo iptables -t nat -F
  2. sudo iptables -t mangle -F
  3. sudo iptables -F
  4. sudo iptables -X

これで、ファイアウォールがすべてのネットワークトラフィックを許可します。 ここでルールをリストすると、ルールがなく、3つのデフォルトチェーン(INPUTFORWARD、およびOUTPUT)のみが残っていることがわかります。

結論

このチュートリアルを終えた後、iptablesファイアウォールルールを一覧表示および削除する方法を確認しました。

iptablesコマンドによるiptablesの変更は一時的なものであり、サーバーの再起動後も保持するために保存する必要があることに注意してください。 これについては、一般的なファイアウォールのルールとコマンドのチュートリアルのルールの保存セクションで説明されています。