ウェブサイト検索

Ubuntu iptables: iptables を使用してネットワーク トラフィックを制御する方法?


「…システム管理者がカーネルのネット フィルタ モジュールによって実装される IP パケット フィルタリング ルールを構成できるようにするユーザー空間 Unix ユーティリティ。 」iptables は、IP アドレス、ポート、プロトコルなどのさまざまな基準に基づいてパケット フィルタリング ルールを使用してファイアウォールとして機能します。

このガイドでは、ネットワークを保護するために Ubuntu システムで iptables ルールを構成および使用する方法について説明します。あなたが初心者の Linux ユーザーであっても、熟練したシステム管理者であっても、このガイドから何らかの形で iptables について役立つことを学ぶことができます。

iptables は、Ubuntu およびほとんどの Debian ベースのディストリビューションにプリインストールされています。 Ubuntu には、iptables を操作するために使用できるグラフィカルな代替手段である GUFW ファイアウォールもパッケージ化されています。

注: iptables を使用および構成するには、システムに対する sudo 権限が必要です。 sudo について詳しくは、次のチュートリアルをご覧ください。

Iptables とは何かを理解したところで、早速見ていきましょう!

iptables を使用して IPv4 トラフィックを管理する方法?

IPv4 ネットワークとトラフィック管理に Iptables を使用するには、次のことを理解する必要があります。

Iptables コマンド

iptables には、iptables ルールをカスタマイズおよび調整できるオプションの選択肢が用意されています。これらのパラメータのいくつかについて説明し、それらが何をするのかを見てみましょう。

注: iptables チェーンと呼ばれる、特定のサブセットを管理する一連のルールを構成できます。

iptables パラメータ

iptables ルールの作成と構成を開始する前に、まず一般的な構文やデフォルト引数などの iptables の基本を理解しましょう。

以下のコマンドを考えてみましょう。

sudo iptables -I INPUT -s 192.168.0.24 -j DROP

上記のコマンドは、チェーン内にルールを作成するように iptables に指示します。このルールは、IP アドレス 192.168.0.24 からのすべてのパケットをドロップします。

より深く理解するために、コマンドを 1 行ずつ調べてみましょう。

  • 最初のコマンド iptables は、iptables コマンドライン ユーティリティを呼び出します。

  • 次に、挿入に使用される -I 引数です。挿入引数は iptables チェーンの先頭にルールを追加するため、より高い優先順位が割り当てられます。チェーン内の特定の番号にルールを追加するには、-I 引数の後にルールを割り当てる番号を使用します。

  • -s 引数はソースを指定するのに役立ちます。したがって、-s 引数の後に IP アドレスを指定します。

  • iptables の -j パラメータは、特定のターゲットへのジャンプを指定します。このオプションは、一致するパケットがあった場合に Iptable が実行するアクションを設定します。 iptables はデフォルトで 4 つの主要なターゲットを提供します。これらには、ACCEPT、DROP、LOG、および REJECT が含まれます。

iptables は、さまざまなルールの構成に使用できるパラメーターの選択肢を提供します。 iptables ルールの構成に使用できるさまざまなパラメータには次のものがあります。

-p –protocol

接続プロトコルを指定します。たとえば、TCP、UDP など。

-d –destination

宛先をアドレス、ネットワーク名、またはホスト名で指定します。

-j –jump

iptables がパケットを見つけた後に実行するアクションを設定します。

-o –out-interface

iptable がパケットを送信するインターフェイスを設定します。

-i –in-interface

ネットワークパケットの確立に使用するインターフェースを設定します。

-c –set-counters

管理者は、指定されたルールのバイト カウンタとパケット カウンタを設定できます。

-g –goto chain

このパラメータは、戻ったときにユーザー設定のチェーンで処理を続行することを指定します。

-f –fragment

フラグメント化されたパケットの 2 番目以降のフラグメントにのみルールを適用するように iptables に指示します。

Iptables オプション

iptables コマンドは、幅広いオプションをサポートしています。一般的なものには次のようなものがあります。

-D –delete

指定されたチェーンからルールを削除します

-F –flush

すべてのルールを一度に 1 つずつ削除します

-L –list

指定されたチェーン内のすべてのルールを表示します

-I –insert

指定されたチェーンにルールを挿入します (番号が指定されていない場合は番号として渡され、ルールは先頭に追加されます)

