はじめに

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

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

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

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

前提条件

iptables illustration for: 前提条件

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

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

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

仕様によるルールの一覧表示

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

				
					
sudo iptables -S

				
			
				
					
[secondary_label 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ルールの設定ファイルにも似ています。

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

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

				
					
sudo iptables -S <^>TCP<^>

				
			
				
					
[secondary_label Output]

-N TCP

-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

				
			

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

ルールをテーブルとして一覧表示する

テーブルビューにiptablesルールを一覧表示すると、さまざまなルールを相互に比較するのに役立ちます。

すべてのアクティブなiptablesのルールをテーブル内に出力するには、-Lオプションを使用して次のiptablesコマンドを実行します。

				
					
sudo iptables -L

				
			

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

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

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

				
					
sudo iptables -L <^>INPUT<^>

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

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

パケットカウンタと合計サイズを表示する

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

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

				
					
sudo iptables -L <^>INPUT<^> -v

				
			
				
					
[secondary_label 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

				
			

この一覧表には、pkts、およびbytesの2つの列が追加されていることに注意してください。

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

パケットカウンタと合計サイズをリセットする

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

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

				
					
sudo iptables -Z

				
			

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

				
					
sudo iptables -Z INPUT

				
			

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

				
					
sudo iptables -Z INPUT 1

				
			

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

仕様によるルールの削除

iptablesルールを削除する方法の1つとして、ルールの仕様別によるものがあります。これを行うには、-Dオプションの後にルールを指定して、iptablesコマンドを実行します。この方法を使用してルールを削除する場合は、ルールリストの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

				
			
				
					
[secondary_output 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であることが確認できます。したがって、次のコマンドを実行する必要があります。

				
					
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つのデフォルトチェーン(INPUTFORWARD、およびOUTPUT)のみがそのまま表示されています。

まとめ

このチュートリアルを終えたことで、iptablesファイアウォールルールの一覧表示と削除方法が理解できました。

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