はじめに
Iptablesは、ほとんどのLinuxシステムのネットワークセキュリティで重要な役割を果たすファイアウォールです。多くのiptablesチュートリアルでは、サーバーをセキュリティ保護するためのファイアウォールルールの作成方法について説明しますが、これはファイアウォール管理の異なる側面(ルールの一覧表示と削除)に焦点を当てます。
このチュートリアルでは、次のiptablesタスクの実行方法について説明します。
- ルールの一覧表示
- パケットおよびバイトカウンタのクリア
- ルールの削除
- チェーンのフラッシュ(チェーン内のすべてのルールの削除)
- すべてのチェーンとテーブルをフラッシュし、すべてのチェーンの削除と、すべてのトラフィックの受け入れ
注:ファイアウォールを使用する場合、SSHトラフィック(デフォルトではポート22)をブロックして、独自のサーバーから自分自身をロックアウトしないように注意してください。ファイアウォールの設定によりアクセスができない場合は、アクセスを修正するためにアウトオブバンドのコンソールを介して接続が必要な場合があります。
前提条件
このチュートリアルでは、iptables
コマンドがインストールされたLinuxサーバーを使用しており、ユーザーがsudo
権限を持っていることを前提としています。
この初期設定についてサポートが必要な場合は、Ubuntu 20.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
など)に制限する場合は、-S
オプションの直後にチェーン名を指定することができます。たとえば、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
など)に制限する場合は、-L
オプションの直後にチェーン名を指定することができます。
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
:パケットがルールに一致する場合、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チェーンの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つのデフォルトチェーン(INPUT
、FORWARD
、およびOUTPUT
)のみがそのまま表示されています。
まとめ
このチュートリアルを終えたことで、iptablesファイアウォールルールの一覧表示と削除方法が理解できました。
iptables
コマンドによるiptablesの変更は一時的なものであり、サーバーの再起動後も持続するためには保存する必要があることに注意してください。これについては、一般的なファイアウォールルールとコマンドチュートリアルのルールの保存セクションで説明しています。