-C –check

ルールの一致をクエリします。指定されたルールの要件

-v –verbose

-L パラメーターとともに使用すると、詳細が表示されます。

-N –new-chain <name>

新しいユーザー定義チェーンを追加します

-X –delete-chain <name>

特定のユーザー定義チェーンを削除します

Iptables テーブル

Linux カーネルには、関連するルールのセットを格納するデフォルトのテーブルがあります。これらのデフォルト テーブルには一連のデフォルト チェーンがありますが、ユーザーはユーザー定義ルールを追加することでルールをカスタマイズできます。

注: デフォルトのテーブルは、カーネル構成とインストールされているモジュールに大きく依存します。

デフォルトの iptables テーブルは次のとおりです。

1: フィルターテーブル

フィルタ テーブルは、ネットワーク パケット フィルタリングに使用されるチェーンを含むデフォルトのテーブルです。この表のデフォルト チェーンの一部は次のとおりです。

Chain Description
Input Iptables use this chain for any incoming packets to the system, i.e., packets going to local network sockets.
Output Iptables use the output chain for locally generated packets, i.e., packets going out of the system.
Forward This chain is what the Iptables use for packets routed or forwarded via the system.

2: NAT テーブル

NAT またはネットワーク アドレス テーブルは、ネットワーク パケット内のソースおよびターゲット IP アドレスを変更するために使用されるルーティング デバイスです。 NAT テーブルの主な用途は、プライベート アドレス範囲内の 2 つのネットワークをパブリック ネットワークに接続することです。

NAT は、実際の IP アドレスのマスキングをサポートするために開発され、プライベート IP アドレス範囲が外部ネットワークに到達することを許可します。これは、内部ネットワークに関する詳細がパブリック ネットワークに公開されるのを防ぐのに役立ちます。

NAT テーブルは、パケットが新しい接続を開始するときに使用されます。

iptables には、NAT アドレス指定用のデフォルトのテーブルがあります。このテーブルには 3 つの主要なチェーンがあります。

Chain Description
PREROUTING Allows the modification of packet information before arriving in the INPUT chain—used for incoming packets
OUTPUT Reserved for packets created locally, i.e., before network routing occurs
POSTROUTING Allows the modification of outgoing packets— Packets leaving the OUTPUT chain

以下の図は、このプロセスの概要を示しています。

NAT ルーティング テーブルを表示するには、次のコマンドを使用します。

iptables -t nat -n -v -L

3: マングルテーブル

マングル テーブルは主にパケットの特別な変更に使用されます。簡単に言えば、ネットワーク パケットの IP ヘッダーを変更するために使用されます。パケットの変更には、パケットの TTL 値の変更、パケットの有効なネットワーク ホップの変更などが含まれます。

テーブルには次のデフォルトのチェーンが含まれています。

POSTROUTING

送信パケットに使用されます

INPUT

サーバーに直接受信するパケットに使用されます

OUTPUT

ローカルパケットに使用されます

Forward

システムを介してルーティングされるパケット用に予約されています

4: 生のテーブル

生のテーブルの主な目的は、追跡システムによる処理を意図していないパケットの例外を構成することです。生のテーブルはパケットに NOTRACK マークを設定し、conntrack 機能にパケットを無視するように促します。

Conntrack は、Linux カーネルがすべてのネットワーク接続を追跡できるようにする Linux カーネル ネットワーキング機能で、カーネルがネットワーク フローを構成するパケットを識別できるようにします。

生のテーブルには 2 つのメイン チェーンがあります。

Chain Description
PREROUTING Reserved for packets received by network interfaces
OUTPUT Reserved for packets initiated by local processes

5: セキュリティテーブル

このテーブルの主な用途は、パケットにマークを付ける内部 Security Enhancement for Linux (SELinux) セキュリティ メカニズムを設定することです。セキュリティ マークは、接続またはパケットごとに適用できます。

これは、必須アクセス制御ルールに使用され、フィルター テーブルの後にアクセスされる 2 番目のテーブルです。次のデフォルトのチェーンが提供されます。

Chain Description
INPUT Reserved for incoming packets to the system
OUTPUT Used for locally created packets
FORWARD Used for packets routed through the system

デフォルトの iptables を確認したので、さらに一歩進んで、iptables ルールを操作する方法について説明します。

iptables ルールを使用するにはどうすればよいですか?

iptables ルールは昇順で適用されます。これは、特定のセットの最初のルールが最初に適用され、次に 2 番目、次に 3 番目というように最後まで適用されることを意味します。

この機能のため、iptables では、-A パラメーターを使用してセットにルールを追加することができません。 -I を使用し、その後に番号を入力するか、空にしてリストの先頭に追加する必要があります。

Iptable の表示

iptables を表示するには、IPv4 の場合はコマンド iptables -L -v を使用し、IPv6 の場合は ip6tables -L -v を使用します。

ルールの挿入

セットにルールを挿入するには、同じチェーンで使用されるルールを尊重して、ルールを正確な順序で配置する必要があります。上で説明したように、コマンドを使用して iptables ルールのリストを表示できます。

sudo iptables -L -v

たとえば、TCP 経由でポート 9001 への受信接続を許可するルールを挿入するには、Web のトラフィック ルールに従って INPUT チェーンにルール番号を指定する必要があります。

sudo iptables -I INPUT 1 -p TCP --dport 9001 -m state --state NEW -j ACCEPT

現在の iptables を表示すると、セット内の新しいルールが表示されるはずです。

sudo iptables -L -v

ルールの置き換え

置換機能は挿入と同様に機能しますが、iptables -R コマンドを使用します。たとえば、上記のルールを変更してポート 9001 を拒否に設定するには、次のようにします。

sudo iptables -R INPUT 1 -p TCP --dport 9001 -m state --state NEW -j REJECT

ルールの削除

ルールを削除するには、ルール番号を渡します。たとえば、上記のルールを削除するには、次のように指定できます。

sudo iptables -D INPUT 1

ほとんどの Linux ディストリビューションでは、IPv4 と IPv6 のいずれの iptables も空です。したがって、新しいルールを追加していない場合は、以下に示すような出力が表示されます。これは、システムがすべての受信トラフィック、送信トラフィック、およびルーティングされたトラフィックを許可することを意味するため、危険です。

iptables の設定方法を見てみましょう。

iptables を設定するにはどうすればよいですか?

iptables ルールを構成するにはさまざまな方法があります。このセクションでは、例を使用して、IP アドレスとポートを使用してルールを設定する方法を示します。

ポートごとのトラフィックのブロックと許可

特定のポートを使用して、ネットワーク インターフェイス上のすべてのトラフィックをブロックまたは許可できます。次の例を考えてみましょう。

sudo iptables -A INPUT -j ACCEPT -p TCP --destination-port 1001 -i wlan0

上記のコマンドは、wlan0 インターフェイスのポート 1001 TCP でのトラフィックを許可します。

sudo iptables -A INPUT -j DROP -p TCP --destination-port 1001 -i wlan0

このコマンドは、上記のコマンドの逆の動作を行い、wlan0 のポート 1001 上のすべてのトラフィックをブロックします。

コマンドを詳しく見てみると、次のようになります。

  • 最初の引数 (-A) は、テーブル チェーンの最後に新しいルールを追加します。

  • INPUT 引数は、指定されたルールをテーブルに追加します。

  • DROP 引数は、それぞれ ACCEPT と DROP として実行されるアクションを設定します。これは、パケットが一致すると、そのパケットはドロップされることを意味します。

  • -p は、TCP などのプロトコルを指定し、他のプロトコルのトラフィックの通過を許可します。

  • –destination-port は、ポート 1001 宛てのすべてのトラフィックを受け入れるかドロップするルールを設定します。

  • -i <インターフェイス名> は、wlan0 インターフェイスに着信するトラフィックにルールを適用するように iptables に指示します。

注: iptables はネットワーク インターフェイスのエイリアスを認識しません。したがって、複数の仮想インターフェイスを持つシステムでは、宛先アドレスを手動かつ明示的に定義する必要があります。

例えば:

sudo iptables -A INPUT -j DROP -p TCP --destination-port 1001 -i wlan0 -d 192.168.0.24

IP アドレスのホワイトリストとブラックリストの登録

iptables を使用してファイアウォール ルールを作成できます。 1 つの例として、すべてのトラフィックを停止し、明示的な IP アドレスからのネットワーク トラフィックのみを許可します。

例 :

iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A INPUT -i lo -m comment --comment "Allow loopback connections" -j ACCEPT
iptables -A INPUT -p icmp -m comment --comment “Allow Ping to work as expected” -j

受け入れる

iptables -A INPUT -s 192.168.0.1/24 -j ACCEPT
iptables -A INPUT -s 192.168.0.0 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP

最初の行では、192.168.0.1/24 サブネット内のすべての送信元 IP アドレスを許可するルールを設定します。 CIDR または個別の IP アドレスを使用することもできます。次のコマンドでは、既存の接続に接続されているすべてのトラフィックを許可するルールを設定します。最後のコマンドでは、INPUT と FORWARD がすべてドロップされるようにポリシーを設定します。

IPv6 での iptables の使用

iptables コマンドは IPv4 でのみ機能します。 IPv6 で iptables を使用するには、ip6tables コマンドを使用する必要があります。 Ip6tables は、生のテーブル、フィルター テーブル、セキュリティ テーブル、およびマングル テーブルを使用します。 ip6tables の一般的な構文は iptables に似ており、追加、削除などの一致する iptables オプションもサポートしています。

詳細については、ip6tables のマニュアル ページを使用することを検討してください。

ネットワークセキュリティのための iptables ルールセットの例

適切なファイアウォール ルールの作成は、主にシステム上で実行されているサービスと使用中のポートに依存します。ただし、システムを保護するために使用できる基本的なネットワーク構成ルールをいくつか示します。

1: ループバック インターフェイス トラフィックを許可し、他のインターフェイスからのすべてのループバックを拒否します。

iptables -A INPUT -i lo -j ACCEPT (You can also use ip6tables)
iptables -A INPUT ! -i lo -s 127.0.0.0 -j REJECT (ip6tables also applicable)

2: すべての ping リクエストを拒否する

iptables -A INPUT -p icmp -m state --state NEW --icmp-type 8 -j REJECT

3: SSH接続を許可する

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

これらは、システムを保護するために使用できるコマンドの例です。ただし、構成は、さまざまなサービスに何に、または誰がアクセスしたいかによって大きく異なります。

注意: IPv6 を完全に無効にする場合は、更新プロセスが遅くなるため、行のコメントを必ず解除してください。

precedence ::ffff:0:0/96 100 found in /etc/gai.conf .

これは、APT パッケージ マネージャーが apt-get update により IPv6 のミラー ドメインを解決するためです。

iptables ルールを導入するにはどうすればよいですか?

Ubuntu または他の Debian ベースのシステムに iptables をデプロイするには、まず、それぞれの IP アドレスに対応する 2 つのファイル ip4 と ip6 を作成します。

どちらのファイルでも、適用するルールを対応するファイルに追加します (IPv4 ルールは ip4 ファイルに、IPv6 ルールは ip6 ファイルに)。

次に、次のコマンドを使用してルールをインポートする必要があります。

sudo iptables-restore < /tmp/ip4 (replace filename for IPv6)

次に、次のコマンドを使用して、ルールが適用されているかどうかを確認できます。

sudo iptables -L -v

iptables-persistent クイックガイド

Ubuntu および一般的な Debian ベースのディストリビューションには、再起動時にファイアウォール ルールを簡単に適用できる iptables-persistent パッケージが付属しています。このパッケージには、IPv4 または IPv6 のルールを設定するために使用できるファイルが提供されており、起動時に自動的に適用できます。

UFW または GUFW を使用してファイアウォール ルールを使用することもできます。 UFW の使用方法を学習するには、次のチュートリアルを検討してください。

iptables-persistent をインストールするにはどうすればよいですか?

システムに iptables-persistent がインストールされていることを確認してください。 dpkg を使用して、パッケージがインストールされているかどうかを確認します。

そうでない場合は、次のコマンドを使用します。

sudo apt-get install iptables-persistent

現在の IPv4 ルールと IPv6 ルールの両方を保存するように求めるプロンプトが 2 回表示されます。 「はい」をクリックして両方のルールを保存します。

「はい」をクリックしてIPv6を保存します。

インストールが完了したら、次の図に示すように、iptables サブディレクトリがあることを確認します。

結論

このチュートリアルでは、iptables の基本について説明しました。 iptables、基本的なコマンド、デフォルトの iptables テーブル、パラメーターの操作から始めます。

これまでに学んだことから、iptables を使用してシステムのセキュリティを確保するファイアウォール ルールを作成できるようになっているはずです。