ファイアウォールおよびパケットフィルターの設定
firewalld サービス、nftables フレームワーク、および XDP パケットフィルタリング機能の管理
概要
firewalld サービスと nftables フレームワークを使用して、ネットワークトラフィックをフィルタリングし、パフォーマンスが重要なファイアウォールを構築できます。カーネルの Express Data Path (XDP) 機能を使用して、ネットワークインターフェイスでネットワークパケットを非常に高速に処理またはドロップすることもできます。
Red Hat ドキュメントへのフィードバック (英語のみ) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat は質の高いドキュメントを提供することに尽力しており、皆様からのフィードバックを大切にしています。改善にご協力いただくため、Red Hat Jira トラッキングシステムを通じてご提案やエラー報告をお寄せください。
手順
Jira の Web サイトにログインします。
アカウントがない場合、アカウント作成オプションを選択します。
- 上部のナビゲーションバーで Create をクリックします。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ウィンドウ下部の Create をクリックします。
第1章 firewalld の使用および設定 リンクのコピーリンクがクリップボードにコピーされました!
ファイアウォールは、外部からの不要なトラフィックからマシンを保護する方法です。管理者はファイアウォールを使用して、一連の ファイアウォールルールを 定義することにより、ホストマシンへの受信ネットワークトラフィックを制御します。このようなルールは、着信トラフィックを分類して、拒否または許可するために使用されます。
firewalld は、D-Bus インターフェイスを使用して、動的にカスタマイズできるファイアウォールを提供するファイアウォールサービスデーモンです。この動的なアーキテクチャーにより、管理者は変更のたびにサービスを再起動することなく、ルールを作成、変更、削除できます。
firewalld を使用して、一般的なケースの大部分で必要なパケットフィルタリングを設定できます。firewalld がシナリオをカバーしていない場合、またはルールを完全に制御したい場合は、nftables フレームワークを使用します。
firewalld は、ゾーン、ポリシー、サービスの概念を使用してトラフィック管理を単純化します。ゾーンはネットワークを論理的に分離します。ネットワークインターフェイスおよびソースをゾーンに割り当てることができます。ポリシーは、ゾーン間のトラフィックの流れを拒否または許可するために使用されます。ファイアウォールサービスは、特定のサービスに着信トラフィックを許可するのに必要なすべての設定を扱う事前定義のルールで、ゾーンに適用されます。
サービスは、ネットワーク接続に 1 つ以上のポートまたはアドレスを使用します。ファイアウォールは、ポートに基づいて接続のフィルターを設定します。サービスに対してネットワークトラフィックを許可するには、そのポートを解放する必要があります。firewalld は、明示的に解放されていないポートのトラフィックをすべてブロックします。trusted などのゾーンでは、デフォルトですべてのトラフィックを許可します。
firewalld は、ランタイム設定と永続設定を別々に維持します。そのため、ランタイムのみの変更が可能です。ランタイム設定は、firewalld の再読み込みまたは再起動後は保持されません。起動時に、永続的な設定から入力されます。
1.1. ファイアウォールゾーン リンクのコピーリンクがクリップボードにコピーされました!
firewalld ユーティリティーを使用すると、ネットワーク内のインターフェイスおよびトラフィックに対する信頼レベルに応じて、ネットワークをさまざまなゾーンに分離できます。接続は 1 つのゾーンにしか指定できませんが、そのゾーンは多くのネットワーク接続に使用できます。
firewalld はゾーンに関して厳格な原則に従います。
- トラフィックは 1 つのゾーンのみに流入します。
- トラフィックは 1 つのゾーンのみから流出します。
- ゾーンは信頼のレベルを定義します。
- ゾーン内トラフィック (同じゾーン内) はデフォルトで許可されます。
- ゾーン間トラフィック (ゾーンからゾーン) はデフォルトで拒否されます。
原則 4 と 5 は原則 3 の結果です。
原則 4 は、ゾーンオプション --remove-forward を使用して設定できます。原則 5 は、新しいポリシーを追加することで設定できます。
NetworkManager は、firewalld にインターフェイスのゾーンを通知します。次のユーティリティーを使用して、ゾーンをインターフェイスに割り当てることができます。
-
NetworkManager -
firewall-configユーティリティー -
firewall-cmdユーティリティー - RHEL Web コンソール
RHEL Web コンソール、firewall-config、および firewall-cmd では、適切な NetworkManager 設定ファイルのみを編集できます。Web コンソール、firewall-cmd、または firewall-config を使用してインターフェイスのゾーンを変更した場合、その要求は NetworkManager に転送され、firewalld では処理されません。
/usr/lib/firewalld/zones/ ディレクトリーには事前定義されたゾーンが保存されており、利用可能なネットワークインターフェイスに即座に適用できます。このファイルは、修正しないと /etc/firewalld/zones/ ディレクトリーにコピーされません。事前定義されたゾーンのデフォルト設定は次のとおりです。
block-
適している対象:
IPv4の場合は icmp-host-prohibited メッセージ、IPv6の場合は icmp6-adm-prohibited メッセージで、すべての着信ネットワーク接続を拒否する場合。 - 受け入れる接続: システム内から開始したネットワーク接続のみ。
-
適している対象:
dmz- 適している対象: パブリックにアクセス可能で、内部ネットワークへのアクセスが制限されている DMZ 内のコンピューター。
- 受け入れる接続: 選択した着信接続のみ。
drop適している対象: 着信ネットワークパケットを通知なしで破棄する場合。
- 受け入れる接続: 発信ネットワーク接続のみ。
external- 適している対象: マスカレードをルーター用に特別に有効にした外部ネットワーク。ネットワーク上の他のコンピューターを信頼できない状況。
- 受け入れる接続: 選択した着信接続のみ。
home- 適している対象: ネットワーク上の他のコンピューターをほぼ信頼できる自宅の環境。
- 受け入れる接続: 選択した着信接続のみ。
internal- 適している対象: ネットワーク上の他のコンピューターをほぼ信頼できる内部ネットワーク。
- 受け入れる接続: 選択した着信接続のみ。
public- 適している対象: ネットワーク上の他のコンピューターを信頼できないパブリックエリア。
- 受け入れる接続: 選択した着信接続のみ。
trusted- 受け入れる接続: すべてのネットワーク接続。
work適している対象: ネットワーク上の他のコンピューターをほぼ信頼できる職場の環境。
- 受け入れる接続: 選択した着信接続のみ。
このゾーンのいずれかを デフォルト ゾーンに設定できます。インターフェイス接続を NetworkManager に追加すると、デフォルトゾーンに割り当てられます。インストール時は、firewalld のデフォルトゾーンは public ゾーンです。デフォルトゾーンは変更できます。
ユーザーがすぐに理解できるように、ネットワークゾーン名は分かりやすい名前にしてください。
セキュリティー問題を回避するために、ニーズおよびリスク評価に合わせて、デフォルトゾーンの設定の見直しを行ったり、不要なサービスを無効にしてください。
詳細は、システム上の firewalld.zone(5) man ページを参照してください。
1.2. ファイアウォールポリシー リンクのコピーリンクがクリップボードにコピーされました!
ファイアウォールポリシーは、ネットワークに必要なセキュリティー状態を指定します。これらのポリシーは、さまざまなタイプのトラフィックに対して実行するルールとアクションの概要を示します。
通常、ポリシーには次のタイプのトラフィックに対するルールが含まれます。
- 着信トラフィック
- 送信トラフィック
- 転送トラフィック
- 特定のサービスとアプリケーション
- ネットワークアドレス変換 (NAT)
ファイアウォールポリシーは、ファイアウォールゾーンの概念を使用します。各ゾーンは、許可するトラフィックを決定する特定のファイアウォールルールのセットに関連付けられます。ポリシーは、ステートフルかつ一方向にファイアウォールルールを適用します。つまり、トラフィックの一方向のみを考慮します。firewalld のステートフルフィルタリングにより、トラフィックのリターンパスは暗黙的に許可されます。
ポリシーは、イングレスゾーンとエグレスゾーンに関連付けられます。イングレスゾーンは、トラフィックが発生する (受信される) 場所です。エグレスゾーンは、トラフィックが出る (送信される) 場所です。
ポリシーで定義されたファイアウォールのルールは、ファイアウォールゾーンを参照して、複数のネットワークインターフェイス全体に一貫した設定を適用できます。
1.3. ファイアウォールのルール リンクのコピーリンクがクリップボードにコピーされました!
ファイアウォールのルールを使用して、ネットワークトラフィックを許可またはブロックする特定の設定を実装できます。その結果、ネットワークトラフィックのフローを制御して、システムをセキュリティーの脅威から保護できます。
ファイアウォールのルールは通常、さまざまな属性に基づいて特定の基準を定義します。属性は次のとおりです。
- ソース IP アドレス
- 宛先 IP アドレス
- 転送プロトコル (TCP、UDP、…)
- ポート
- ネットワークインターフェイス
firewalld ユーティリティーは、ファイアウォールのルールをゾーン (public、internal など) とポリシーに整理します。各ゾーンには、特定のゾーンに関連付けられたネットワークインターフェイスのトラフィック自由度のレベルを決定する独自のルールセットがあります。
1.4. ファイアウォールの直接ルール リンクのコピーリンクがクリップボードにコピーされました!
firewalld サービスは、通常のルールや直接ルールなど、複数のルール設定方法を提供します。
これらの違いの 1 つは、それぞれの方法において基盤となるバックエンド (iptables または nftables) とどのように対話するかです。
直接ルールは、iptables との直接的なやり取りを可能にする高度な低レベルのルールです。しかし、iptables コンポーネントはメンテナンスされておらず、将来の RHEL のメジャーバージョンから削除される予定です。したがって、firewalld の直接ルールを nftables に置き換えます。
1.5. 事前定義済みの firewalld サービス リンクのコピーリンクがクリップボードにコピーされました!
事前定義済みの firewalld サービスは、低レベルのファイアウォールルールに対する抽象化レイヤーを提供します。これらのサービスは、SSH や HTTP などの一般的なネットワークサービスを、特定のポートとプロトコルにマッピングします。これにより、手動での設定ではなく名前付きのサービスを使用して、ファイアウォールの管理を簡素化し、ミスを削減できます。
利用可能な定義済みサービスを表示するには、以下を実行します。
# firewall-cmd --get-services RH-Satellite-6 RH-Satellite-6-capsule afp amanda-client amanda-k5-client amqp amqps apcupsd audit ausweisapp2 bacula bacula-client bareos-director bareos-filedaemon bareos-storage bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-exporter ceph-mon cfengine checkmk-agent cockpit collectd condor-collector cratedb ctdb dds...特定の定義済みサービスをさらに調査するには、以下を実行します。
# sudo firewall-cmd --info-service=RH-Satellite-6 RH-Satellite-6 ports: 5000/tcp 5646-5647/tcp 5671/tcp 8000/tcp 8080/tcp 9090/tcp protocols: source-ports: modules: destination: includes: foreman helpers:出力例では、
RH-Satellite-6定義済みサービスがポート 5000/tcp、5646-5647/tcp、5671/tcp、8000/tcp、8080/tcp、9090/tcp をリッスンしていることが示されています。さらに、RH-Satellite-6は別の定義済みサービスからルールを継承します。この場合はforemanです。
定義済みの各サービスは、/usr/lib/firewalld/services/ ディレクトリーに同じ名前の XML ファイルとして保存されます。
1.6. ファイアウォールゾーンでの作業 リンクのコピーリンクがクリップボードにコピーされました!
ゾーンは、着信トラフィックをより透過的に管理する概念を表しています。ネットワークインターフェイスと送信元アドレスはゾーンに割り当てられます。各ゾーンごとにファイアウォールルールを個別に管理できるため、複雑なファイアウォール設定を定義し、それをトラフィックに適用することができます。
1.6.1. デフォルトゾーンの変更 リンクのコピーリンクがクリップボードにコピーされました!
特定のゾーンに割り当てられないインターフェイスは、デフォルトゾーンに割り当てられます。firewalld サービスを再起動するたびに、firewalld は、デフォルトゾーンの設定を読み込み、それをアクティブにします。他のすべてのゾーンに関する設定は保持されており、すぐに使用できる状態になっています。
通常、ゾーンは NetworkManager により、NetworkManager 接続プロファイルの connection.zone 設定に従って、インターフェイスに割り当てられます。また、再起動後、NetworkManager はこれらのゾーンを "アクティブ化" するための割り当てを管理します。
前提条件
-
firewalldサービスが実行中である。
手順
現在のデフォルトゾーンを表示します。
# firewall-cmd --get-default-zone新しいデフォルトゾーンを設定します。
# firewall-cmd --set-default-zone <zone_name>注記この手順では、
--permanentオプションを使用しなくても、設定は永続化します。
1.6.2. 新しいゾーンの作成 リンクのコピーリンクがクリップボードにコピーされました!
カスタムゾーンを使用するには、新しいゾーンを作成したり、事前定義したゾーンなどを使用したりします。新しいゾーンには --permanent オプションが必要となり、このオプションがなければコマンドは動作しません。
前提条件
-
firewalldサービスが実行中である。
手順
新しいゾーンを作成します。
# firewall-cmd --permanent --new-zone=zone-name新しいゾーンを使用可能にします。
# firewall-cmd --reloadこのコマンドは、すでに実行中のネットワークサービスを中断することなく、最近の変更をファイアウォール設定に適用します。
検証
作成したゾーンが永続設定に追加されたかどうかを確認します。
# firewall-cmd --get-zones --permanent
1.6.3. ゾーンへのネットワークインターフェイスの割り当て リンクのコピーリンクがクリップボードにコピーされました!
複数のゾーンに複数のルールセットを定義して、使用されているインターフェイスのゾーンを変更することで、迅速に設定を変更できます。各インターフェイスに特定のゾーンを設定して、そのゾーンを通過するトラフィックを設定できます。
手順
アクティブゾーン、およびそのゾーンに割り当てられているインターフェイスをリスト表示します。
# firewall-cmd --get-active-zones別のゾーンにインターフェイスを割り当てます。
# firewall-cmd --zone=zone_name --change-interface=interface_name --permanent
1.6.4. ソースの追加 リンクのコピーリンクがクリップボードにコピーされました!
着信トラフィックを特定のゾーンに転送する場合は、そのゾーンにソースを追加します。ソースは、CIDR (Classless Inter-domain Routing) 表記法の IP アドレスまたは IP マスクになります。
ネットワーク範囲が重複している複数のゾーンを追加する場合は、ゾーン名で順序付けされ、最初のゾーンのみが考慮されます。
現在のゾーンにソースを設定するには、次のコマンドを実行します。
# firewall-cmd --add-source=<source>特定ゾーンのソース IP アドレスを設定するには、次のコマンドを実行します。
# firewall-cmd --zone=zone-name --add-source=<source>
次の手順では、trusted ゾーン内の 192.168.2.15 からの着信トラフィックをすべて許可します。
手順
利用可能なすべてのゾーンをリストします。
# firewall-cmd --get-zones永続化モードで、信頼ゾーンにソース IP を追加します。
# firewall-cmd --zone=trusted --add-source=192.168.2.15新しい設定を永続化します。
# firewall-cmd --runtime-to-permanent
1.6.5. ソースの削除 リンクのコピーリンクがクリップボードにコピーされました!
firewalld ゾーンからソースを削除すると、そのソースからのトラフィックが、そのソース用のルールによって制御されなくなります。代わりに、そのトラフィックには、インターフェイスが属するゾーンまたはデフォルトゾーンのルールが適用されます。
手順
必要なゾーンに対して許可されているソースのリストを表示します。
# firewall-cmd --zone=zone-name --list-sourcesゾーンからソースを永続的に削除します。
# firewall-cmd --zone=zone-name --remove-source=<source>新しい設定を永続化します。
# firewall-cmd --runtime-to-permanent
1.6.6. nmcli を使用した接続へのゾーンの割り当て リンクのコピーリンクがクリップボードにコピーされました!
nmcli ユーティリティーを使用して、firewalld ゾーンを NetworkManager 接続に追加できます。
手順
ゾーンを
NetworkManager接続プロファイルに割り当てます。# nmcli connection modify profile connection.zone zone_name接続をアクティベートします。
# nmcli connection up profile
1.6.7. 着信トラフィックにデフォルトの動作を設定するゾーンターゲットの使用 リンクのコピーリンクがクリップボードにコピーされました!
すべてのゾーンに対して、特に指定されていない着信トラフィックを処理するデフォルト動作を設定できます。そのような動作は、ゾーンのターゲットを設定することで定義されます。
4 つのオプションがあります。
-
ACCEPT: 指定したルールで許可されていないパケットを除いた、すべての着信パケットを許可します。 -
REJECT: 指定したルールで許可されているパケット以外の着信パケットをすべて拒否します。firewalldがパケットを拒否すると、送信元マシンに拒否が通知されます。 -
DROP: 指定したルールで許可されているパケット以外の着信パケットをすべて破棄します。firewalldがパケットを破棄すると、ソースマシンにパケット破棄の通知がされません。 -
default:REJECTと同じですが、Internet Control Message Protocol (ICMP) を暗黙的に許可します。
前提条件
-
firewalldサービスが実行中である。
手順
特定ゾーンに対する情報をリスト表示して、デフォルトゾーンを確認します。
# firewall-cmd --zone=zone-name --list-allゾーンに新しいターゲットを設定します。
# firewall-cmd --permanent --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>
1.6.8. 特定のゾーンのファイアウォール設定をカスタマイズすることによるセキュリティーの強化 リンクのコピーリンクがクリップボードにコピーされました!
ネットワークのセキュリティーを強化するには、firewalld 設定を変更し、特定のネットワークインターフェイスまたは接続を、特定のファイアウォールゾーンに関連付けます。ゾーンに対して詳細なルールを定義することで、セキュリティーのニーズに応じて、受信トラフィックと送信トラフィックを制御できます。
たとえば、次のような利点が得られます。
- 機密データの保護
- 不正アクセスの防止
- 潜在的なネットワーク脅威の軽減
前提条件
-
firewalldサービスが実行中である。
手順
利用可能なファイアウォールゾーンをリスト表示します。
# firewall-cmd --get-zonesfirewall-cmd --get-zonesコマンドは、システムで利用可能なすべてのゾーンを表示し、特定のゾーンの詳細は表示しません。すべてのゾーンの詳細情報を表示するには、firewall-cmd --list-all-zonesコマンドを使用します。- この設定に使用するゾーンを選択します。
選択したゾーンのファイアウォール設定を変更します。たとえば、
SSHサービスを許可し、ftpサービスを削除するには、次のようにします。# firewall-cmd --add-service=ssh --zone=<your_chosen_zone> # firewall-cmd --remove-service=ftp --zone=<same_chosen_zone>ネットワークインターフェイスをファイアウォールゾーンに割り当てます。
使用可能なネットワークインターフェイスをリスト表示します。
# firewall-cmd --get-active-zonesゾーンがアクティブかどうかは、その設定と一致するネットワークインターフェイスまたはソースアドレス範囲の存在によって決定します。デフォルトゾーンは、未分類のトラフィックに対してアクティブですが、ルールに一致するトラフィックがない場合は常にアクティブになるわけではありません。
選択したゾーンにネットワークインターフェイスを割り当てます。
# firewall-cmd --zone=<your_chosen_zone> --change-interface=<interface_name> --permanentネットワークインターフェイスをゾーンに割り当てることは、特定のインターフェイス (物理または仮想) 上のすべてのトラフィックに一貫したファイアウォール設定を適用する場合に適しています。
firewall-cmdコマンドを--permanentオプションとともに使用すると、多くの場合、NetworkManager 接続プロファイルが更新され、ファイアウォール設定に対する変更が永続化します。このfirewalldと NetworkManager の統合により、ネットワークとファイアウォールの設定に一貫性が確保されます。
検証
選択したゾーンの更新後の設定を表示します。
# firewall-cmd --zone=<your_chosen_zone> --list-allコマンド出力には、割り当てられたサービス、ネットワークインターフェイス、ネットワーク接続 (ソース) を含むすべてのゾーン設定が表示されます。
1.6.9. IP セットを使用した許可リストの動的更新の設定 リンクのコピーリンクがクリップボードにコピーされました!
ほぼリアルタイムで更新を行うことで、予測不可能な状況でも IP セット内の特定の IP アドレスまたは IP アドレス範囲を柔軟に許可できます。
これらの更新は、セキュリティー脅威の検出やネットワーク動作の変化など、さまざまなイベントによってトリガーされます。通常、このようなソリューションでは自動化を活用して手動処理を減らし、素早く状況に対応することでセキュリティーを向上させます。
前提条件
-
firewalldサービスが実行中である。
手順
分かりやすい名前で IP セットを作成します。
# firewall-cmd --permanent --new-ipset=allowlist --type=hash:ipこの
allowlistという新しい IP セットには、ファイアウォールで許可する IP アドレスが含まれています。IP セットに動的更新を追加します。
# firewall-cmd --permanent --ipset=allowlist --add-entry=198.51.100.10この設定により、新しく追加した、ネットワークトラフィックを渡すことがファイアウォールにより許可される IP アドレスで、
allowlistの IP セットが更新されます。先に作成した IP セットを参照するファイアウォールのルールを作成します。
# firewall-cmd --permanent --zone=public --add-source=ipset:allowlistこのルールがない場合、IP アドレスの設定はネットワークトラフィックに何の影響も与えず、デフォルトのファイアウォールポリシーが優先されます。
ファイアウォール設定をリロードして、変更を適用します。
# firewall-cmd --reload
検証
すべての IP セットをリスト表示します。
# firewall-cmd --get-ipsets allowlistアクティブなルールをリスト表示します。
# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp0s1 sources: ipset:allowlist services: cockpit dhcpv6-client ssh ports: protocols: ...コマンドライン出力の
sourcesセクションでは、どのトラフィックの発信元 (ホスト名、インターフェイス、IP セット、サブネットなど) が、特定のファイアウォールゾーンへのアクセスを許可または拒否されているかについて洞察が得られます。上記の場合、allowlistIP セットに含まれる IP アドレスが、publicゾーンのファイアウォールを通してトラフィックを渡すことが許可されています。IP セットの内容を調べます。
# cat /etc/firewalld/ipsets/allowlist.xml <?xml version="1.0" encoding="utf-8"?> <ipset type="hash:ip"> <entry>198.51.100.10</entry> </ipset>
次のステップ
-
スクリプトまたはセキュリティーユーティリティーを使用して脅威インテリジェンスのフィードを取得し、それに応じて
allowlistを自動的に更新します。
1.6.10. Web コンソールを使用したゾーンの有効化 リンクのコピーリンクがクリップボードにコピーされました!
RHEL 10 Web コンソールを使用して、事前定義された既存のファイアウォールゾーンを特定のインターフェイスまたは IP アドレスの範囲に適用できます。
前提条件
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
- Web コンソールで 管理者アクセス を有効にした。
-
firewalldサービスが実行中である。
手順
- RHEL 10 Web コンソールにログインします。
- Networking をクリックします。
- ボタンをクリックします。
- Firewall セクションの Add new zone をクリックします。
Add zone ダイアログボックスで、Trust level オプションからゾーンを選択します。
Web コンソールには、
firewalldサービスで事前定義されたすべてのゾーンが表示されます。- Interfaces 部分で、選択したゾーンを適用するインターフェイスを 1 つまたは複数選択します。
Allowed Addresses 部分で、ゾーンを適用するかどうかを選択できます。
- サブネット全体
次の形式の IP アドレスの範囲:
- 192.168.1.0
- 192.168.1.0/24
- 192.168.1.0/24, 192.168.1.0
- ボタンをクリックします。
1.6.11. Web コンソールを使用したゾーンの無効化 リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールを使用して、ファイアウォール設定からファイアウォールゾーンを削除できます。
前提条件
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
- Web コンソールで 管理者アクセス を有効にした。
-
firewalldサービスが実行中である。
手順
- RHEL 10 Web コンソールにログインします。
- Networking をクリックします。
- ボタンをクリックします。
削除するゾーンの ボタン (縦の省略記号メニュー) をクリックします。
- Delete をクリックします。
1.7. firewalld を使用したネットワークトラフィックの制御 リンクのコピーリンクがクリップボードにコピーされました!
firewalld パッケージは、事前定義された多数のサービスファイルをインストールし、それらをさらに追加したり、カスタマイズしたりできます。さらに、これらのサービス定義を使用して、サービスが使用するプロトコルとポート番号を知らなくても、サービスのポートを開いたり閉じたりできます。
1.7.1. CLI を使用した事前定義サービスによるトラフィックの制御 リンクのコピーリンクがクリップボードにコピーされました!
トラフィックを制御する最も簡単な方法は、事前定義したサービスを firewalld に追加する方法です。これにより、必要なすべてのポートが開き、service definition file に従ってその他の設定が変更されます。
前提条件
-
firewalldサービスが実行中である。
手順
firewalldのサービスがまだ許可されていないことを確認します。# firewall-cmd --list-services ssh dhcpv6-clientこのコマンドは、デフォルトゾーンで有効になっているサービスをリスト表示します。
firewalldのすべての事前定義サービスをリスト表示します。# firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ...このコマンドは、デフォルトゾーンで利用可能なサービスのリストを表示します。
firewalldが許可するサービスのリストにサービスを追加します。# firewall-cmd --add-service=<service_name>このコマンドは、指定したサービスをデフォルトゾーンに追加します。
新しい設定を永続化します。
# firewall-cmd --runtime-to-permanentこのコマンドは、これらのランタイムの変更をファイアウォールの永続的な設定に適用します。デフォルトでは、これらの変更はデフォルトゾーンの設定に適用されます。
検証
すべての永続的なファイアウォールのルールをリスト表示します。
# firewall-cmd --list-all --permanent public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:このコマンドは、デフォルトのファイアウォールゾーン (
public) の永続的なファイアウォールのルールを含む完全な設定を表示します。
1.7.2. Web コンソールを使用したファイアウォールのサービスの有効化 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、サービスはデフォルトのファイアウォールゾーンに追加されます。複数のネットワークインターフェイスで複数のファイアウォールゾーンを使用している場合は、ゾーンを選択してから、そのサービスを対応するポートとともに追加する必要があります。
RHEL 10 Web コンソールに、事前定義済みの firewalld サービスが表示されます。このサービスをアクティブなファイアウォールゾーンに追加できます。
RHEL 10 Web コンソールは、firewalld サービスを設定します。
Web コンソールのリストに表示されない汎用の firewalld ルールは、Web コンソールでは設定できません。
前提条件
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
- Web コンソールで 管理者アクセス を有効にした。
-
firewalldサービスが実行中である。
手順
- RHEL 10 Web コンソールにログインします。
- Networking をクリックします。
- ボタンをクリックします。
- Firewall セクションで、サービスを追加するゾーンを選択し、Add Services をクリックします。
- Add Services ダイアログボックスで、ファイアウォールで有効にするサービスを見つけます。
- シナリオに応じてサービスを有効にします。
- Add Services をクリックします。
1.7.3. Web コンソールを使用したカスタムポートの設定 リンクのコピーリンクがクリップボードにコピーされました!
RHEL Web コンソールを通じて、サービス用のカスタムポートを追加できます。
前提条件
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
- Web コンソールで 管理者アクセス を有効にした。
-
firewalldサービスが実行中である。
手順
- RHEL 10 Web コンソールにログインします。
- Networking をクリックします。
ボタンをクリックします。
ボタンが表示されない場合は、Web コンソールに管理者権限でログインしてください。
- Firewall セクションで、カスタムポートを設定するゾーンを選択し、Add Services をクリックします。
- Add services ダイアログボックスで、 ラジオボタンをクリックします。
TCP フィールドおよび UDP フィールドに、例に従ってポートを追加します。以下の形式でポートを追加できます。
- ポート番号 (22 など)
- ポート番号の範囲 (5900-5910 など)
- エイリアス (nfs、rsync など)
注記各フィールドには、複数の値を追加できます。値はスペースを入れずにコンマで区切る必要があります (例: 8080,8081,http)。
TCP フィールド、UDP フィールド、またはその両方にポート番号を追加した後、Name フィールドでサービス名を確認します。
Name フィールドには、このポートを予約しているサービスの名前が表示されます。このポートが自由に使用可能であり、かつどのサーバーもこのポートで通信するにあたってそのサービスを必要としていないのであれば、その名前を書き換えても構いません。
- Name フィールドに、定義されたポートを含むサービスの名前を追加します。
- ボタンをクリックします。
1.8. ゾーン間で転送されるトラフィックのフィルタリング リンクのコピーリンクがクリップボードにコピーされました!
firewalld の 異なるゾーン間でのネットワークデータの流れを制御できます。ルールとポリシーを定義することで、これらのゾーン間を移動するトラフィックをどのように許可またはブロックするかを管理できます。
ポリシーオブジェクト機能は、firewalld においてフォワードおよびアウトプットフィルタリングを提供します。firewalld を使用して、異なるゾーン間のトラフィックをフィルタリングし、ローカルでホストされている仮想マシンへのアクセスを許可して、ホストを接続できます。
1.8.1. ポリシーオブジェクトとゾーンの関係 リンクのコピーリンクがクリップボードにコピーされました!
ポリシーオブジェクトを使用することで、サービス、ポート、詳細なルールなど、firewalld の基本要素をポリシーに関連付けることができます。ポリシーオブジェクトは、ステートフルおよび一方向の方法でゾーン間を通過するトラフィックに適用することができます。
# firewall-cmd --permanent --new-policy myOutputPolicy
# firewall-cmd --permanent --policy myOutputPolicy --add-ingress-zone HOST
# firewall-cmd --permanent --policy myOutputPolicy --add-egress-zone ANY
HOST および ANY は、イングレスゾーンおよびエグレスゾーンのリストで使用されるシンボリックゾーンです。
-
HOSTシンボリックゾーンは、firewalld を実行しているホストから発信されるトラフィック、またはホストへの宛先を持つトラフィックのポリシーを許可します。 -
ANYシンボリックゾーンは、現行および将来のすべてのゾーンにポリシーを適用します。ANYシンボリックゾーンは、すべてのゾーンのワイルドカードとして機能します。
1.8.2. 優先度を使用したポリシーのソート リンクのコピーリンクがクリップボードにコピーされました!
同じトラフィックに対して複数のポリシーを適用できます。したがって、優先順位を使用して、適用される可能性のある政策の優先順位を定める。
手順
- ポリシーをソートする優先度を設定します。
# *firewall-cmd --permanent --policy _mypolicy_ --set-priority _-500_*
+ 優先度の数値が小さいほど優先度が高く、最初に適用されます。
1.8.3. ポリシーオブジェクトを使用した、ローカルでホストされているコンテナーと、ホストに物理的に接続されているネットワークとの間でのトラフィックのフィルタリング リンクのコピーリンクがクリップボードにコピーされました!
ポリシーオブジェクト機能を使用すると、Podman と firewalld ゾーン間のトラフィックをフィルタリングできます。
Red Hat は、デフォルトではすべてのトラフィックをブロックし、Podman ユーティリティーに必要なサービスを選択して開くことを推奨します。
手順
新しいファイアウォールポリシーを作成します。
# firewall-cmd --permanent --new-policy podmanToAnyPodman から他のゾーンへのすべてのトラフィックをブロックし、Podman で必要なサービスのみを許可します。
# firewall-cmd --permanent --policy podmanToAny --set-target REJECT # firewall-cmd --permanent --policy podmanToAny --add-service dhcp # firewall-cmd --permanent --policy podmanToAny --add-service dns # firewall-cmd --permanent --policy podmanToAny --add-service https新しい Podman ゾーンを作成します。
# firewall-cmd --permanent --new-zone=podmanポリシーのイングレスゾーンを定義します。
# firewall-cmd --permanent --policy podmanToHost --add-ingress-zone podman他のすべてのゾーンのエグレスゾーンを定義します。
# firewall-cmd --permanent --policy podmanToHost --add-egress-zone ANYエグレスゾーンを ANY に設定すると、Podman と他のゾーンの間でフィルタリングすることになります。ホストに対してフィルタリングする場合は、エグレスゾーンを HOST に設定します。
firewalld サービスを再起動します。
# systemctl restart firewalld
検証
他のゾーンに対する Podman ファイアウォールポリシーを検証します。
# firewall-cmd --info-policy podmanToAny podmanToAny (active) ... target: REJECT ingress-zones: podman egress-zones: ANY services: dhcp dns https ...
1.8.4. ポリシーオブジェクトのデフォルトターゲットの設定 リンクのコピーリンクがクリップボードにコピーされました!
ポリシーには --set-target オプションを指定できます。
以下のターゲットを使用できます。
-
ACCEPT- パケットを受け入れます -
DROP- 不要なパケットを破棄します -
REJECT- ICMP 応答で不要なパケットを拒否します -
続行(デフォルト) - パケットは、以下のポリシーおよびゾーンのルールに従います。
手順
デフォルトのターゲットを設定します。
# firewall-cmd --permanent --policy mypolicy --set-target CONTINUE
検証
ポリシーに関する情報の確認
# firewall-cmd --info-policy mypolicy
1.9. firewalld を使用した NAT の設定 リンクのコピーリンクがクリップボードにコピーされました!
firewalld を使用すると、マスカレード、宛先 NAT (DNAT)、およびリダイレクトという NAT タイプを設定できます。NAT を使用すると、送信元または宛先の IP アドレスを変更できます。
1.9.1. ネットワークアドレス変換のタイプ リンクのコピーリンクがクリップボードにコピーされました!
ネットワークでネットワークアドレス変換 (NAT) が必要な場合は、NAT のタイプを理解することが重要です。
さまざまな NAT タイプを以下に示します。
- マスカレード
この NAT タイプは、パケットの送信元 IP アドレスを変更するために使用します。たとえば、インターネットサービスプロバイダー (ISP) は、プライベート IP 範囲 (
10.0.0.0/8など) をルーティングしません。ネットワークでプライベート IP アドレス範囲を使用しており、そのネットワーク内のホストがインターネットアクセスを必要とする場合は、これらの範囲からのパケットの送信元 IP アドレスをパブリック IP アドレスにマッピングしてください。マスカレードは、出力インターフェイスの IP アドレスを自動的に使用します。したがって、出力インターフェイスが動的 IP アドレスを使用する場合は、マスカレードを使用します。
- 宛先 NAT (DNAT)
- この NAT タイプを使用して、着信パケットの宛先アドレスとポートを書き換えます。たとえば、Web サーバーがプライベート IP 範囲の IP アドレスを使用しているため、インターネットから直接アクセスできない場合は、ルーターに DNAT ルールを設定し、着信トラフィックをこのサーバーにリダイレクトできます。
- リダイレクト
- このタイプは、パケットをローカルマシンの別のポートにリダイレクトする DNAT の特殊なケースです。たとえば、サービスが標準ポートとは異なるポートで実行する場合は、標準ポートからこの特定のポートに着信トラフィックをリダイレクトすることができます。
1.9.2. IP アドレスのマスカレードの設定 リンクのコピーリンクがクリップボードにコピーされました!
システムで IP マスカレードを有効にできます。IP マスカレードは、インターネットにアクセスする際にゲートウェイの向こう側にある個々のマシンを隠します。
手順
IP マスカレードが有効かどうかを確認するには (たとえば、
externalゾーンの場合)、rootとして次のコマンドを入力します。# firewall-cmd --zone=external --query-masqueradeこのコマンドでは、有効な場合は
yesと出力され、終了ステータスは0になります。無効の場合はnoと出力され、終了ステータスは1になります。ゾーンが省略された場合、firewalld はデフォルトのゾーンを使用します。IP マスカレードを有効にするには、
rootで次のコマンドを実行します。# firewall-cmd --zone=external --add-masquerade-
この設定を永続化するには、
--permanentオプションをコマンドに渡します。 IP マスカレードを無効にするには、
rootで次のコマンドを実行します。# firewall-cmd --zone=external --remove-masqueradeこの設定を永続化するには、
--permanentをコマンドラインに渡します。
1.9.3. DNAT を使用した着信 HTTP トラフィックの転送 リンクのコピーリンクがクリップボードにコピーされました!
宛先ネットワークアドレス変換 (DNAT) を使用して、着信トラフィックを 1 つの宛先アドレスおよびポートから別の宛先アドレスおよびポートに転送できます。通常、外部ネットワークインターフェイスからの着信リクエストを特定の内部サーバーまたはサービスにリダイレクトする場合に役立ちます。
前提条件
-
firewalldサービスが実行中である。
手順
着信 HTTP トラフィックを転送します。
# firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=198.51.100.10:toport=8080 --permanent上記のコマンドは、次の設定で DNAT ルールを定義します。
-
--zone=public- DNAT ルールを設定するファイアウォールゾーン。必要なゾーンに合わせて調整できます。 -
--add-forward-port- ポート転送ルールを追加することを示すオプション。 -
port=80- 外部宛先ポート。 -
proto=tcp- TCP トラフィックを転送することを示すプロトコル。 -
toaddr=198.51.100.10- 宛先 IP アドレス。 -
toport=8080- 内部サーバーの宛先ポート。 -
--permanent- 再起動後も DNAT ルールを永続化するオプション。
-
ファイアウォール設定をリロードして、変更を適用します。
# firewall-cmd --reload
検証
使用したファイアウォールゾーンの DNAT ルールを確認します。
# firewall-cmd --list-forward-ports --zone=public port=80:proto=tcp:toport=8080:toaddr=198.51.100.10あるいは、対応する XML 設定ファイルを表示します。
# cat /etc/firewalld/zones/public.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="cockpit"/> <forward-port port="80" protocol="tcp" to-port="8080" to-addr="198.51.100.10"/> <forward/> </zone>
1.9.4. 非標準ポートからのトラフィックをリダイレクトして、標準ポートで Web サービスにアクセスできるようにする リンクのコピーリンクがクリップボードにコピーされました!
リダイレクトメカニズムを使用すると、ユーザーが URL でポートを指定しなくても、非標準ポートで内部的に実行される Web サービスにアクセスできるようになります。
リダイレクトを使用すると、URL が簡素化され、より快適なブラウジング体験が得られますが、非標準ポートは内部的に、または特定の要件のために引き続き使用されます。
前提条件
-
firewalldサービスが実行中である。
手順
NAT リダイレクトルールを作成します。
# firewall-cmd --zone=public --add-forward-port=port=<standard_port>:proto=tcp:toport=<non_standard_port> --permanent上記のコマンドは、次の設定で NAT リダイレクトルールを定義します。
-
--zone=public- ルールを設定するファイアウォールゾーン。必要なゾーンに合わせて調整できます。 -
--add-forward-port=port=<non_standard_port>- 着信トラフィックを最初に受信するソースポートを使用したポート転送 (リダイレクト) ルールを追加することを示すオプション。 -
proto=tcp- TCP トラフィックをリダイレクトすることを示すプロトコル。 -
toport=<standard_port>- 着信トラフィックがソースポートで受信された後にリダイレクトされる宛先ポート。 -
--permanent- 再起動後もルールを永続化するオプション。
-
ファイアウォール設定をリロードして、変更を適用します。
# firewall-cmd --reload
検証
使用したファイアウォールゾーンのリダイレクトルールを確認します。
# firewall-cmd --list-forward-ports port=8080:proto=tcp:toport=80:toaddr=あるいは、対応する XML 設定ファイルを表示します。
# cat /etc/firewalld/zones/public.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="cockpit"/> <forward-port port="8080" protocol="tcp" to-port="80"/> <forward/> </zone>
1.10. リッチルールの優先度設定 リンクのコピーリンクがクリップボードにコピーされました!
リッチルールを使用すると、ファイアウォールルールをより高度かつ柔軟な方法で定義できます。リッチルールは、サービスやポートなどでは複雑なファイアウォールルールを表現しきれない場合に特に役立ちます。
リッチルールの背後にある概念:
- 粒度と柔軟性
- より具体的な基準に基づき、ネットワークトラフィックの詳細な条件を定義できます。
- ルール構造
リッチルールは、ファミリー (IPv4 または IPv6) と、それに続く条件およびアクションで構成されます。
rule family="ipv4|ipv6" [conditions] [actions]- conditions
- 特定の基準が満たされた場合にのみ、リッチルールを適用できます。
- actions
- 条件に一致するネットワークトラフィックに何が起きるかを定義できます。
- combining multiple conditions
- より具体的かつ複雑なフィルタリングを作成できます。
- hierarchical control and reusability
- リッチルールを、ゾーンやサービスなどの他のファイアウォールメカニズムと組み合わせることができます。
デフォルトでは、リッチルールはルールアクションに基づいて設定されます。たとえば、allow ルールよりも deny ルールが優先されます。リッチルールで priority パラメーターを使用すると、管理者はリッチルールとその実行順序をきめ細かく制御できます。priority パラメーターを使用すると、ルールはまず優先度の値によって昇順にソートされます。複数のルールが同じ 優先順位 を持つ場合、その順序はルールのアクションによって決定されます。アクションも同じ場合は、順序が不確定になる可能性があります。
1.10.1. priority パラメーターがルールを異なるチェーンに振り分ける仕組み リンクのコピーリンクがクリップボードにコピーされました!
リッチルールの priority パラメーターは、-32768 から 32767 までの任意の数値に設定でき、数値が小さいほど優先度が高くなります。
firewalld サービスは、優先度の値に基づいてルールを異なるチェーンに振り分けます。
-
優先度が 0 未満 - ルールは
_pre接尾辞が付いたチェーンにリダイレクトされます。 -
優先度が 0 を超える - ルールは
_post接尾辞が付いたチェーンにリダイレクトされます。 -
優先度が 0 - アクションに基づいて、ルールは、
_log、_deny、または_allowのアクションを使用してチェーンにリダイレクトされます。
このサブチェーンでは、firewalld は優先度の値に基づいてルールを分類します。
詳細は、システム上の firewalld.richlanguage(5) man ページを参照してください。
1.10.2. リッチルールの優先度の設定 リンクのコピーリンクがクリップボードにコピーされました!
priority パラメーターを使用すると、他のルールによって許可または拒否されないすべてのトラフィックをログに記録できます。この機能を使用すると、たとえば、予期しないトラフィックにフラグを付けることができます。
手順
優先度が非常に低いルールを追加して、他のルールと一致していないすべてのトラフィックをログに記録します。
# firewall-cmd --add-rich-rule='rule priority=32767 log prefix="UNEXPECTED: " limit value="5/m"'このコマンドでは、ログエントリーの数を、毎分
5に制限します。詳細は、システム上の firewalld.richlanguage(5) man ページを参照してください。
検証
前の手順のコマンドで作成した
nftablesルールを表示します。# nft list chain inet firewalld filter_IN_public_post table inet firewalld { chain filter_IN_public_post { log prefix "UNEXPECTED: " limit rate 5/minute } }
1.11. firewalld ゾーン内の異なるインターフェイスまたはソース間でのトラフィック転送の有効化 リンクのコピーリンクがクリップボードにコピーされました!
ゾーン内転送は、firewalld ゾーン内のインターフェイスまたはソース間のトラフィック転送を可能にする firewalld 機能です。
1.11.1. ゾーン内転送と、デフォルトのターゲットが ACCEPT に設定されているゾーンの違い リンクのコピーリンクがクリップボードにコピーされました!
ゾーン内転送を有効にすると、1 つの firewalld ゾーン内のトラフィックは、あるインターフェイスまたはソースから別のインターフェイスまたはソースに流れることができます。ゾーンは、インターフェイスおよびソースの信頼レベルを指定します。信頼レベルが同じ場合、トラフィックは同じゾーン内に留まります。
firewalld のデフォルトゾーンでゾーン内転送を有効にすると、現在のデフォルトゾーンに追加されたインターフェイスおよびソースにのみ適用されます。
firewalld は、異なるゾーンを使用して着信トラフィックと送信トラフィックを管理します。各ゾーンには独自のルールと動作のセットがあります。たとえば、trusted ゾーンでは、転送されたすべてのトラフィックがデフォルトで許可されます。
他のゾーンでは、異なるデフォルト動作を設定できます。標準ゾーンでは、ゾーンのターゲットが default に設定されている場合、転送されたトラフィックは通常デフォルトで破棄されます。
ゾーン内の異なるインターフェイスまたはソース間でトラフィックを転送する方法を制御するには、ゾーンのターゲットを理解し、それに応じてゾーンのターゲットを設定する必要があります。
1.11.2. ゾーン内転送を使用したイーサネットと Wi-Fi ネットワーク間でのトラフィックの転送 リンクのコピーリンクがクリップボードにコピーされました!
ゾーン内転送を使用して、同じ firewalld ゾーン内のインターフェイスとソース間のトラフィックを転送することができます。
この機能には次の利点があります。
-
有線デバイスと無線デバイスの間のシームレスな接続性 (
enp1s0に接続されたイーサネットネットワークとwlp0s20に接続された Wi-Fi ネットワークの間でトラフィックを転送可能) - 柔軟な作業環境のサポート
- ネットワーク内の複数のデバイスまたはユーザーがアクセスして使用できる共有リソース (プリンター、データベース、ネットワーク接続ストレージなど)
- 効率的な内部ネットワーク (スムーズな通信、レイテンシーの短縮、リソースへのアクセス性など)
この機能は、個々の firewalld ゾーンに対して有効にすることができます。
詳細は、システム上の firewalld.zones(5) man ページを参照してください。
手順
カーネルでパケット転送を有効にします。
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.confゾーン内転送を有効にするインターフェイスが
internalゾーンにのみ割り当てられていることを確認します。# firewall-cmd --get-active-zones現在、インターフェイスが
internal以外のゾーンに割り当てられている場合は、以下のように再割り当てします。# firewall-cmd --zone=internal --change-interface=interface_name --permanentenp1s0およびwlp0s20インターフェイスをinternalゾーンに追加します。# firewall-cmd --zone=internal --add-interface=enp1s0 --add-interface=wlp0s20ゾーン内転送を有効にします。
# firewall-cmd --zone=internal --add-forward
検証
-
ゾーン転送を有効にしたホストの
enp1s0インターフェイスと同じネットワーク上にあるホストにログインします。 ncatで echo サービスを起動し、接続をテストします。# ncat -e /usr/bin/cat -l 12345-
wlp0s20インターフェイスと同じネットワークにあるホストにログインします。 enp1s0と同じネットワークにあるホスト上で実行している echo サーバーに接続します。# ncat <other_host> 12345- 何かを入力して を押します。テキストが返送されることを確認します。
1.12. RHEL システムロールを使用した firewalld の設定 リンクのコピーリンクがクリップボードにコピーされました!
RHEL システムロールは、Ansible 自動化ユーティリティーのコンテンツセットです。このコンテンツを、Ansible Automation ユーティリティーと組み合わせることで、複数のシステムを同時にリモートで管理するための一貫した設定インターフェイスが実現します。
rhel-system-roles パッケージには、rhel-system-roles.firewall RHEL システムロールが含まれています。このロールは、firewalld サービスの自動設定のために導入されました。
firewall RHEL システムロールを使用すると、次のようなさまざまな firewalld パラメーターを設定できます。
- ゾーン
- パケットの受信が許可されている特定のサービス
- ポートへのトラフィックアクセスの許可、拒否、またはドロップ
- ゾーンのポートまたはポート範囲の転送
1.12.1. firewall RHEL システムロールを使用した firewalld 設定のリセット リンクのコピーリンクがクリップボードにコピーされました!
firewall RHEL システムロールは、firewalld 設定をデフォルトに自動的にリセットする機能をサポートしています。これにより、セキュアでない、または意図しないファイアウォールルールが効率的に削除され、管理が簡素化されます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Reset firewalld example hosts: managed-node-01.example.com tasks: - name: Reset firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - previous: replacedサンプル Playbook で指定されている設定は次のとおりです。
previous: replaced既存のユーザー定義設定をすべて削除し、
firewalld設定をデフォルトにリセットします。previous:replacedパラメーターを他の設定と組み合わせると、firewallロールは新しい設定を適用する前に既存の設定をすべて削除します。Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.firewall/README.mdファイルを参照してください。
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
コントロールノードでこのコマンドを実行して、管理対象ノードのすべてのファイアウォール設定がデフォルト値にリセットされたことをリモートで確認します。
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-all-zones'
1.12.2. firewall RHEL システムロールを使用して、firewalld の着信トラフィックをあるローカルポートから別のローカルポートに転送する リンクのコピーリンクがクリップボードにコピーされました!
firewall RHEL システムロールを使用して、あるローカルポートから別のローカルポートへの着信トラフィックの転送をリモートで設定できます。
たとえば、同じマシン上に複数のサービスが共存し、同じデフォルトポートが必要な環境の場合、ポートの競合が発生する可能性があります。この競合によりサービスが中断され、ダウンタイムが発生する可能性があります。firewall RHEL システムロールを使用すると、トラフィックを効率的に別のポートに転送して、サービスの設定を変更せずにサービスを同時に実行できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Forward incoming traffic on port 8080 to 443 ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - forward_port: 8080/tcp;443; state: enabled runtime: true permanent: trueサンプル Playbook で指定されている設定は次のとおりです。
forward_port: 8080/tcp;443- TCP プロトコルを使用してローカルポート 8080 に送信されるトラフィックが、ポート 443 に転送されます。
runtime: trueランタイム設定の変更を有効にします。デフォルトは
trueに設定されています。Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.firewall/README.mdファイルを参照してください。
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
コントロールノードで次のコマンドを実行して、管理対象ノードの転送ポートをリモートで確認します。
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --list-forward-ports' managed-node-01.example.com | CHANGED | rc=0 >> port=8080:proto=tcp:toport=443:toaddr=
1.12.3. firewall RHEL システムロールを使用した firewalld DMZ ゾーンの設定 リンクのコピーリンクがクリップボードにコピーされました!
firewall RHEL システムロールを使用して、特定のトラフィックを許可するゾーンを設定できます。たとえば、外部ユーザーが Web サーバーにアクセスできるように、enp1s0 インターフェイスを持つ dmz ゾーンで HTTPS トラフィックを許可するように設定できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Creating a DMZ with access to HTTPS port and masquerading for hosts in DMZ ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - zone: dmz interface: enp1s0 service: https state: enabled runtime: true permanent: truePlaybook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.firewall/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
コントロールノードで次のコマンドを実行して、管理対象ノードの
dmzゾーンに関する情報をリモートで確認します。# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --zone=dmz --list-all' managed-node-01.example.com | CHANGED | rc=0 >> dmz (active) target: default icmp-block-inversion: no interfaces: enp1s0 sources: services: https ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks:
1.12.4. firewall RHEL システムロールを使用したカスタム firewalld サービスの作成 リンクのコピーリンクがクリップボードにコピーされました!
firewalld において、サービスとは、特定のアプリケーションに対するトラフィックを許可するルールをまとめて名前を付けたものです。管理者は、個々のポートとプロトコルを手動で管理する代わりに、サービス名を使用してトラフィックを許可することができます。
firewall RHEL システムロールを使用すると、カスタムサービスファイルの作成を自動化できます。これにより、ファイアウォールの設定がよりシンプルになり、再利用しやすくなります。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Create a firewalld service ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: service: custom_service short: A custom firewalld service description: >- A custom firewalld service that opens port 2222/tcp and the ports opened by the http and https firewalld services. port: 2222/tcp includes: - http - https state: present permanent: trueサンプル Playbook で指定されている設定は次のとおりです。
service: <service_name>- サービスの名前を設定します。
short: <short_description>- サービスの簡単な説明を設定します。
description: <description>- サービスの詳細な説明を設定します。
port: <port>/<protocol>- サービスファイルで許可されるポートとプロトコルを定義します。複数のエントリーを定義するには、YAML リストを使用します。
includes: <services>-
オプション: 作成するサービスに含めるその他の
firewalldサービスファイルを定義します。 state: present- サービスを追加します。そのサービスがすでに存在する場合、ロールは定義されたとおりにそのサービスを変更します。
permanent: truefirewalldの永続的な設定の変更を有効にします。Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.firewall/README.mdファイルを参照してください。
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
作成したサービス定義を表示します。
# ansible managed-node-01.example.com -m ansible.builtin.command -a 'firewall-cmd --info-service=custom_service'
1.13. firewalld で転送されるトラフィックの高速化 リンクのコピーリンクがクリップボードにコピーされました!
firewalld サービスはフローテーブル機能をサポートしています。これにより、転送されるトラフィックのパフォーマンスを向上できます。このメカニズムはカーネル接続追跡を使用して、ネットワークスタックの大部分をバイパスします。その結果、確立された接続のデータパケットが高速化されます。
フローテーブルメカニズムには次の機能があります。
- 接続追跡を使用して、従来のパケット転送パスをバイパスします。
- 従来のパケット処理をバイパスすることで、ルーティングテーブルの再参照を回避します。
- TCP および UDP プロトコルでのみ動作します。
- ハードウェアに依存しないソフトウェア高速パスです。
手順
フローテーブル機能を有効にします。
# sed -i 's/^NftablesFlowtable=.*/NftablesFlowtable=enp1s0 enp2s0/' /etc/firewalld/firewalld.confこのコマンドは、
/etc/firewalld/firewalld.confファイル内のNftablesFlowtableオプション (デフォルトはoff) を、フローテーブルを有効にするネットワークインターフェイスのリストに設定します。この場合はNftablesFlowtable=enp1s0 enp2s0です。変更を有効にするために、ファイアウォールの設定をリロードします。
# firewall-cmd --reload
1.14. firewalld を使用してトラフィック分類のゾーン優先度を設定する リンクのコピーリンクがクリップボードにコピーされました!
ゾーン優先度を使用すると、ingress と egress トラフィックの優先度を指定して、パケットの分類順序を制御できます。その利点は、ゾーン内のトラフィック分類順序を指定できることです。
送信元アドレスやインターフェイスに関係なく、ゾーン A はゾーン B よりも先に考慮される可能性がある。優先度の値が低いゾーンは、優先度の値が高いゾーンよりも優先されます。この分類には、ingress の優先度値と egress の優先度値のペアがあります。
1.14.1. ゾーン内の両方のトラフィックタイプに同じ優先度を設定する リンクのコピーリンクがクリップボードにコピーされました!
--set-priority オプションを使用すると、明示的に指定しなくても、ingress と egress の両方のトラフィック分類に共通の値を設定できます。
手順
新しいゾーンを作成します。
# firewall-cmd --permanent --new-zone=example-zone--set-priorityを使用して、example-zoneゾーンに共通ゾーン優先度値を設定します。# firewall-cmd --permanent --zone example-zone --set-priority -10より低い値を設定すると、優先度が高くなります。これにより、このゾーンにおける両方のトラフィックタイプに対して設定されたすべての操作が、他のゾーンの操作よりも優先されることが保証されます。
永続的な設定をランタイムに適用します。
# firewall-cmd --reload
検証
両方のトラフィックタイプの優先度値を表示します。
# firewall-cmd --permanent --info-zone example-zone example-zone target: default ingress-priority: -10 egress-priority: -10 ... icmp-block-inversion: no ... services: dhcpv6-client mdns samba-client ssh ... forward: yes masquerade: no ...この設定により、トラフィックは他のゾーンよりも先に
例のゾーンに分類されることが保証されます。
1.14.2. ゾーン内のトラフィックタイプごとに異なる優先度を設定する リンクのコピーリンクがクリップボードにコピーされました!
ingress トラフィックと egress トラフィックに異なる値を設定することで、ゾーン内のトラフィック分類の優先度を設定できます。
手順
新しいゾーンを作成します。
# firewall-cmd --permanent --new-zone=example-zone--set-Ingress-priorityを使用して、example-zoneゾーン内のingressトラフィックのゾーン優先度値を設定します。# firewall-cmd --permanent --zone example-zone --set-ingress-priority -10--set-egress-priorityを使用して、example-zoneゾーン内のegressトラフィックのゾーン優先度値を設定します。# firewall-cmd --permanent --zone example-zone --set-egress-priority 100永続的な設定をランタイムに適用します。
# firewall-cmd --reload
検証
両方のトラフィックタイプの優先度値を表示します。
# firewall-cmd --permanent --info-zone example-zone example-zone (active) target: default ingress-priority: -10 egress-priority: 100 icmp-block-inversion: no interfaces: eth0 ... services: dhcpv6-client mdns samba-client ssh ... forward: yes masquerade: no ...これらの値は、
example-zoneゾーン内のingressトラフィックがegressトラフィックより優先され、他のゾーンよりも優先されることを示します。
第2章 nftables の使用 リンクのコピーリンクがクリップボードにコピーされました!
firewalld で対処できる一般的なパケットフィルタリングのケースに当てはまらない場合、またはルールを完全に制御する必要がある場合は、nftables フレームワークを使用できます。
2.1. nftables とは リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークは、パケットを分類機能を提供し、iptables、ip6tables、arptables、ebtables、および ipset ユーティリティーの後継となります。利便性、機能、パフォーマンスにおいて、以前のパケットフィルタリングツールに多くの改良が追加されました。以下に例を示します。
- 線形処理の代わりに組み込みルックアップテーブルを使用
-
IPv4プロトコルおよびIPv6プロトコルに対する 1 つのフレームワーク - ルールセット全体を取得、更新、保存するのではなく、トランザクションを通じてカーネルルールセットをその場で更新する
-
ルールセットにおけるデバッグおよびトレースへの対応 (
nftrace) およびトレースイベントの監視 (nftツール) - より統一されたコンパクトな構文、プロトコル固有の拡張なし
- サードパーティーのアプリケーション用 Netlink API
nftables フレームワークは、テーブルを使用してチェーンを保存します。このチェーンには、アクションを実行する個々のルールが含まれます。nft ユーティリティーは、以前のパケットフィルタリングフレームワークのツールをすべて置き換えます。libnftnl ライブラリーを介して、nftables Netlink API との低レベルの対話に libnftables ライブラリーを使用できます。
ルールセット変更が適用されていることを表示するには、nft list ruleset コマンドを使用します。カーネルルールセットをクリアするには、nft flush ruleset コマンドを使用します。同じカーネルインフラストラクチャーを使用するため、iptables-nft コマンドによってインストールされるルールセットにも影響が出る可能性があることに注意してください。
2.2. firewalld または nftables を使用するタイミング リンクのコピーリンクがクリップボードにコピーされました!
RHEL は、ファイアウォールを設定するための nftables フレームワークと firewalld サービスを提供します。
Red Hat Enterprise Linux では、状況に応じて次のパケットフィルタリングユーティリティーを使用できます。
-
firewalld:firewalldユーティリティーは、一般的なユースケースのファイアウォール設定を簡素化します。 -
nftables:nftablesユーティリティーを使用して、ネットワーク全体など、複雑なパフォーマンスに関する重要なファイアウォールを設定します。
各ファイアウォール関連サービス (firewalld または nftables) が相互に影響を及ぼさないように、RHEL ホスト上でどちらかのサービスだけを実行し、もう一方のサービスを無効にしてください。
2.3. nftables フレームワークの概念 リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークは、iptables に代わる、最新かつ効率的で柔軟な代替手段です。ルール管理を簡素化され、パフォーマンスを向上させるため、複雑で高い性能が求められるネットワーク環境に最適な選択肢となります。
- テーブルと名前空間
-
nftablesでは、テーブルは関連するファイアウォールチェーン、セット、フローテーブル、およびその他のオブジェクトをグループ化する組織単位または名前空間を表します。nftablesでは、テーブルにより、ファイアウォールルールと関連コンポーネントをより柔軟に構造化できます。一方、iptablesでは、テーブルは特定の目的に合わせてより厳密に定義されていました。 - テーブルファミリー
-
nftables内の各テーブルは、特定のファミリー (ip、ip6、inet、arp、bridge、またはnetdev) に関連付けられています。この関連付けによって、テーブルが処理できるパケットが決まります。たとえば、ipファミリーのテーブルは IPv4 パケットのみを処理します。一方、inetはテーブルファミリーの特殊なケースです。これは IPv4 パケットと IPv6 パケットの両方を処理できるため、複数のプロトコルに対応した統一的なアプローチを実現します。特殊なテーブルファミリーのもう 1 つの例はnetdevです。これは、ネットワークデバイスに直接適用されるルールに使用され、デバイスレベルでのフィルタリングを可能にするためです。 - ベースチェーン
nftablesのベースチェーンは、パケット処理パイプライン内の高度に設定可能な項目です。これを使用すると、以下を指定できます。- チェーンのタイプ (例: "filter")
- パケット処理パスのフックポイント (例: "input"、"output"、"forward")
- チェーンの優先順位
この柔軟性により、パケットがネットワークスタックを通過するときにルールが適用されるタイミングと方法を正確に制御できます。チェーンの特殊なケースは
routeチェーンです。これは、パケットヘッダーに基づいてカーネルによって行われるルーティングの決定に影響を与えるために使用されます。- ルール処理用の仮想マシン
nftablesフレームワークは、ルールを処理するために内部仮想マシンを使用します。この仮想マシンは、アセンブリ言語の操作 (レジスターへのデータのロード、比較の実行など) に似た命令を実行します。このようなメカニズムにより、非常に柔軟かつ効率的なルール処理が可能になります。nftablesの機能拡張を、この仮想マシンの新しい命令として導入できます。これを行うには、通常、新しいカーネルモジュールと、libnftnlライブラリーおよびnftコマンドラインユーティリティーの更新が必要です。または、カーネルを変更することなく、既存の命令を新しい方法で組み合わせることで、新しい機能を導入することもできます。
nftablesルールの構文は、基盤となる仮想マシンの柔軟性を反映しています。たとえば、meta mark set tcp dport map { 22: 1, 80: 2 }というルールは、TCP 宛先ポートが 22 の場合にパケットのファイアウォールマークを 1 に設定し、ポートが 80 の場合に 2 に設定します。このように複雑なロジックを簡潔に表現できます。- 複雑なフィルタリングと決定マップ
nftablesフレームワークは、ipsetユーティリティーの機能を統合および拡張します。このユーティリティーは、iptablesにおいて IP アドレス、ポート、その他のデータタイプ、そして何よりもその組み合わせの一括マッチングに使用されるものです。この統合により、大規模で動的なデータセットをnftables内で直接管理することが容易になります。また、nftablesは、任意のデータ型の複数の値または範囲に基づいてパケットをマッチングすることをネイティブにサポートしています。これにより、複雑なフィルタリング要件を処理する機能が強化されています。nftablesを使用すると、パケット内の任意のフィールドを操作できます。nftablesでは、セットは名前付きまたは匿名のいずれかです。名前付きセットは複数のルールによって参照され、動的に変更できます。匿名セットはルール内でインラインで定義され、不変です。セットには、IP アドレスとポート番号のペアなど、異なるタイプの組み合わせである要素を含めることができます。この機能により、複雑な条件のマッチングにおける柔軟性が向上します。カーネルは、セットを管理するために、特定の要件 (パフォーマンス、メモリー効率など) に基づいて最も適切なバックエンドを選択できます。セットは、キーと値のペアを持つマップとしても機能できます。値の部分は、データポイント (パケットヘッダーに書き込む値) として、またはジャンプ先の決定やチェーンとして使用できます。これにより、"決定マップ" と呼ばれる複雑で動的なルール動作が可能になります。- 柔軟なルール形式
nftablesルールの構造はシンプルです。条件とアクションが左から右に順に適用されます。この直感的な形式により、ルールの作成とトラブルシューティングが簡素化されます。ルール内の条件は、論理的に (AND 演算子を使用して) 結合されます。そのため、ルールがマッチするには、すべての条件が "true" と評価される必要があります。いずれかの条件が失敗した場合、評価が次のルールに進みます。
nftables内のアクションは、dropやacceptなど、パケットのそれ以上のルール処理を停止する最終的なアクションにすることができます。counter log meta mark set 0x3などの非終端アクションは、特定のタスク (パケットのカウント、ロギング、マークの設定など) を実行しますが、後続のルールの評価を許可します。
2.4. nftables テーブル、チェーン、およびルールの作成および管理 リンクのコピーリンクがクリップボードにコピーされました!
nftables ルールセットを表示して管理できます。
2.4.1. nftables テーブルの基本 リンクのコピーリンクがクリップボードにコピーされました!
nftables のテーブルは、チェーン、ルール、セットなどのオブジェクトを含む名前空間です。
各テーブルにはアドレスファミリーが割り当てられている必要があります。アドレスファミリーは、このテーブルが処理するパケットタイプを定義します。テーブルを作成する際に、以下のいずれかのアドレスファミリーを設定できます。
-
ip- IPv4 パケットのみと一致します。アドレスファミリーを指定しないと、これがデフォルトになります。 -
ip6- IPv6 パケットのみと一致します。 -
inet- IPv4 パケットと IPv6 パケットの両方と一致します。 -
arp: IPv4 アドレス解決プロトコル (ARP) パケットと一致します。 -
bridge: ブリッジデバイスを通過するパケットに一致します。 -
netdev: ingress からのパケットに一致します。
テーブルを追加する場合、使用する形式はファイアウォールスクリプトにより異なります。
ネイティブ構文のスクリプトでは、以下を使用します。
table <table_address_family> <table_name> { }シェルスクリプトで、以下を使用します。
nft add table <table_address_family> <table_name>
2.4.2. nftables チェーンの基本 リンクのコピーリンクがクリップボードにコピーされました!
テーブルには、ルールのコンテナーとなるチェーンが含まれます。次の 2 つのチェーンタイプが存在します。
- ベースチェーン: ベースチェーンは、ネットワークスタックからのパケットのエントリーポイントとして機能します。
-
通常のチェーン:
jumpターゲットとして通常のチェーンを使用し、ルールをより適切に整理できます。
ベースチェーンをテーブルに追加する場合に使用する形式は、ファイアウォールスクリプトにより異なります。
ネイティブ構文のスクリプトでは、以下を使用します。
table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> policy <policy> ; } }シェルスクリプトで、以下を使用します。
nft add chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> \; policy <policy> \; }シェルがセミコロンをコマンドの最後として解釈しないようにするには、セミコロンの前にエスケープ文字
\を配置します。
どちらの例でも、ベースチェーン を作成します。通常のチェーン を作成する場合、中括弧内にパラメーターを設定しないでください。
チェーンタイプ:
チェーンタイプとそれらを使用できるアドレスファミリーとフックの概要を以下に示します。
| Type | アドレスファミリー | フック | 説明 |
|---|---|---|---|
|
| all | all | 標準のチェーンタイプ |
|
|
|
| このタイプのチェーンは、接続追跡エントリーに基づいてネイティブアドレス変換を実行します。接続の最初のパケットのみが通過します。 |
|
|
|
| このチェーンタイプを通過する許可済みパケットは、IP ヘッダーの関連部分が変更された場合に、新しいルートルックアップを引き起こします。 |
チェーンの優先度:
priority パラメーターは、パケットが同じフック値を持つチェーンを通過する順序を指定します。このパラメーターは、整数値に設定することも、標準の priority 名を使用することもできます。
以下のマトリックスは、標準的な priority 名とその数値の概要、それらを使用できるファミリーおよびフックの概要です。
| テキストの値 | 数値 | アドレスファミリー | フック |
|---|---|---|---|
|
|
|
| all |
|
|
|
| all |
|
|
|
|
|
|
|
|
| |
|
|
|
| all |
|
|
| all | |
|
|
|
| all |
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
チェーンポリシー:
チェーンポリシーは、このチェーン内のルールでアクションが指定されていない場合に、nftables が パケットを受け入れるか破棄するかを定義します。チェーンには、以下のいずれかのポリシーを設定できます。
-
accept(デフォルト) -
drop
2.4.3. nftables ルールの基本 リンクのコピーリンクがクリップボードにコピーされました!
ルールは、このルールを含むチェーンを渡すパケットに対して実行するアクションを定義します。ルールに一致する式も含まれる場合、nftables は、以前の式がすべて適用されている場合にのみアクションを実行します。
チェーンにルールを追加する場合、使用する形式はファイアウォールスクリプトにより異なります。
ネイティブ構文のスクリプトでは、以下を使用します。
table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> ; policy <policy> ; <rule> } }シェルスクリプトで、以下を使用します。
nft add rule <table_address_family> <table_name> <chain_name> <rule>このシェルコマンドは、チェーンの最後に新しいルールを追加します。チェーンの先頭にルールを追加する場合は、
nft addの代わりにnft insertコマンドを使用します。
2.4.4. nft コマンドを使用したテーブル、チェーン、ルールの管理 リンクのコピーリンクがクリップボードにコピーされました!
コマンドラインまたはシェルスクリプトで nftables ファイアウォールを管理するには、nft ユーティリティーを使用します。
この手順のコマンドは通常のワークフローを表しておらず、最適化されていません。この手順では、nft コマンドを使用して、一般的なテーブル、チェーン、およびルールを管理する方法を説明します。
手順
テーブルが IPv4 パケットと IPv6 パケットの両方を処理できるように、
inetアドレスファミリーを使用してnftables_svcという名前のテーブルを作成します。# nft add table inet nftables_svc受信ネットワークトラフィックを処理する
INPUTという名前のベースチェーンをinet nftables_svcテーブルに追加します。# nft add chain inet nftables_svc INPUT { type filter hook input priority filter \; policy accept \; }シェルがセミコロンをコマンドの最後として解釈しないようにするには、
\文字を使用してセミコロンをエスケープします。INPUTチェーンにルールを追加します。たとえば、INPUTチェーンの最後のルールとして、ポート 22 および 443 で着信 TCP トラフィックを許可し、他の着信トラフィックを、Internet Control Message Protocol (ICMP) ポートに到達できないというメッセージで拒否します。# nft add rule inet nftables_svc INPUT tcp dport 22 accept # nft add rule inet nftables_svc INPUT tcp dport 443 accept # nft add rule inet nftables_svc INPUT reject with icmpx type port-unreachableここで示されたように
nft add ruleコマンドを実行すると、nftはコマンド実行と同じ順序でルールをチェーンに追加します。ハンドルを含む現在のルールセットを表示します。
# nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 443 accept # handle 3 reject # handle 4 } }ハンドル 3 で既存ルールの前にルールを挿入します。たとえば、ポート 636 で TCP トラフィックを許可するルールを挿入するには、以下を入力します。
# nft insert rule inet nftables_svc INPUT handle 3 tcp dport 636 acceptハンドル 3 で、既存ルールの後ろにルールを追加します。たとえば、ポート 80 で TCP トラフィックを許可するルールを追加するには、以下を入力します。
# nft add rule inet nftables_svc INPUT handle 3 tcp dport 80 acceptハンドルでルールセットを再表示します。後で追加したルールが指定の位置に追加されていることを確認します。
# nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 636 accept # handle 5 tcp dport 443 accept # handle 3 tcp dport 80 accept # handle 6 reject # handle 4 } }ハンドル 6 でルールを削除します。
# nft delete rule inet nftables_svc INPUT handle 6ルールを削除するには、ハンドルを指定する必要があります。
ルールセットを表示し、削除されたルールがもう存在しないことを確認します。
# nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 636 accept # handle 5 tcp dport 443 accept # handle 3 reject # handle 4 } }INPUTチェーンから残りのルールをすべて削除します。# nft flush chain inet nftables_svc INPUTルールセットを表示し、
INPUTチェーンが空であることを確認します。# nft list table inet nftables_svc table inet nftables_svc { chain INPUT { type filter hook input priority filter; policy accept } }INPUTチェーンを削除します。# nft delete chain inet nftables_svc INPUTこのコマンドを使用して、まだルールが含まれているチェーンを削除することもできます。
ルールセットを表示し、
INPUTチェーンが削除されたことを確認します。# nft list table inet nftables_svc table inet nftables_svc { }nftables_svcテーブルを削除します。# nft delete table inet nftables_svcこのコマンドを使用して、まだルールが含まれているテーブルを削除することもできます。
注記ルールセット全体を削除するには、個別のコマンドですべてのルール、チェーン、およびテーブルを手動で削除するのではなく、
nft flush rulesetコマンドを使用します。
2.5. nftables を使用した NAT の設定 リンクのコピーリンクがクリップボードにコピーされました!
nftables を使用すると、マスカレード、ソース (SNAT)、宛先 NAT (DNAT)、およびリダイレクトというタイプを設定できます。NAT を使用すると、送信元または宛先の IP アドレスを変更できます。
2.5.1. NAT タイプ リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークは、さまざまなネットワークアドレス変換 (NAT) タイプをサポートしています。
- マスカレードおよびソースの NAT (SNAT)
この NAT タイプのいずれかを使用して、パケットのソース IP アドレスを変更します。たとえば、インターネットサービスプロバイダー (ISP) は、プライベート IP 範囲 (
10.0.0.0/8など) をルーティングしません。ネットワークでプライベート IP 範囲を使用し、ユーザーがインターネット上のサーバーにアクセスできるようにする必要がある場合は、この範囲のパケットのソース IP アドレスをパブリック IP アドレスにマップします。マスカレードと SNAT は互いに非常に似ています。相違点は次のとおりです。
- マスカレードは、出力インターフェイスの IP アドレスを自動的に使用します。したがって、出力インターフェイスが動的 IP アドレスを使用する場合は、マスカレードを使用します。
- SNAT は、パケットのソース IP アドレスを指定された IP に設定し、出力インターフェイスの IP アドレスを動的に検索しません。そのため、SNAT の方がマスカレードよりも高速です。出力インターフェイスが固定 IP アドレスを使用する場合は、SNAT を使用します。
- 宛先 NAT (DNAT)
- この NAT タイプを使用して、着信パケットの宛先アドレスとポートを書き換えます。たとえば、Web サーバーがプライベート IP 範囲の IP アドレスを使用しているため、インターネットから直接アクセスできない場合は、ルーターに DNAT ルールを設定し、着信トラフィックをこのサーバーにリダイレクトできます。
- リダイレクト
- このタイプは、チェーンフックに応じてパケットをローカルマシンにリダイレクトする DNAT の特殊なケースです。たとえば、サービスが標準ポートとは異なるポートで実行する場合は、標準ポートからこの特定のポートに着信トラフィックをリダイレクトすることができます。
2.5.2. nftables を使用したマスカレードの設定 リンクのコピーリンクがクリップボードにコピーされました!
マスカレードを使用すると、ルーターは、インターフェイスを介して送信されるパケットのソース IP を、インターフェイスの IP アドレスに動的に変更できます。これは、インターフェイスに新しい IP が割り当てられている場合に、nftables はソース IP の置き換え時に新しい IP を自動的に使用することを意味します。
ens3 インターフェイスを介してホストから出るパケットの送信元 IP を、ens3 で設定された IP に置き換えます。
手順
テーブルを作成します。
# nft add table natテーブルに
postroutingチェーンを追加します。# nft add chain nat postrouting { type nat hook postrouting priority 100 \; }postroutingチェーンに、ens3インターフェイスの出力パケットに一致するルールを追加します。# nft add rule nat postrouting oifname "ens3" masquerade重要iifnameパラメーターおよびoifnameパラメーターでは実インターフェイス名のみを使用でき、代替名 (altname) には対応していません。
2.5.3. nftables を使用したソース NAT の設定 リンクのコピーリンクがクリップボードにコピーされました!
ルーターでは、ソース NAT(SNAT) を使用して、インターフェイスを介して送信されるパケットの IP アドレスを特定の IP アドレスに変更できます。次に、ルーターは送信パケットのソース IP を置き換えます。
手順
テーブルを作成します。
# nft add table natテーブルに
postroutingチェーンを追加します。# nft add chain nat postrouting { type nat hook postrouting priority 100 \; }ens3を介した発信パケットのソース IP を192.0.2.1に置き換えるルールをpostroutingチェーンに追加します。# nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1
2.5.4. nftables を使用した宛先 NAT の設定 リンクのコピーリンクがクリップボードにコピーされました!
宛先 NAT(DNAT) を使用すると、ルーター上のトラフィックを、インターネットから直接アクセスできないホストにリダイレクトできます。
たとえば、DNAT を使用すると、ルーターはポート 80 および 443 に送信された受信トラフィックを、IP アドレス 192.0.2.1 の Web サーバーにリダイレクトします。
手順
テーブルを作成します。
# nft add table natテーブルに、
preroutingチェーンおよびpostroutingチェーンを追加します。# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }--オプションをnftコマンドに渡して、シェルが負の priority 値をnftコマンドのオプションとして解釈しないようにする必要があることに注意してください。preroutingチェーンに、ルーターのens3インターフェイスのポート80および443への受信トラフィックを、IP アドレス192.0.2.1の Web サーバーにリダイレクトするルールを追加します。# nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1環境に応じて、SNAT ルールまたはマスカレードルールを追加して、Web サーバーから返されるパケットのソースアドレスを送信者に変更します。
ens3インターフェイスが動的 IP アドレスを使用している場合は、マスカレードルールを追加します。# nft add rule nat postrouting oifname "ens3" masqueradeens3インターフェイスが静的 IP アドレスを使用する場合は、SNAT ルールを追加します。たとえば、ens3が IP アドレス198.51.100.1を使用している場合は、以下のようになります。# nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
パケット転送を有効にします。
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
2.5.5. nftables を使用したリダイレクトの設定 リンクのコピーリンクがクリップボードにコピーされました!
redirect 機能は、チェーンフックに応じてパケットをローカルマシンにリダイレクトする宛先ネットワークアドレス変換 (DNAT) の特殊なケースです。
たとえば、ローカルホストのポート 22 に送信された着信および転送されたトラフィックを 2222 ポートにリダイレクトすることができます。
手順
テーブルを作成します。
# nft add table natテーブルに
preroutingチェーンを追加します。# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }--オプションをnftコマンドに渡して、シェルが負の priority 値をnftコマンドのオプションとして解釈しないようにする必要があることに注意してください。22ポートの着信トラフィックを2222ポートにリダイレクトするルールをpreroutingチェーンに追加します。# nft add rule nat prerouting tcp dport 22 redirect to 2222
2.6. nftables スクリプトの作成と実行 リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークを使用する主な利点は、スクリプトの実行がアトミックであることです。つまり、システムがスクリプト全体を適用するか、エラーが発生した場合には実行を阻止することを意味します。これにより、ファイアウォールは常に一貫した状態になります。
さらに、nftables スクリプト環境を使用すると、次のことができます。
- コメントの追加
- 変数の定義
- 他のルールセットファイルの組み込み
nftables パッケージをインストールすると、RHEL は /etc/nftables/ ディレクトリーに *.nft スクリプトを自動的に作成します。このスクリプトは、さまざまな目的でテーブルと空のチェーンを作成するコマンドが含まれます。
2.6.1. 対応している nftables スクリプトの形式 リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークは、さまざまな形式のスクリプトをサポートしています。
使用できる形式は次のとおりです。
nft list rulesetコマンドと同じ形式でルールセットが表示されます。#!/usr/sbin/nft -f # Flush the rule set flush ruleset table inet example_table { chain example_chain { # Chain for incoming packets that drops all packets that # are not explicitly allowed by any rule in this chain type filter hook input priority 0; policy drop; # Accept connections to port 22 (ssh) tcp dport ssh accept } }nftコマンドと同じ構文:#!/usr/sbin/nft -f # Flush the rule set flush ruleset # Create a table add table inet example_table # Create a chain for incoming packets that drops all packets # that are not explicitly allowed by any rule in this chain add chain inet example_table example_chain { type filter hook input priority 0 ; policy drop ; } # Add a rule that accepts connections to port 22 (ssh) add rule inet example_table example_chain tcp dport ssh accept
2.6.2. nftables スクリプトの実行 リンクのコピーリンクがクリップボードにコピーされました!
nftables スクリプトは、nft ユーティリティーに渡すか、スクリプトを直接実行することで実行できます。
手順
nftablesスクリプトをnftユーティリティーに渡して実行するには、次のコマンドを実行します。# nft -f /etc/nftables/<example_firewall_script>.nftnftablesスクリプトを直接実行するには、次のコマンドを実行します。1 回だけ実行する場合:
スクリプトが以下のシバンシーケンスで始まることを確認します。
#!/usr/sbin/nft -f重要-fパラメーターを指定しないと、nftユーティリティーはスクリプトを読み取らず、Error: syntax error, unexpected newline, expecting stringを表示します。必要に応じて、スクリプトの所有者を
rootに設定します。# chown root /etc/nftables/<example_firewall_script>.nft所有者のスクリプトを実行ファイルに変更します。
# chmod u+x /etc/nftables/<example_firewall_script>.nft
スクリプトを実行します。
# /etc/nftables/<example_firewall_script>.nft何も出力が表示されない場合、システムはスクリプトを正常に実行しました。
重要nft がスクリプトを正常に実行したとしても、ルールが正しく配置されていなかったり、パラメーターが不足していたり、スクリプトにその他の問題があったりすると、ファイアウォールが期待どおりに動作しない可能性があります。
2.6.3. nftables スクリプトでコメントの使用 リンクのコピーリンクがクリップボードにコピーされました!
nftables スクリプト環境は、# 文字の右側から行末までのすべてをコメントとして解釈します。
コメントは、行の先頭またはコマンドの横から開始できます。
...
# Flush the rule set
flush ruleset
add table inet example_table # Create a table
...
2.6.4. nftables スクリプトでの変数の使用 リンクのコピーリンクがクリップボードにコピーされました!
nftables スクリプトで変数を定義するには、define キーワードを使用します。シングル値および匿名セットを変数に保存できます。より複雑なシナリオの場合は、セットまたは決定マップを使用します。
- 値を 1 つ持つ変数
以下の例は、値が
enp1s0のINET_DEVという名前の変数を定義します。define INET_DEV = enp1s0スクリプトで変数を使用するには、
$記号と、それに続く変数名を指定します。... add rule inet example_table example_chain iifname $INET_DEV tcp dport ssh accept ...- 匿名セットを含む変数
以下の例では、匿名セットを含む変数を定義します。
define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }スクリプトで変数を使用するには、
$記号と、それに続く変数名を指定します。add rule inet example_table example_chain ip daddr $DNS_SERVERS accept注記中括弧は、変数がセットを表していることを示すため、ルールで使用する場合は、特別なセマンティクスを持ちます。
2.6.5. nftables スクリプトへのファイルの追加 リンクのコピーリンクがクリップボードにコピーされました!
nftables スクリプト環境では、include ステートメントを使用して他のスクリプトを含めることができます。
絶対パスまたは相対パスのないファイル名のみを指定すると、nftables には、デフォルトの検索パスのファイルが含まれます。これは、RHEL では /etc に設定されています。
例2.1 デフォルト検索ディレクトリーからのファイルを含む
デフォルトの検索ディレクトリーからファイルを指定するには、次のコマンドを実行します。
include "example.nft"
例2.2 ディレクトリーの *.nft ファイルをすべて含む
*.nft で終わるすべてのファイルを /etc/nftables/rulesets/ ディレクトリーに保存するには、次のコマンドを実行します。
include "/etc/nftables/rulesets/*.nft"
include ステートメントは、ドットで始まるファイルに一致しないことに注意してください。
詳細は、システム上の nft(8) man ページの Include files セクションを参照してください。
2.6.6. システムの起動時に nftables ルールの自動読み込み リンクのコピーリンクがクリップボードにコピーされました!
systemd サービス nftables は、/etc/sysconfig/nftables.conf ファイルに含まれるファイアウォールスクリプトを読み込みます。
前提条件
-
nftablesスクリプトは、/etc/nftables/ディレクトリーに保存されます。
手順
/etc/sysconfig/nftables.confファイルを編集します。-
nftablesパッケージのインストールで/etc/nftables/に作成された*.nftスクリプトを変更した場合は、これらのスクリプトのincludeステートメントのコメントを解除します。 新しいスクリプトを作成した場合は、
includeステートメントを追加してこれらのスクリプトを含めます。たとえば、nftablesサービスの起動時に/etc/nftables/example.nftスクリプトを読み込むには、以下を追加します。include "/etc/nftables/example.nft"
-
オプション:
nftablesサービスを開始して、システムを再起動せずにファイアウォールルールを読み込みます。# systemctl start nftablesnftablesサービスを有効にします。# systemctl enable nftables
2.7. nftables コマンドでのセットの使用 リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークは、セットをネイティブに対応します。たとえば、セットを使用して、複数の IP アドレス、ポート番号、インターフェイス、またはその他のマッチング条件を照合することができます。
2.7.1. nftables での匿名セットの使用 リンクのコピーリンクがクリップボードにコピーされました!
匿名セットには、ルールで直接使用する { 22, 80, 443 } などの中括弧で囲まれたコンマ区切りの値が含まれます。IP アドレスやその他の一致基準にも匿名セットを使用できます。
匿名セットの欠点は、セットを変更する場合はルールを置き換える必要があることです。動的なソリューションの場合は、nftables で名前付きセットの使用 で説明されているように名前付きセットを使用します。
前提条件
-
inetファミリーにexample_chainチェーンおよびexample_tableテーブルがある。
手順
たとえば、ポート
22、80、および443に着信トラフィックを許可するルールを、example_tableのexample_chainに追加するには、次のコマンドを実行します。# nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } acceptオプション:
example_tableですべてのチェーンとそのルールを表示します。# nft list table inet example_table table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport { ssh, http, https } accept } }
2.7.2. nftables で名前付きセットの使用 リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークは、変更可能な名前付きセットに対応します。名前付きセットは、テーブル内の複数のルールで使用できる範囲のリストです。匿名セットに対する別の利点として、セットを使用するルールを置き換えることなく、名前付きセットを更新できます。
名前付きセットを作成する場合は、セットに含まれる要素のタイプを指定する必要があります。以下のタイプを設定できます。
-
192.0.2.1や192.0.2.0/24など、IPv4 アドレスまたは範囲を含むセットの場合はipv4_addr。 -
2001:db8:1::1や2001:db8:1::/64など、IPv6 アドレスまたは範囲を含むセットの場合はipv6_addr。 -
52:54:00:6b:66:42など、メディアアクセス制御 (MAC) アドレスの一覧を含むセットの場合はether_addr。 -
tcpなど、インターネットプロトコルタイプの一覧が含まれるセットの場合はinet_proto。 -
sshなど、インターネットサービスの一覧を含むセットの場合はinet_service。 -
パケットマークの一覧を含むセットの場合は
mark。パケットマークは、任意の 32 ビットの正の整数値 (0から2147483647) にすることができます。
前提条件
-
example_chainチェーンとexample_tableテーブルが存在する。
手順
空のファイルを作成します。以下の例では、IPv4 アドレスのセットを作成します。
複数の IPv4 アドレスを格納することができるセットを作成するには、次のコマンドを実行します。
# nft add set inet example_table example_set { type ipv4_addr \; }IPv4 アドレス範囲を保存できるセットを作成するには、次のコマンドを実行します。
# nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
重要シェルがセミコロンをコマンドの終わりとして解釈しないようにするには、バックスラッシュでセミコロンをエスケープする必要があります。
オプション: セットを使用するルールを作成します。たとえば、次のコマンドは、
example_tableのexample_chainに、example_setの IPv4 アドレスからのすべてのパケットを破棄するルールを追加します。# nft add rule inet example_table example_chain ip saddr @example_set dropexample_setが空のままなので、ルールには現在影響がありません。IPv4 アドレスを
example_setに追加します。個々の IPv4 アドレスを保存するセットを作成する場合は、次のコマンドを実行します。
# nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }IPv4 範囲を保存するセットを作成する場合は、次のコマンドを実行します。
# nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }IP アドレス範囲を指定する場合、代わりに Classless Inter-Domain Routing (CIDR) 表記を使用することもできます。例にある
192.0.2.0/24などがその例です。
2.7.3. 動的セットを使用してパケットパスからエントリーを追加する リンクのコピーリンクがクリップボードにコピーされました!
nftables の動的セットは、パケットデータから IP アドレス、ポート、MAC アドレスなどの要素を自動的に追加します。これにより、リアルタイムのデータ収集が可能になり、動的な拒否リストまたは禁止リストが作成され、セキュリティーの脅威に即座に対応できるようになります。
前提条件
-
inetファミリーにexample_chainチェーンおよびexample_tableテーブルがある。
手順
空のファイルを作成します。以下の例では、IPv4 アドレスのセットを作成します。
複数の IPv4 アドレスを格納することができるセットを作成するには、次のコマンドを実行します。
# nft add set inet example_table example_set { type ipv4_addr \; }IPv4 アドレス範囲を保存できるセットを作成するには、次のコマンドを実行します。
# nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }重要シェルがセミコロンをコマンドの終わりとして解釈しないようにするには、バックスラッシュでセミコロンをエスケープする必要があります。
着信パケットの送信元 IPv4 アドレスを
example_setセットに動的に追加するためのルールを作成します。# nft add rule inet example_table example_chain set add ip saddr @example_setこのコマンドは、
example_chainルールチェーンとexample_table内に新しいルールを作成し、パケットの送信元 IPv4 アドレスをexample_setに動的に追加します。
検証
ルールが追加されたことを確認します。
# nft list ruleset ... table ip example_table { set example_set { type ipv4_addr elements = { 192.0.2.250, 192.0.2.251 } } chain example_chain { type filter hook input priority 0 add @example_set { ip saddr } } }このコマンドは、現在
nftablesにロードされているルールセット全体を表示します。これは、IP がルールをアクティブにトリガーしており、example_setが適切なアドレスで更新されていることを示しています。
次のステップ
動的 IP アドレスのセットを取得したら、それをさまざまなセキュリティー、フィルタリング、トラフィック制御の目的で使用できます。以下に例を示します。
- ネットワークトラフィックをブロック、制限、またはログに記録する
- 信頼済みユーザーを禁止しないように、許可リストと組み合わせて使用する
- 過剰なブロックを防ぐために自動タイムアウトを使用する
2.8. nftables コマンドにおける決定マップの使用 リンクのコピーリンクがクリップボードにコピーされました!
ディクショナリーとしても知られている決定マップにより、nft は一致基準をアクションにマッピングすることで、パケット情報に基づいてアクションを実行できます。
2.8.1. nftables での匿名マップの使用 リンクのコピーリンクがクリップボードにコピーされました!
匿名マップは、ルールで直接使用する { match_criteria : action } ステートメントです。ステートメントには、複数のコンマ区切りマッピングを含めることができます。
匿名マップの欠点は、マップを変更する場合には、ルールを置き換える必要があることです。動的なソリューションの場合は、nftables での名前付きマップの使用 で説明されているように名前付きマップを使用します。
たとえば、匿名マップを使用して、IPv4 プロトコルおよび IPv6 プロトコルの TCP パケットと UDP パケットの両方を異なるチェーンにルーティングし、着信 TCP パケットと UDP パケットを個別にカウントできます。
手順
新しいテーブルを作成します。
# nft add table inet example_tableexample_tableにtcp_packetsチェーンを作成します。# nft add chain inet example_table tcp_packetsこのチェーンのトラフィックをカウントする
tcp_packetsにルールを追加します。# nft add rule inet example_table tcp_packets counterexample_tableでudp_packetsチェーンを作成します。# nft add chain inet example_table udp_packetsこのチェーンのトラフィックをカウントする
udp_packetsにルールを追加します。# nft add rule inet example_table udp_packets counter着信トラフィックのチェーンを作成します。たとえば、
example_tableに、着信トラフィックをフィルタリングするincoming_trafficという名前のチェーンを作成するには、次のコマンドを実行します。# nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }匿名マップを持つルールを
incoming_trafficに追加します。# nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }匿名マップはパケットを区別し、プロトコルに基づいて別のカウンターチェーンに送信します。
トラフィックカウンターの一覧を表示する場合は、
example_tableを表示します。# nft list table inet example_table table inet example_table { chain tcp_packets { counter packets 36379 bytes 2103816 } chain udp_packets { counter packets 10 bytes 1559 } chain incoming_traffic { type filter hook input priority filter; policy accept; ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets } } }tcp_packetsチェーンおよびudp_packetsチェーンのカウンターは、受信パケットとバイトの両方を表示します。
2.8.2. nftables での名前付きマップの使用 リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークは、名前付きマップに対応します。テーブルの複数のルールでこのマップを使用できます。匿名マップに対する別の利点は、名前付きマップを使用するルールを置き換えることなく、名前付きマップを更新できることです。
名前付きマップを作成する場合は、要素のタイプを指定する必要があります。
-
一致する部分に
192.0.2.1などの IPv4 アドレスが含まれるマップの場合はipv4_addr。 -
一致する部分に
2001:db8:1::1などの IPv6 アドレスが含まれるマップの場合はipv6_addr。 -
52:54:00:6b:66:42などのメディアアクセス制御 (MAC) アドレスを含むマップの場合はether_addr。 -
一致する部分に
tcpなどのインターネットプロトコルタイプが含まれるマップの場合はinet_proto。 -
一致する部分に
sshや22などのインターネットサービス名のポート番号が含まれるマップの場合はinet_service。 -
一致する部分にパケットマークが含まれるマップの場合は
mark。パケットマークは、任意の正の 32 ビットの整数値 (0~2147483647) にできます。
たとえば、送信元 IP アドレスに基づいて着信パケットを許可または拒否できます。名前付きマップを使用すると、このシナリオを設定するのに必要なルールは 1 つだけで、IP アドレスとアクションがマップに動的に保存されます。
手順
テーブルを作成します。たとえば、IPv4 パケットを処理する
example_tableという名前のテーブルを作成するには、次のコマンドを実行します。# nft add table ip example_tableチェーンを作成します。たとえば、
example_tableに、example_chainという名前のチェーンを作成するには、次のコマンドを実行します。# nft add chain ip example_table example_chain { type filter hook input priority 0 \; }重要シェルがセミコロンをコマンドの終わりとして解釈しないようにするには、バックスラッシュでセミコロンをエスケープする必要があります。
空のマップを作成します。たとえば、IPv4 アドレスのマッピングを作成するには、次のコマンドを実行します。
# nft add map ip example_table example_map { type ipv4_addr : verdict \; }マップを使用するルールを作成します。たとえば、次のコマンドは、両方とも
example_mapで定義されている IPv4 アドレスにアクションを適用するルールを、example_tableのexample_chainに追加します。# nft add rule example_table example_chain ip saddr vmap @example_mapIPv4 アドレスと対応するアクションを
example_mapに追加します。# nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }以下の例では、IPv4 アドレスのアクションへのマッピングを定義します。上記で作成したルールと組み合わせることで、このファイアウォールは
192.0.2.1からのパケットを許可し、192.0.2.2からのパケットを破棄します。オプション: 別の IP アドレスおよび action ステートメントを追加してマップを拡張します。
# nft add element ip example_table example_map { 192.0.2.3 : accept }オプション: マップからエントリーを削除します。
# nft delete element ip example_table example_map { 192.0.2.1 }オプション: ルールセットを表示します。
# nft list ruleset table ip example_table { map example_map { type ipv4_addr : verdict elements = { 192.0.2.2 : drop, 192.0.2.3 : accept } } chain example_chain { type filter hook input priority filter; policy accept; ip saddr vmap @example_map } }
2.9. 例: nftables スクリプトを使用した LAN および DMZ の保護 リンクのコピーリンクがクリップボードにコピーされました!
RHEL ルーターで nftables フレームワークを使用して、内部 LAN 内のネットワーククライアントと DMZ の Web サーバーを、インターネットやその他のネットワークからの不正アクセスから保護するファイアウォールスクリプトを作成およびインストールします。
この例はデモ目的専用で、特定の要件があるシナリオを説明しています。
ファイアウォールスクリプトは、ネットワークインフラストラクチャーとセキュリティー要件に大きく依存します。この例を使用して、独自の環境用のスクリプトを作成する際に nftables ファイアウォールの概念を理解してください。
2.9.1. ネットワークの状態 リンクのコピーリンクがクリップボードにコピーされました!
この例のネットワークには、以下の条件があります。
ルーターは以下のネットワークに接続されています。
-
インターフェイス
enp1s0を介したインターネット -
インターフェイス
enp7s0を介した内部 LAN -
enp8s0までの DMZ
-
インターフェイス
-
ルーターのインターネットインターフェイスには、静的 IPv4 アドレス (
203.0.113.1) と IPv6 アドレス (2001:db8:a::1) の両方が割り当てられています。 -
内部 LAN のクライアントは
10.0.0.0/24の範囲のプライベート IPv4 アドレスのみを使用します。その結果、LAN からインターネットへのトラフィックには、送信元ネットワークアドレス変換 (SNAT) が必要です。 -
内部 LAN の管理者用 PC は、IP アドレス
10.0.0.100および10.0.0.200を使用します。 -
DMZ は、
198.51.100.0/24および2001:db8:b::/56の範囲のパブリック IP アドレスを使用します。 -
DMZ の Web サーバーは、IP アドレス
198.51.100.5および2001:db8:b::5を使用します。 - ルーターは、LAN および DMZ 内のホストのキャッシング DNS サーバーとして機能します。
2.9.2. ファイアウォールスクリプトのセキュリティー要件 リンクのコピーリンクがクリップボードにコピーされました!
以下は、この例のネットワークにおける nftables ファイアウォールの要件です。
ルーターは以下を実行できる必要があります。
- DNS クエリーを再帰的に解決します。
- ループバックインターフェイスですべての接続を実行します。
内部 LAN のクライアントは以下を実行できる必要があります。
- ルーターで実行しているキャッシング DNS サーバーをクエリーします。
- DMZ の HTTPS サーバーにアクセスします。
- インターネット上の任意の HTTPS サーバーにアクセスします。
- 管理者用の PC は、SSH を使用してルーターと DMZ 内のすべてのサーバーにアクセスできる必要があります。
DMZ の Web サーバーは以下を実行できる必要があります。
- ルーターで実行しているキャッシング DNS サーバーをクエリーします。
- インターネット上の HTTPS サーバーにアクセスして更新をダウンロードします。
インターネット上のホストは以下を実行できる必要があります。
- DMZ の HTTPS サーバーにアクセスします。
さらに、以下のセキュリティー要件が存在します。
- 明示的に許可されていない接続試行は破棄する。
- パケット損失のログを記録します。
2.9.3. ドロップされたパケットをファイルにロギングするための設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、systemd は、ドロップされたパケットなどのカーネルメッセージをジャーナルに記録します。さらに、このようなエントリーを別のファイルに記録するように rsyslog サービスを設定することもできます。ログファイルが無限に大きくならないようにするために、ローテーションポリシーを設定します。
前提条件
-
rsyslogパッケージがインストールされている。 -
rsyslogサービスが実行されている。
手順
以下の内容で
/etc/rsyslog.d/nftables.confファイルを作成します。:msg, startswith, "nft drop" -/var/log/nftables.log & stopこの設定を使用すると、
rsyslogサービスはドロップされたパケットを/var/log/messagesではなく/var/log/nftables.logファイルに記録します。rsyslogサービスを再起動します。# systemctl restart rsyslogサイズが 10 MB を超える場合は、以下の内容で
/etc/logrotate.d/nftablesファイルを作成し、/var/log/nftables.logをローテーションします。/var/log/nftables.log { size +10M maxage 30 sharedscripts postrotate /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true endscript }maxage 30設定は、次のローテーション操作中にlogrotateが 30 日経過したローテーション済みログを削除することを定義します。
2.9.4. nftables スクリプトの作成とアクティブ化 リンクのコピーリンクがクリップボードにコピーされました!
この例は、RHEL ルーターで実行され、DMZ の内部 LAN および Web サーバーのクライアントを保護する nftables ファイアウォールスクリプトです。
この例で使用されているネットワークとファイアウォールの要件の詳細は、ファイアウォールスクリプトの ネットワークの状態 および ファイアウォールスクリプトのセキュリティー要件 を参照してください。
この nftables ファイアウォールスクリプトは、デモ専用です。お使いの環境やセキュリティー要件に適応させて使用してください。
前提条件
- ネットワークは、ネットワークの状態 で説明されているとおりに設定されます。
手順
以下の内容で
/etc/nftables/firewall.nftスクリプトを作成します。# Remove all rules flush ruleset # Table for both IPv4 and IPv6 rules table inet nftables_svc { # Define variables for the interface name define INET_DEV = enp1s0 define LAN_DEV = enp7s0 define DMZ_DEV = enp8s0 # Set with the IPv4 addresses of admin PCs set admin_pc_ipv4 { type ipv4_addr elements = { 10.0.0.100, 10.0.0.200 } } # Chain for incoming traffic. Default policy: drop chain INPUT { type filter hook input priority filter policy drop # Accept packets in established and related state, drop invalid packets ct state vmap { established:accept, related:accept, invalid:drop } # Accept incoming traffic on loopback interface iifname lo accept # Allow request from LAN and DMZ to local DNS server iifname { $LAN_DEV, $DMZ_DEV } meta l4proto { tcp, udp } th dport 53 accept # Allow admins PCs to access the router using SSH iifname $LAN_DEV ip saddr @admin_pc_ipv4 tcp dport 22 accept # Last action: Log blocked packets # (packets that were not accepted in previous rules in this chain) log prefix "nft drop IN : " } # Chain for outgoing traffic. Default policy: drop chain OUTPUT { type filter hook output priority filter policy drop # Accept packets in established and related state, drop invalid packets ct state vmap { established:accept, related:accept, invalid:drop } # Accept outgoing traffic on loopback interface oifname lo accept # Allow local DNS server to recursively resolve queries oifname $INET_DEV meta l4proto { tcp, udp } th dport 53 accept # Last action: Log blocked packets log prefix "nft drop OUT: " } # Chain for forwarding traffic. Default policy: drop chain FORWARD { type filter hook forward priority filter policy drop # Accept packets in established and related state, drop invalid packets ct state vmap { established:accept, related:accept, invalid:drop } # IPv4 access from LAN and internet to the HTTPS server in the DMZ iifname { $LAN_DEV, $INET_DEV } oifname $DMZ_DEV ip daddr 198.51.100.5 tcp dport 443 accept # IPv6 access from internet to the HTTPS server in the DMZ iifname $INET_DEV oifname $DMZ_DEV ip6 daddr 2001:db8:b::5 tcp dport 443 accept # Access from LAN and DMZ to HTTPS servers on the internet iifname { $LAN_DEV, $DMZ_DEV } oifname $INET_DEV tcp dport 443 accept # Last action: Log blocked packets log prefix "nft drop FWD: " } # Postrouting chain to handle SNAT chain postrouting { type nat hook postrouting priority srcnat; policy accept; # SNAT for IPv4 traffic from LAN to internet iifname $LAN_DEV oifname $INET_DEV snat ip to 203.0.113.1 } }/etc/nftables/firewall.nftスクリプトを/etc/sysconfig/nftables.confファイルに追加します。include "/etc/nftables/firewall.nft"IPv4 転送を有効にします。
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.confnftablesサービスを有効にして起動します。# systemctl enable --now nftables
検証
オプション:
nftablesルールセットを確認します。# nft list ruleset ...ファイアウォールが阻止するアクセスの実行を試みます。たとえば、DMZ から SSH を使用してルーターにアクセスします。
# ssh router.example.com ssh: connect to host router.example.com port 22: Network is unreachableロギング設定に応じて、以下を検索します。
ブロックされたパケットの
systemdジャーナル:# journalctl -k -g "nft drop" Oct 14 17:27:18 router kernel: nft drop IN : IN=enp8s0 OUT= MAC=... SRC=198.51.100.5 DST=198.51.100.1 ... PROTO=TCP SPT=40464 DPT=22 ... SYN ...ブロックされたパケットの
/var/log/nftables.logファイル:Oct 14 17:27:18 router kernel: nft drop IN : IN=enp8s0 OUT= MAC=... SRC=198.51.100.5 DST=198.51.100.1 ... PROTO=TCP SPT=40464 DPT=22 ... SYN ...
2.10. nftables を使用した接続の量の制限 リンクのコピーリンクがクリップボードにコピーされました!
nftables を使用して、接続の数を制限したり、一定の数の接続の確立を試みる IP アドレスをブロックして、システムリソースを過剰に使用されないようにします。
2.10.1. nftables を使用した接続数の制限 リンクのコピーリンクがクリップボードにコピーされました!
nft ユーティリティーの ct count パラメーターを使用すると、IP アドレスごとの同時接続数を制限できます。たとえば、この機能を使用すると、各送信元 IP アドレスがホストへの並列 SSH 接続を 2 つだけ確立できるように設定できます。
手順
inetアドレスファミリーを使用してfilterテーブルを作成します。# nft add table inet filterinputチェーンをinet filterテーブルに追加します。# nft add chain inet filter input { type filter hook input priority 0 \; }IPv4 アドレスの動的セットを作成します。
# nft add set inet filter limit-ssh { type ipv4_addr\; flags dynamic \;}IPv4 アドレスからの SSH ポート (22) への同時着信接続を 2 つだけ許可し、同じ IP からのそれ以降の接続をすべて拒否するルールを、
inputチェーンに追加します。# nft add rule inet filter input tcp dport ssh ct state new add @limit-ssh { ip saddr ct count over 2 } counter reject
検証
- 同じ IP アドレスからホストへの新しい同時 SSH 接続を 2 つ以上確立します。すでに 2 つの接続が確立されている場合、Nftables が SSH ポートへの接続を拒否します。
limit-ssh動的セットを表示します。# nft list set inet filter limit-ssh table inet filter { set limit-ssh { type ipv4_addr size 65535 flags dynamic elements = { 192.0.2.1 ct count over 2 , 192.0.2.2 ct count over 2 } } }elementsエントリーは、現時点でルールに一致するアドレスを表示します。この例では、elementsは、SSH ポートへのアクティブな接続がある IP アドレスを一覧表示します。出力には、アクティブな接続の数を表示しないため、接続が拒否された場合は表示されないことに注意してください。
2.10.2. 1 分以内に新しい着信 TCP 接続を 11 個以上試行する IP アドレスのブロック リンクのコピーリンクがクリップボードにコピーされました!
1 分以内に 11 個以上の IPv4 TCP 接続を確立しているホストを一時的にブロックできます。
手順
ipアドレスファミリーを使用してfilterテーブルを作成します。# nft add table ip filterinputチェーンをfilterテーブルに追加します。# nft add chain ip filter input { type filter hook input priority 0 \; }filterテーブルにdenylistという名前のセットを追加します。# nft add set ip filter denylist { type ipv4_addr \; flags dynamic, timeout \; timeout 5m \; }このコマンドは、IPv4 アドレスの動的セットを作成します。
timeout 5mパラメーターを定義すると、セットが古いエントリーでいっぱいになるのを防ぐために、nftablesによって 5 分後にエントリーが自動的に削除されます。1 分以内に 11 個以上の新しい TCP 接続を確立しようとするホストのソース IP アドレスを
denylistセットに自動的に追加するルールを追加します。# nft add rule ip filter input ip protocol tcp ct state new, untracked add @denylist { ip saddr limit rate over 10/minute } drop
2.11. nftables ルールのデバッグ リンクのコピーリンクがクリップボードにコピーされました!
nftables フレームワークは、管理者がルールをデバッグし、パケットがそれに一致するかどうかを確認するためのさまざまなオプションを提供します。
2.11.1. カウンターによるルールの作成 リンクのコピーリンクがクリップボードにコピーされました!
ルールが一致しているかどうかを確認するには、カウンターを使用できます。
前提条件
- ルールを追加するチェーンが存在する。
手順
counterパラメーターで新しいルールをチェーンに追加します。以下の例では、ポート 22 で TCP トラフィックを許可し、このルールに一致するパケットとトラフィックをカウントするカウンターを使用するルールを追加します。# nft add rule inet example_table example_chain tcp dport 22 counter acceptカウンター値を表示するには、次のコマンドを実行します。
# nft list ruleset table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport ssh counter packets 6872 bytes 105448565 accept } }
2.11.2. 既存のルールへのカウンターの追加 リンクのコピーリンクがクリップボードにコピーされました!
ルールが一致しているかどうかを確認するには、カウンターを使用できます。
前提条件
- カウンターを追加するルールがある。
手順
チェーンのルール (ハンドルを含む) を表示します。
# nft --handle list chain inet example_table example_chain table inet example_table { chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport ssh accept # handle 4 } }ルールの代わりに、
counterパラメーターを使用してカウンターを追加します。以下の例は、前の手順で表示したルールの代わりに、カウンターを追加します。# nft replace rule inet example_table example_chain handle 4 tcp dport 22 counter acceptカウンター値を表示するには、次のコマンドを実行します。
# nft list ruleset table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport ssh counter packets 6872 bytes 105448565 accept } }
2.11.3. 既存のルールに一致するパケットの監視 リンクのコピーリンクがクリップボードにコピーされました!
ルールに一致するパケットを表示するには、nftables のトレース機能と nft monitor コマンドを組み合わせて使用できます。ルールのトレースを有効にして、トレースを使用してこのルールに一致するパケットを監視できます。
前提条件
- カウンターを追加するルールがある。
手順
チェーンのルール (ハンドルを含む) を表示します。
# nft --handle list chain inet example_table example_chain table inet example_table { chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport ssh accept # handle 4 } }ルールを置き換えてトレース機能を追加しますが、
meta nftrace set 1パラメーターを使用します。以下の例は、前の手順で表示したルールの代わりに、トレースを有効にします。# nft replace rule inet example_table example_chain handle 4 tcp dport 22 meta nftrace set 1 acceptnft monitorコマンドを使用して、トレースを表示します。以下の例は、コマンドの出力をフィルタリングして、inet example_table example_chainが含まれるエントリーのみを表示します。# nft monitor | grep "inet example_table example_chain" trace id 3c5eb15e inet example_table example_chain packet: iif "enp1s0" ether saddr 52:54:00:17:ff:e4 ether daddr 52:54:00:72:2f:6e ip saddr 192.0.2.1 ip daddr 192.0.2.2 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 49710 ip protocol tcp ip length 60 tcp sport 56728 tcp dport ssh tcp flags == syn tcp window 64240 trace id 3c5eb15e inet example_table example_chain rule tcp dport ssh nftrace set 1 accept (verdict accept) ...警告nft monitorコマンドは、トレースが有効になっているルールの数と、一致するトラフィックの量に応じて、大量の出力を表示できます。grepなどのユーティリティーを使用して出力をフィルタリングします。
2.12. nftables ルールセットのバックアップと復元 リンクのコピーリンクがクリップボードにコピーされました!
nftables ルールをファイルにバックアップし、後で復元できます。また、管理者はルールが含まれるファイルを使用して、たとえばルールを別のサーバーに転送できます。
2.12.1. ファイルへの nftables ルールセットのバックアップ リンクのコピーリンクがクリップボードにコピーされました!
nft ユーティリティーを使用して、nftables ルールセットをファイルにバックアップできます。
手順
nftablesルールのバックアップを作成するには、次のコマンドを実行します。nft list ruleset形式で生成された形式の場合:# nft list ruleset > file.nftJSON 形式の場合は、以下のようになります。
# nft -j list ruleset > file.json
2.12.2. ファイルからの nftables ルールセットの復元 リンクのコピーリンクがクリップボードにコピーされました!
ファイルから nftables ルールセットを復元できます。
手順
nftablesルールを復元するには、以下を行います。復元するファイルが、
nft list rulesetが生成した形式であるか、nftコマンドを直接含んでいる場合は、以下のコマンドを実行します。# nft -f file.nft復元するファイルが JSON 形式の場合は、次のコマンドを実行します。
# nft -j -f file.json
2.13. フローテーブルを使用した nftables パケット転送の高速化 リンクのコピーリンクがクリップボードにコピーされました!
nftables ユーティリティーは、確立された接続のデータパケットを高速化するための fastpath 機能ベースの flowtable メカニズムを提供する Netfilter フレームワークを使用します。
フローテーブルメカニズムには次の機能があります。
- 接続追跡を使用して、従来のパケット転送パスをバイパスします。
- 従来のパケット処理をバイパスすることで、ルーティングテーブルの再参照を回避します。
- TCP および UDP プロトコルでのみ動作します。
- ハードウェアに依存しないソフトウェア高速パスです。
手順
inetファミリーのexample-tableテーブルを追加します。# nft add table inet <example-table>優先度タイプとして
ingressフックとfilterを含むexample-flowtableフローテーブルを追加します。# nft add flowtable inet <example-table> <example-flowtable> { hook ingress priority filter \; devices = { example_device_one, example_device_two } \; }example-forwardchainフローをパケット処理テーブルからフローテーブルに追加します。# nft add chain inet <example-table> <example-forwardchain> { type filter hook forward priority filter \; }このコマンドは、
forwardフックとfilter優先度を備えたfilterタイプのフローテーブルを追加します。established接続追跡状態を含むルールを追加して、example-flowtableフローをオフロードします。# nft add rule inet <example-table> <example-forwardchain> ct state { established, related } flow add @<example-flowtable>
検証
example-tableのプロパティーを確認します。# nft list table inet <example-table> table inet example-table { flowtable example-flowtable { hook ingress priority filter devices = { example_device_one, example_device_two } } chain example-forwardchain { type filter hook forward priority filter; policy accept; ct state established flow add @example-flowtable } }
2.14. iptables から nftables への移行 リンクのコピーリンクがクリップボードにコピーされました!
ファイアウォール設定が依然として iptables ルールを使用している場合は、iptables ルールを nftables に移行できます。
ipset パッケージおよび iptables-nft パッケージは、Red Hat Enterprise Linux 9 で非推奨になりました。これには、iptables、ip6tables、arptables、および ebtables ユーティリティーなどの nft-variants の非推奨化が含まれます。たとえば、以前の RHEL バージョンからアップグレードしたために、これらのツールをまだ使用している場合は、nftables パッケージによって提供される nft コマンドラインツールに移行してください。
2.14.1. 非推奨となった iptables フレームワークの概念 リンクのコピーリンクがクリップボードにコピーされました!
現在も活発にメンテナンスされている nftables フレームワークと同様に、非推奨となった iptables フレームワークでも、さまざまなパケットフィルタリング、ログ記録と監査、NAT 関連の設定タスクを実行できます。
iptables フレームワークは複数のテーブルに構造化されています。各テーブルは特定の目的のために設計されています。
filter- デフォルトのテーブル。一般的なパケットフィルタリングを提供します。
nat- ネットワークアドレス変換 (NAT) 用。パケットの送信元アドレスと宛先アドレスの変更が含まれます。
mangle- 特定のパケット変更に関しては、高度なルーティング決定のためにパケットヘッダーを変更することをサポートします。
raw- 接続追跡の前に必要な設定。
これらのテーブルは、個別のカーネルモジュールとして実装されています。各テーブルは、INPUT、OUTPUT、FORWARD など、一定の組み込みチェーンのセットを提供します。チェーンは、パケットの評価基準となる一連のルールです。このチェーンは、カーネル内のパケット処理フローの特定のポイントにフックします。チェーンの名前は異なるテーブル間で同じですが、チェーンの実行順序はそれぞれのフックの優先順位によって決まります。ルールが正しい順序で適用されるように、優先順位はカーネルによって内部的に管理されます。
元々は IPv4 トラフィック向けに設計された iptables フレームワークは、後に ip6tables ユーティリティーによって補完され、IPv6 パケットのファイアウォールルール管理をサポートするようになった。同様に、arptables は Address Resolution Protocol (ARP) トラフィック用に開発され、ebtables は イーサネットブリッジングフレーム用に作成されました。これらのユーティリティーは、iptables のパケットフィルタリング機能を複数のプロトコルに拡張し、包括的なネットワークカバレッジを保証します。
iptables の機能を強化するために、機能拡張の開発が開始されました。通常、機能拡張は、ユーザー空間の動的共有オブジェクト (DSO) とペアになったカーネルモジュールとして実装されます。この拡張により、"マッチ" と "ターゲット" が導入されます。これらをファイアウォールルールで使用すると、より高度な操作を実行できます。拡張機能は、複雑なマッチングやターゲットを実装できます。たとえば、特定のレイヤー 4 プロトコルヘッダー値をマッチさせたり操作したり、レート制限を実行したり、クォータを適用したりすることができます。一部の拡張は、デフォルトの iptables 構文の制限に対処するように設計されています ("マルチポート" マッチ拡張など)。この拡張により、単一のルールを複数の非連続ポートにマッチさせることができるため、ルール定義が簡素化され、必要な個別のルールの数を減らすことができます。
ipset は、iptables に対する特別な種類の機能拡張です。これはカーネルレベルのデータ構造であり、パケットとマッチできる IP アドレス、ポート番号、その他のネットワーク関連要素のコレクションを作成するために、iptables と一緒に使用されます。これらのセットにより、ファイアウォールルールの作成と管理のプロセスが大幅に効率化、最適化、高速化されます。
詳細は、システム上の iptables(8) man ページを参照してください。
2.14.2. iptables および ip6tables ルールセットの nftables への変換 リンクのコピーリンクがクリップボードにコピーされました!
iptables-restore-translate ユーティリティーおよび ip6tables-restore-translate ユーティリティーを使用して、iptables および ip6tables ルールセットを nftables に変換します。
前提条件
-
nftablesパッケージおよびiptablesパッケージがインストールされている。 -
システムに
iptablesルールおよびip6tablesルールが設定されている。
手順
iptablesルールおよびip6tablesルールをファイルに書き込みます。# iptables-save >/root/iptables.dump # ip6tables-save >/root/ip6tables.dumpダンプファイルを
nftables命令に変換します。# iptables-restore-translate -f /root/iptables.dump > /etc/nftables/ruleset-migrated-from-iptables.nft # ip6tables-restore-translate -f /root/ip6tables.dump > /etc/nftables/ruleset-migrated-from-ip6tables.nft-
必要に応じて、生成された
nftablesルールを手動で更新して、確認します。 nftablesサービスが生成されたファイルをロードできるようにするには、以下を/etc/sysconfig/nftables.confファイルに追加します。include "/etc/nftables/ruleset-migrated-from-iptables.nft" include "/etc/nftables/ruleset-migrated-from-ip6tables.nft"iptablesサービスを停止し、無効にします。# systemctl disable --now iptablesカスタムスクリプトを使用して
iptablesルールを読み込んだ場合は、スクリプトが自動的に開始されなくなったことを確認し、再起動してすべてのテーブルをフラッシュします。nftablesサービスを有効にして起動します。# systemctl enable --now nftables
検証
nftablesルールセットを表示します。# nft list ruleset
2.14.3. 単一の iptables および ip6tables ルールセットの nftables への変換 リンクのコピーリンクがクリップボードにコピーされました!
RHEL は、iptables ルールまたは ip6tables ルールを、nftables で同等のルールに変換する iptables-translate ユーティリティーおよび ip6tables-translate ユーティリティーを提供します。
前提条件
-
nftablesパッケージがインストールされている。
手順
以下のように、
iptablesまたはip6tablesの代わりにiptables-translateユーティリティーまたはip6tables-translateユーティリティーを使用して、対応するnftablesルールを表示します。# iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT nft add rule ip filter INPUT ip saddr 192.0.2.0/24 counter accept拡張機能によっては変換機能がない場合もあります。このような場合には、ユーティリティーは、以下のように、前に
#記号が付いた未変換ルールを出力します。# iptables-translate -A INPUT -j CHECKSUM --checksum-fill nft # -A INPUT -j CHECKSUM --checksum-fill
2.14.4. 一般的な iptables コマンドと nftables コマンドの比較 リンクのコピーリンクがクリップボードにコピーされました!
以下は、よく使用される iptables コマンドと nftables コマンドの比較です。
すべてのルールをリスト表示します。
Expand iptables nftables iptables-savenft list ruleset特定のテーブルおよびチェーンをリスト表示します。
Expand iptables nftables iptables -Lnft list table ip filteriptables -L INPUTnft list chain ip filter INPUTiptables -t nat -L PREROUTINGnft list chain ip nat PREROUTINGnftコマンドは、テーブルおよびチェーンを事前に作成しません。これらは、ユーザーが手動で作成した場合にのみ存在します。firewalld によって生成されたルールの一覧表示:
# nft list table inet firewalld # nft list table ip firewalld # nft list table ip6 firewalld
第3章 XDP と eBPF のスタートガイド リンクのコピーリンクがクリップボードにコピーされました!
eXpress Data Path (XDP) と extended Berkeley Packet Filter (eBPF) の機能は、高速ネットワークにおいて強力な組み合わせとなります。XDP はパケット処理の初期段階において高性能なフレームワークを提供します。一方、eBPF はカーネル内での安全で動的なプログラム実行を可能にします。
XDP と eBPF の相乗効果により、ネットワークパフォーマンスが向上し、堅牢なトラフィックの追跡、フィルタリング、監視が可能になります。
3.1. RHEL 10 の eBPF ネットワーク機能について リンクのコピーリンクがクリップボードにコピーされました!
eBPF (extended Berkeley Packet Filter) は、カーネル領域でのコード実行を可能にするカーネル内の仮想マシンです。このコードは、限られた一連の関数にのみアクセスできる制限付きサンドボックス環境で実行されます。
ネットワークでは、eBPF を使用してカーネルパケット処理を補完したり、置き換えることができます。使用するフックに応じて、eBPF プログラムには以下のような記述があります。
- パケットデータおよびメタデータへの読み取りおよび書き込みアクセス
- ソケットとルートを検索できる
- ソケットオプションを設定できる
- パケットをリダイレクト可能
3.1.1. RHEL 10 におけるネットワーク eBPF 機能の概要 リンクのコピーリンクがクリップボードにコピーされました!
開発者は、Extended Berkeley Packet Filter (eBPF) を使用することで、Linux カーネル内でサンドボックス化されたプログラムを実行できます。ネットワークトラフィックを管理するには、特定のフックで eBPF プログラムを設定し、データの検査、変更、フィルタリングを行います。
eBPF (extended Berkeley Packet Filter) ネットワークプログラムは、RHEL の以下のフックに割り当てることができます。
- eXpress Data Path (XDP): カーネルネットワークスタックが受信したパケットを処理する前に、このパケットへの早期アクセスを提供します。
-
tceBPF 分類子 (direct-action フラグ): ingress および egress で強力なパケット処理を提供します。プログラムは、qdisc階層内の direct-action フラグを使用して eBPF 分類子として割り当てることも、リンクベースのtcxAPI を使用して割り当てることもできます。 - Control Groups version 2 (cgroup v2): コントロールグループ内のプログラムが実行するソケットベースの操作のフィルタリングおよび上書きを有効にします。
- ソケットフィルタリング: ソケットから受信したパケットのフィルタリングを有効にします。この機能は、従来の Berkeley Packet Filter (cBPF) でも利用できますが、eBPF プログラムに対応するために拡張されました。
- ストリームパーサー : 個別のメッセージへのストリームの分散、フィルタリング、ソケットへのリダイレクトを有効にします。
-
SO_REUSEPORTソケットの選択:reuseportソケットグループから受信したソケットをプログラム可能な選択を提供します。 - flow dissector: 特定の状況でカーネルがパケットヘッダーを解析する方法をオーバーライドします。
- TCP 輻輳制御コールバック: カスタム TCP 輻輳制御アルゴリズムの実装を有効にします。
- カプセル化によるルート: カスタムのトンネルカプセル化の作成を有効にします。
Netfilter: カスタム Netfilter フックの実装を有効にします。
- XDP
BPF_PROG_TYPE_XDPタイプのプログラムはネットワークインターフェイスに割り当てることができます。カーネルは、受信したパケットに対してプログラムを実行し、その後カーネルのネットワークスタックがパケットの処理を開始します。これにより、高速パケットドロップなど、特定の状況で高速なパケット転送が可能になり、負荷分散シナリオにおいて DDoS (Distributed Denial of Service) 攻撃や高速パケットリダイレクトを防ぐことができます。さまざまな形式のパケット監視やサンプリングに XDP を使用することもできます。カーネルは、XDP プログラムはパケットを変更し、カーネルネットワークスタックへのさらなる処理を可能にします。
以下の XDP モードを使用できます。
- ネイティブ (ドライバー)XDP: カーネルはパケット受信中の可能な限り早い時点からプログラムを実行します。この時点で、カーネルはパケットを解析しなかったため、カーネルが提供するメタデータは利用できません。このモードでは、ネットワークインターフェイスドライバーが XDP をサポートしている必要がありますが、すべてのドライバーがこのネイティブモードをサポートするわけではありません。
- 汎用 XDP: カーネルネットワークスタックは、処理の早い段階で XDP プログラムを実行します。この時点で、カーネルデータ構造が割り当てられ、パケットを事前に処理しています。パケットをドロップまたはリダイレクトする必要がある場合は、ネイティブモードと比較して大きなオーバーヘッドが必要になります。ただし、汎用モードはネットワークインターフェイスドライバーのサポートを必要とせず、すべてのネットワークインターフェイスで機能します。
- オフロードされた XDP: カーネルは、ホスト CPU ではなくネットワークインターフェイス上で XDP プログラムを実行します。これには特定のハードウェアが必要で、特定の eBPF 機能のみがこのモードで使用できることに注意してください。
RHEL で、
libxdpライブラリーを使用してすべての XDP プログラムを読み込みます。このライブラリーは、XDP のシステム制御を可能にします。注記現在、XDP プログラムにはシステム設定に制限があります。たとえば、受信側インターフェイスで特定のハードウェアオフロード機能を無効にする必要があります。また、ネイティブモードをサポートするすべてのドライバーで利用可能なわけではありません。
RHEL 10 では、
libxdpライブラリーを使用してプログラムをカーネルにロードする場合にのみ、Red Hat は XDP 機能をサポートします。- AF_XDP
-
指定した
AF_XDPソケットにパケットをフィルターしてリダイレクトする XDP プログラムを使用すると、AF_XDPプロトコルファミリーから 1 つ以上のソケットを使用して、カーネルからユーザー空間にパケットを速やかにコピーできます。 - トラフィック制御
Traffic Control (
tc) サブシステムは、以下のタイプの eBPF プログラムを提供します。-
BPF_PROG_TYPE_SCHED_CLS -
BPF_PROG_TYPE_SCHED_ACT
これらのタイプを使用すると、カスタム
tc分類子とtcアクションを eBPF に記述できます。これは、tcエコシステムの一部とともに、強力なパケット処理機能を提供します。また、複数のコンテナーネットワークオーケストレーションソリューションの中核となります。ほとんどの場合、分類器のみが使用されます。直接アクションフラグの場合と同様に、eBPF 分類器は同じ eBPF プログラムから直接アクションを実行できます。
clsactQueueing Discipline (qdisc) は、Ingress 側でこれを有効にするように設計されています。flow dissector の eBPF プログラムは、
flowerなどのその他のqdiscsやtc分類子の操作に影響を与える可能性があることに注意してください。リンクベースの
tcxAPI は、qdiscAPI とともに提供されます。これにより、アプリケーションが BPF プログラムの所有権を維持し、BPF プログラムが誤って削除されるのを防ぐことができます。また、tcxAPI にはマルチプログラムサポートがあり、複数のアプリケーションがtcレイヤーに BPF プログラムを並行して接続できます。-
- ソケットフィルター
複数のユーティリティーは、ソケットで受信されるパケットのフィルタリングに、従来の Berkeley Packet Filter (cBPF) を使用または使用しています。たとえば、
tcpdumpユーティリティーでは、式を指定することができ、tcpdump はそれを cBPF コードに変換します。cBPF の代替として、カーネルは、同じ目的で
BPF_PROG_TYPE_SOCKET_FILTERタイプの eBPF プログラムを許可します。- コントロールグループ
RHEL では、cgroup に割り当てられる eBPF プログラムを複数使用できます。カーネルは、指定された cgroup 内のプログラムが操作を実行する際に、これらのプログラムを実行します。cgroups バージョン 2 のみを使用できます。
RHEL では、以下のネットワーク関連の cgroup eBPF プログラムが利用できます。
-
BPF_PROG_TYPE_SOCK_OPS: カーネルはさまざまな TCP イベントでこのプログラムを呼び出します。プログラムは、カスタム TCP ヘッダーオプションなどを含め、カーネル TCP スタックの動作を調整できます。 -
BPF_PROG_TYPE_CGROUP_SOCK_ADDR: カーネルは、connect、bind、sendto、recvmsg、getpeername、およびgetsocknameの操作中にこのプログラムを呼び出します。このプログラムは、IP アドレスとポートを変更できます。これは、ソケットベースのネットワークアドレス変換 (NAT) を eBPF に実装する場合に便利です。 -
BPF_PROG_TYPE_CGROUP_SOCKOPT: カーネルは、setsockoptおよびgetsockopt操作時にこのプログラムを呼び出して、オプションの変更を可能にします。 -
BPF_PROG_TYPE_CGROUP_SOCK: カーネルは、ソケットの作成時、ソケットの開放時、アドレスのバインド時にこのプログラムを呼び出します。これらのプログラムを使用して操作を許可または拒否するか、統計のソケット作成の検査のみを行います。 -
BPF_PROG_TYPE_CGROUP_SKB: このプログラムは ingress および egress の個別のパケットをフィルターし、パケットを受信または拒否できます。
-
- ストリームパーサー
ストリームパーサーは、特別な eBPF マップに追加されるソケットのグループで動作します。次に、eBPF プログラムは、カーネルがこれらのソケットで受信または送信するパケットを処理します。
RHEL では、以下のストリームパーサー eBPF プログラムを利用できます。
-
BPF_PROG_TYPE_SK_SKB: eBPF プログラムは、ソケットで受信したパケットを個別のメッセージに解析し、それらのメッセージを破棄するか、受け入れるか、別のソケットに送信するかをカーネルに指示します。 -
BPF_PROG_TYPE_SK_MSG: このプログラムは egress メッセージをフィルタリングします。eBPF プログラムはパケットを解析し、承認または拒否します。
-
- SO_REUSEPORT ソケットの選択
-
このソケットオプションを使用することで、複数のソケットを同じ IP アドレスとポートにバインドできます。eBPF がない場合、カーネルは接続ハッシュに基づいて受信ソケットを選択します。
BPF_PROG_TYPE_SK_REUSEPORTプログラムを使用すると、受信ソケットの選択が完全にプログラム可能になります。 - Flow dissector
-
カーネルが完全なプロトコルデコードを実行せずにパケットヘッダーを処理する必要がある場合、そのパケットは詳細に解析 (
dissected) されます。たとえば、これは、tcサブシステム、ボンディングのルーティング、またはパケットのハッシュを計算する際に発生します。この場合、カーネルはパケットヘッダーを解析し、パケットヘッダーからの情報を使用して内部構造を埋めます。この内部解析は、BPF_PROG_TYPE_FLOW_DISSECTORプログラムを使用して置き換えることができます。RHEL の eBPF では、TCP および UDP を IPv4 および IPv6 上でのみ破棄できます。 - TCP 輻輳制御
-
struct tcp_congestion_oopsコールバックを実装するBPF_PROG_TYPE_STRUCT_OPSプログラムのグループを使用して、カスタム TCP 輻輳制御アルゴリズムを作成できます。この方法を実装するアルゴリズムは、ビルトインのカーネルアルゴリズムとともにシステムで利用できます。 - カプセル化によるルート
以下のいずれかの eBPF プログラムタイプは、トンネルのカプセル化属性として、ルーティングテーブルのルートに割り当てることができます。
-
BPF_PROG_TYPE_LWT_IN -
BPF_PROG_TYPE_LWT_OUT -
BPF_PROG_TYPE_LWT_XMIT -
BPF_PROG_TYPE_LWT_SEG6LOCAL(テクノロジープレビュー)
このような eBPF プログラムの機能は、特定のトンネル設定に制限されており、汎用的なカプセル化またはカプセル化解除ソリューションを作成することはできません。
-
- ソケットルックアップ
-
bindシステムコールの制限を回避するには、BPF_PROG_TYPE_SK_LOOKUPタイプの eBPF プログラムを使用します。このようなプログラムは、新しい受信 TCP 接続のリスニングソケットまたは UDP パケットの非接続ソケットを選択できます。 - Netfilter
-
BPF_PROG_TYPE_NETFILTERタイプを使用して、カスタムの Netfilter フックを実装できます。このようなフックは Netfilter インフラストラクチャーに統合され、パケットの読み取り専用アクセス権を持ち、パケットをドロップまたは受信できます。必要に応じて、eBPF プログラムは IP フラグメントの再設定後に、再構成されたパケットで実行できます。
3.1.2. RHEL 10 におけるネットワークカードごとの XDP 機能の概要 リンクのコピーリンクがクリップボードにコピーされました!
RHEL で使用できる XDP 機能は、ネットワークカードとそのドライバーによって異なります。
以下は、XDP 対応ネットワークカードと、それらで使用できる XDP 機能の概要です。
| ネットワークカード | ドライバー | Red Hat のサポート状況 | ベーシック | リダイレクト | ターゲット | Zero-copy | Large MTU |
|---|---|---|---|---|---|---|---|
| Amazon Elastic Network Adapter |
| enabled | はい | はい | はい [a] | いいえ | いいえ |
| aQuantia AQtion イーサネットカード |
| enabled | はい | はい | はい | いいえ | はい |
| Broadcom NetXtreme-C/E 10/25/40/50 gigabit Ethernet |
| supported | はい | はい | はい [a] | いいえ | はい |
| Cavium Thunder Virtual function |
| enabled | はい | いいえ | いいえ | いいえ | いいえ |
| Freescale DPAA2 Ethernet |
| enabled | はい | はい | はい | はい [b] | いいえ |
| Google Virtual NIC (gVNIC) のサポート |
| enabled | はい | はい | はい | はい | いいえ |
| Intel® 10GbE PCI Express Virtual Function Ethernet |
| enabled | はい | いいえ | いいえ | いいえ | いいえ |
| Intel® 10GbE PCI Express adapters |
| enabled | はい | はい | はい [a] | はい | はい [c] |
| Intel® Ethernet Connection E800 Series |
| supported | はい | はい | はい [a] | はい | はい |
| Intel® Ethernet Controller I225-LM/I225-V family |
| supported | はい | はい | はい [a] | はい | はい [c] |
| Intel® PCI Express Gigabit adapters |
| enabled | はい | はい | はい [a] | いいえ | はい [c] |
| Intel® Ethernet Controller XL710 Family |
| supported | はい | はい | はい | いいえ | |
| Marvell OcteonTX2 |
| enabled | はい | はい | いいえ | いいえ | |
| Mellanox 5th generation network adapters (ConnectX series) |
| supported | はい | はい | はい [d] | はい | はい |
| Mellanox Technologies 1/10/40Gbit Ethernet |
| enabled | はい | はい | いいえ | いいえ | いいえ |
| Microsoft Azure Network Adapter |
| enabled | はい | はい | はい | いいえ | いいえ |
| Microsoft Hyper-V virtual network |
| enabled | はい | はい | はい | いいえ | いいえ |
| Netronome® NFP4000/NFP6000 NIC [e] |
| enabled | はい | いいえ | いいえ | はい | いいえ |
| NXP ENETC Gigabit Ethernet |
| enabled | はい | はい | はい | いいえ | はい |
| NXP Fast Ethernet Controller |
| enabled | はい | はい | いいえ | いいえ | いいえ |
| Pensando Ethernet Adapter |
| enabled | はい | はい | はい | いいえ | はい |
| QEMU Virtio network |
| supported | はい | はい | はい [a] | いいえ | はい |
| QLogic QED 25/40/100Gb Ethernet NIC |
| enabled | はい | はい | はい | いいえ | いいえ |
| QorIQ DPAA Ethernet |
| enabled | はい | はい | はい | いいえ | いいえ |
| STMicroelectronics Multi-Gigabit Ethernet |
| enabled | はい | はい | はい | はい | いいえ |
| Solarflare SFC9000/SFC9100/EF100-family |
| enabled | はい | はい | はい [d] | いいえ | いいえ |
| Universal TUN/TAP device |
| enabled | はい | はい | はい | いいえ | いいえ |
| Virtual ethernet pair device |
| supported | はい | はい | はい | いいえ | はい |
| VMware VMXNET3 イーサネットドライバー |
| enabled | はい | はい | いいえ | いいえ | |
| Xen 準仮想ネットワークデバイス |
| enabled | はい | はい | はい | いいえ | いいえ |
[a]
インターフェイスに XDP プログラムが読み込まれている場合のみ。
[b]
すべてのハードウェアリビジョンで使用できるわけではありません。
[c]
送信側のみ。XDP 経由で大きなパケットを受信することはできません。
[d]
CPU ごとに少なくとも 1 つの XDP TX キューが必要です。たとえば、キューの数は最大の CPU インデックスよりも大きくなければなりません。
[e]
リストされている機能の一部は、Netronome® NFP3800 NIC では使用できません。
| |||||||
説明:
Red Hat のサポート状況:
-
supported: Red Hat はこのドライバーが提供する XDP 機能を完全にサポートしています。 -
enabled: XDP 機能はアップストリームドライバーによって提供されます。Red Hat は、特定された問題に対してベストエフォート形式で対応しますが、このハードウェアは社内で実施する品質保証テストにおいて対象外の項目もあります。
-
-
Basic: 基本的な戻りコード (
DROP、PASS、ABORTED、およびTX) をサポートします。 -
リダイレクト:
XDP_REDIRECT戻りコードをサポートします。 -
ターゲット:
XDP_REDIRECT戻りコードのターゲットになることができます。 -
zero-copy:
AF_XDPプロトコルファミリーの zero-copy モードをサポートします。 - 大きな MTU: ページサイズより大きいパケットをサポートします。
3.2. BPF コンパイラーコレクションを使用したネットワークトレース リンクのコピーリンクがクリップボードにコピーされました!
BPF コンパイラーコレクション (BCC) は、eBPF (extended Berkeley Packet Filter) プログラムの作成を容易にするライブラリーです。eBPF プログラムの主なユーティリティーは、オーバーヘッドやセキュリティー上の問題が発生することなく、オペレーティングシステムのパフォーマンスおよびネットワークパフォーマンスを分析することです。
BCC により、ユーザーは eBPF の技術詳細を把握する必要がなくなり、事前に作成した eBPF プログラムを含む bcc-tools パッケージなど、多くの標準スタートポイントを利用できます。
eBPF プログラムは、ディスク I/O、TCP 接続、プロセス作成などのイベントでトリガーされます。これらのプログラムはカーネル内の安全な仮想マシン上で実行されるため、カーネルのクラッシュ、ループ、応答不能を引き起こす可能性は低い。
3.2.1. bcc-tools パッケージのインストール リンクのコピーリンクがクリップボードにコピーされました!
bcc-tools パッケージをインストールします。これにより、依存関係として BPF Compiler Collection (BCC) ライブラリーもインストールされます。
手順
bcc-toolsをインストールします。# dnf install bcc-toolsBCC ツールは、
/usr/share/bcc/tools/ディレクトリーにインストールされます。
検証
インストールされたツールを検査します。
# ls -l /usr/share/bcc/tools/... -rwxr-xr-x. 1 root root 4198 Dec 14 17:53 dcsnoop -rwxr-xr-x. 1 root root 3931 Dec 14 17:53 dcstat -rwxr-xr-x. 1 root root 20040 Dec 14 17:53 deadlock_detector -rw-r--r--. 1 root root 7105 Dec 14 17:53 deadlock_detector.c drwxr-xr-x. 3 root root 8192 Mar 11 10:28 doc -rwxr-xr-x. 1 root root 7588 Dec 14 17:53 execsnoop -rwxr-xr-x. 1 root root 6373 Dec 14 17:53 ext4dist -rwxr-xr-x. 1 root root 10401 Dec 14 17:53 ext4slower ...リスト内の
docディレクトリーには、各ツールのドキュメントが含まれています。
3.2.2. カーネルの受け入れキューに追加された TCP 接続の表示 リンクのコピーリンクがクリップボードにコピーされました!
tcpaccept ユーティリティーを使用すると、カーネルの accept() 関数をトレースして、新しく許可された接続を監視できます。
カーネルは、TCP 3 方向ハンドシェイクで ACK パケットを受け取ると、カーネルは接続の状態が ESTABLISHED に変更された後に SYN キューから accept キューに移動します。そのため、正常な TCP 接続だけがこのキューに表示されます。
tcpaccept ユーティリティーは、eBPF 機能を使用して、カーネルが accept キューに追加するすべての接続を表示します。このユーティリティーは、パケットをキャプチャーしてフィルタリングする代わりにカーネルの accept() 関数を追跡するため、軽量です。たとえば、一般的なトラブルシューティングには tcpaccept を使用して、サーバーが許可した新しい接続を表示します。
手順
次のコマンドを実行して、カーネルの
acceptキューのトレースを開始します。# /usr/share/bcc/tools/tcpaccept PID COMM IP RADDR RPORT LADDR LPORT 843 sshd 4 192.0.2.17 50598 192.0.2.1 22 1107 ns-slapd 4 198.51.100.6 38772 192.0.2.1 389 1107 ns-slapd 4 203.0.113.85 38774 192.0.2.1 389 ...カーネルが接続を受け入れるたびに、
tcpacceptは接続の詳細を表示します。詳細は、システム上の
tcpaccept(8)man ページと/usr/share/bcc/tools/doc/tcpaccept_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.3. 発信 TCP 接続試行の追跡 リンクのコピーリンクがクリップボードにコピーされました!
tcpconnect ユーティリティーは、eBPF 機能を使用して発信 TCP 接続の試行を追跡します。ユーティリティーの出力には、失敗した接続も含まれます。
tcpconnect ユーティリティーは、パケットを取得してフィルタリングするのではなく、カーネルの connect() 関数などを追跡するため、軽量です。
手順
以下のコマンドを入力し、すべての発信接続を表示する追跡プロセスを開始します。
# /usr/share/bcc/tools/tcpconnect PID COMM IP SADDR DADDR DPORT 31346 curl 4 192.0.2.1 198.51.100.16 80 31348 telnet 4 192.0.2.1 203.0.113.231 23 31361 isc-worker00 4 192.0.2.1 192.0.2.254 53 ...カーネルが発信接続を処理するたびに、
tcpconnectは、接続の詳細を表示します。詳細は、システム上の
tcpconnect(8)man ページと/usr/share/bcc/tools/doc/tcpconnect_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.4. 発信 TCP 接続のレイテンシーの測定 リンクのコピーリンクがクリップボードにコピーされました!
tcpconnlat ユーティリティーは、eBPF 機能を使用して、送信した SYN パケットと受信した応答パケットの時間を測定します。
TCP 接続のレイテンシーは、接続を確立するのにかかった時間です。通常、これには、アプリケーションのランタイムではなく、カーネル TCP/IP 処理およびネットワークのラウンドトリップタイムが含まれます。
手順
発信接続のレイテンシーの測定を開始します。
# /usr/share/bcc/tools/tcpconnlat PID COMM IP SADDR DADDR DPORT LAT(ms) 32151 isc-worker00 4 192.0.2.1 192.0.2.254 53 0.60 32155 ssh 4 192.0.2.1 203.0.113.190 22 26.34 32319 curl 4 192.0.2.1 198.51.100.59 443 188.96 ...カーネルが発信接続を処理するたびに、
tcpconnlatは、カーネルが応答パケットを受信すると接続の詳細を表示します。詳細は、システム上の
tcpconnlat(8)man ページと/usr/share/bcc/tools/doc/tcpconnlat_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.5. カーネルによって破棄された TCP パケットおよびセグメントの詳細の表示 リンクのコピーリンクがクリップボードにコピーされました!
tcpdrop ユーティリティーを使用すると、カーネルによって破棄された TCP パケットとセグメントの詳細を表示できます。このユーティリティーを使用して、リモートシステムがタイマーベースの再送信を送信する可能性がある破棄されたパケットの高レートをデバッグします。
ドロップされたパケットおよびセグメントの高レートは、サーバーのパフォーマンスに影響を与える可能性があります。リソース集約型のパケットを取得およびフィルタリングする代わりに、tcpdrop ユーティリティーは eBPF 機能を使用してカーネルから直接情報を取得します。
手順
以下のコマンドを入力して、破棄された TCP パケットおよびセグメントの詳細表示を開始します。
# /usr/share/bcc/tools/tcpdrop TIME PID IP SADDR:SPORT > DADDR:DPORT STATE (FLAGS) 13:28:39 32253 4 192.0.2.85:51616 > 192.0.2.1:22 CLOSE_WAIT (FIN|ACK) b'tcp_drop+0x1' b'tcp_data_queue+0x2b9' ... 13:28:39 1 4 192.0.2.85:51616 > 192.0.2.1:22 CLOSE (ACK) b'tcp_drop+0x1' b'tcp_rcv_state_process+0xe2' ...カーネルが TCP パケットとセグメントを破棄するたびに、
tcpdropは、破棄されたパッケージにつながるカーネルスタックトレースを含む接続の詳細を表示します。詳細は、システム上の
tcpdrop(8)man ページと/usr/share/bcc/tools/doc/tcpdrop_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.6. TCP セッションのトレース リンクのコピーリンクがクリップボードにコピーされました!
tcplife ユーティリティーは eBPF を使用して、開いて閉じる TCP セッションを追跡し、出力を 1 行で出力してそれぞれを要約します。管理者は tcplife を使用して、接続と転送されたトラフィック量を特定できます。
たとえば、ポート 22 (SSH) への接続を表示して、以下の情報を取得できます。
- ローカルプロセス ID (PID)
- ローカルプロセス名
- ローカルの IP アドレスおよびポート番号
- リモートの IP アドレスおよびポート番号
- 受信および送信トラフィックの量 (KB 単位)
- 接続がアクティブであった時間 (ミリ秒単位)
手順
次のコマンドを実行して、ローカルポート
22への接続の追跡を開始します。# /usr/share/bcc/tools/tcplife -L 22 PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB MS 19392 sshd 192.0.2.1 22 192.0.2.17 43892 53 52 6681.95 19431 sshd 192.0.2.1 22 192.0.2.245 43902 81 249381 7585.09 19487 sshd 192.0.2.1 22 192.0.2.121 43970 6998 7 16740.35 ...接続が閉じられるたびに、
tcplifeは接続の詳細を表示します。詳細は、システム上の
tcplife(8)man ページと/usr/share/bcc/tools/doc/tcplife_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.7. TCP 再送信の追跡 リンクのコピーリンクがクリップボードにコピーされました!
tcpretrans ユーティリティーは、ローカルおよびリモート IP アドレスおよびポート番号、再送信時の TCP 状態などの TCP 再送信の詳細を表示します。
このユーティリティーは eBPF 機能を使用するため、オーバーヘッドが非常に低くなります。
手順
以下のコマンドを使用して、TCP 再送信の詳細を表示します。
# /usr/share/bcc/tools/tcpretrans TIME PID IP LADDR:LPORT T> RADDR:RPORT STATE 00:23:02 0 4 192.0.2.1:22 R> 198.51.100.0:26788 ESTABLISHED 00:23:02 0 4 192.0.2.1:22 R> 198.51.100.0:26788 ESTABLISHED 00:45:43 0 4 192.0.2.1:22 R> 198.51.100.0:17634 ESTABLISHED ...カーネルが TCP 再送信関数を呼び出すたびに、
tcpretransは、接続の詳細を表示します。詳細は、システム上の
tcpretrans(8)man ページと/usr/share/bcc/tools/doc/tcpretrans_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.8. TCP 状態変更情報の表示 リンクのコピーリンクがクリップボードにコピーされました!
TCP セッション時に、TCP の状態が変わります。tcpstates ユーティリティーは、eBPF 関数を使用してこれらの状態の変更を追跡し、各状態の期間を含む詳細を出力します。たとえば、tcpstates を使用して、接続の初期化に時間がかかりすぎるかどうかを特定します。
手順
以下のコマンドを使用して、TCP 状態変更の追跡を開始します。
# /usr/share/bcc/tools/tcpstates SKADDR C-PID C-COMM LADDR LPORT RADDR RPORT OLDSTATE -> NEWSTATE MS ffff9cd377b3af80 0 swapper/1 0.0.0.0 22 0.0.0.0 0 LISTEN -> SYN_RECV 0.000 ffff9cd377b3af80 0 swapper/1 192.0.2.1 22 192.0.2.45 53152 SYN_RECV -> ESTABLISHED 0.067 ffff9cd377b3af80 818 sssd_nss 192.0.2.1 22 192.0.2.45 53152 ESTABLISHED -> CLOSE_WAIT 65636.773 ffff9cd377b3af80 1432 sshd 192.0.2.1 22 192.0.2.45 53152 CLOSE_WAIT -> LAST_ACK 24.409 ffff9cd377b3af80 1267 pulseaudio 192.0.2.1 22 192.0.2.45 53152 LAST_ACK -> CLOSE 0.376 ...接続の状態が変更されるたびに、
tcpstatesは、更新された接続の詳細を含む新しい行を表示します。複数の接続が状態を同時に変更する場合は、最初の列 (
SKADDR) のソケットアドレスを使用して、同じ接続に属するエントリーを判断します。詳細は、システム上の
tcpstates(8)man ページと/usr/share/bcc/tools/doc/tcpstates_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.9. 特定のサブネットに送信された TCP トラフィックの要約および集計 リンクのコピーリンクがクリップボードにコピーされました!
tcpsubnet ユーティリティーは、ローカルホストがサブネットに送信する IPv4 TCP トラフィックを要約し、固定の間隔で出力を表示します。このユーティリティーは、eBPF 機能を使用してデータを収集および要約して、オーバーヘッドを削減します。
デフォルトでは、tcpsubnet は以下のサブネットのトラフィックを要約します。
-
127.0.0.1/32 -
10.0.0.0/8 -
172.16.0.0/12 -
192.0.2.0/24/16 -
0.0.0.0/0
最後のサブネット (0.0.0.0/0) は catch-all オプションであることに注意してください。tcpsubnet ユーティリティーは、最初の 4 つとは異なるサブネットのすべてのトラフィックを、この catch-all エントリーでカウントします。
192.0.2.0/24 および 198.51.100.0/24 サブネットのトラフィックをカウントするには、以下の手順に従います。他のサブネットへのトラフィックは、0.0.0.0/0 の 包括的なサブネットエントリーで追跡されます。
手順
192.0.2.0/24、198.51.100.0/24、および他のサブネットに送信するトラフィック量のモニタリングを開始します。# /usr/share/bcc/tools/tcpsubnet 192.0.2.0/24,198.51.100.0/24,0.0.0.0/0 Tracing... Output every 1 secs. Hit Ctrl-C to end [02/21/20 10:04:50] 192.0.2.0/24 856 198.51.100.0/24 7467 [02/21/20 10:04:51] 192.0.2.0/24 1200 198.51.100.0/24 8763 0.0.0.0/0 673 ...このコマンドは、指定したサブネットのトラフィックを 1 秒ごとに 1 回ずつバイト単位で表示します。
詳細は、システム上の
tcpsubnet(8)man ページと/usr/share/bcc/tools/doc/tcpsubnet.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.10. IP アドレスとポートによるネットワークスループットの表示 リンクのコピーリンクがクリップボードにコピーされました!
tcptop ユーティリティーは、ホストがキロバイト単位で送受信する TCP トラフィックを表示します。レポートは自動的に更新され、アクティブな TCP 接続のみが含まれます。このユーティリティーは eBPF 機能を使用するため、オーバーヘッドは非常に低くなります。
手順
送受信トラフィックを監視するには、次のコマンドを実行します。
# /usr/share/bcc/tools/tcptop 13:46:29 loadavg: 0.10 0.03 0.01 1/215 3875 PID COMM LADDR RADDR RX_KB TX_KB 3853 3853 192.0.2.1:22 192.0.2.165:41838 32 102626 1285 sshd 192.0.2.1:22 192.0.2.45:39240 0 0 ...コマンドの出力には、アクティブな TCP 接続のみが含まれます。ローカルシステムまたはリモートシステムが接続を閉じると、接続が出力に表示されなくなります。
詳細は、システム上の
tcptop(8)man ページと/usr/share/bcc/tools/doc/tcptop.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.11. 確立された TCP 接続の追跡 リンクのコピーリンクがクリップボードにコピーされました!
tcptracer ユーティリティーは、TCP 接続を接続、許可、および閉じるカーネル機能を追跡します。このユーティリティーは eBPF 機能を使用するため、オーバーヘッドが非常に低くなります。
手順
次のコマンドを実行して、トレースプロセスを開始します。
# /usr/share/bcc/tools/tcptracer Tracing TCP established connections. Ctrl-C to end. T PID COMM IP SADDR DADDR SPORT DPORT A 1088 ns-slapd 4 192.0.2.153 192.0.2.1 0 65535 A 845 sshd 4 192.0.2.1 192.0.2.67 22 42302 X 4502 sshd 4 192.0.2.1 192.0.2.67 22 42302 ...カーネルが接続を開始し、受け入れ、または閉じるたびに、
tcptracerは、接続の詳細を表示します。詳細は、システム上の
tcptracer(8)man ページと/usr/share/bcc/tools/doc/tcptracer_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.12. IPv4 および IPv6 リッスン試行の追跡 リンクのコピーリンクがクリップボードにコピーされました!
solisten ユーティリティーは、すべての IPv4 および IPv6 のリッスン試行を追跡します。最終的に失敗するものや、接続を許可しないリスニングプログラムなど、試行を追跡します。このユーティリティーは、プログラムが TCP 接続をリッスンする場合にカーネルが呼び出す関数を追跡します。
手順
次のコマンドを実行して、リッスンする TCP 試行をすべて表示するトレースプロセスを開始します。
# /usr/share/bcc/tools/solisten PID COMM PROTO BACKLOG PORT ADDR 3643 nc TCPv4 1 4242 0.0.0.0 3659 nc TCPv6 1 4242 2001:db8:1::1 4221 redis-server TCPv6 128 6379 :: 4221 redis-server TCPv4 128 6379 0.0.0.0 ....詳細は、システム上の
solisten(9)man ページと/usr/share/bcc/tools/doc/solisten_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.13. ソフト割り込みのサービス時間の要約 リンクのコピーリンクがクリップボードにコピーされました!
softirqs ユーティリティーは、ソフト割り込み (ソフト IRQ) に費やした時間を要約し、この時間を合計またはヒストグラムのディストリビューションとして表示します。このユーティリティーは、安定したトレースメカニズムであるカーネルトレースポイント irq:softirq_enter および irq:softirq_exit を使用します。
手順
以下のコマンドを実行して、
soft irqイベント時間を追跡します。# /usr/share/bcc/tools/softirqs Tracing soft irq event time... Hit Ctrl-C to end. ^C SOFTIRQ TOTAL_usecs tasklet 166 block 9152 net_rx 12829 rcu 53140 sched 182360 timer 306256詳細は、システム上の
softirqs(8)およびmpstat(1)man ページと/usr/share/bcc/tools/doc/softirqs_example.txtファイルを参照してください。- Ctrl+C を押して、追跡プロセスを停止します。
3.2.14. ネットワークインターフェイス上のパケットサイズとパケット数のまとめ リンクのコピーリンクがクリップボードにコピーされました!
netqtop ユーティリティーは、特定のネットワークインターフェイスの各ネットワークキュー上の受信 (RX) パケットと送信 (TX) パケットの属性に関する統計情報を表示します。
統計情報には次のものが含まれます。
- 1 秒あたりのバイト数 (BPS)
- 1 秒あたりのパケット数 (PPS)
- 平均パケットサイズ
- 総パケット数
これらの統計情報を生成するために、netqtop は、送信パケット net_dev_start_xmit および受信パケット netif_receive_skb のイベントを実行するカーネル関数をトレースします。
手順
2秒間のバイトサイズの範囲内に含まれるパケット数を表示します。# /usr/share/bcc/tools/netqtop -n enp1s0 -i 2 Fri Jan 31 18:08:55 2023 TX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 0 0 0 0 0 0 Total 0 0 0 0 0 0 RX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 38.0 1 0 0 0 0 Total 38.0 1 0 0 0 0 ----------------------------------------------------------------------------- Fri Jan 31 18:08:57 2023 TX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 0 0 0 0 0 0 Total 0 0 0 0 0 0 RX QueueID avg_size [0, 64) [64, 512) [512, 2K) [2K, 16K) [16K, 64K) 0 38.0 1 0 0 0 0 Total 38.0 1 0 0 0 0 -----------------------------------------------------------------------------詳細は、システム上の
netqtop(8)man ページと/usr/share/bcc/tools/doc/netqtop_example.txtファイルを参照してください。-
Ctrl+C を押して
netqtopを停止します。
3.3. xdp-filter を使用した高性能なトラフィックフィルタリングによる DDoS 攻撃の防止 リンクのコピーリンクがクリップボードにコピーされました!
xdp-filter ユーティリティーは、XDP を使用してネットワークインターフェイスで直接パケットを破棄します。そのため、nftables などのフィルターよりも高速です。これは DDoS 攻撃中にトラフィックを迅速にブロックするのに役立ちます。フィルタリングは、IP、MAC アドレス、またはポートごとに実行できます。
たとえば、テスト時に Red Hat は 1 つのコア上で 1 秒あたり 2,600 万のネットワークパケットを破棄しました。これは、同じハードウェア上での nftables のドロップ率よりも大幅に高い値です。
xdp-filter ユーティリティーは、XDP を使用して着信ネットワークパケットを許可または破棄します。特定のトラフィックに対するトラフィックのフィルターを行うルールを作成できます。
- IP アドレス
- MAC アドレス
- ポート
xdp-filter はパケット処理速度が大幅に速いものの、nftables などと同等の機能を備えているわけではないことに注意してください。xdp-filter は、XDP を使用したパケットフィルタリングを実演するための概念的なユーティリティーと捉えてください。また、独自の XDP アプリケーションの作成方法をより深く理解するために、このユーティリティーのコードを使用することもできます。
AMD および Intel 64 ビット以外のアーキテクチャーでは、xdp-filter ユーティリティーはテクノロジープレビュー機能としてのみ提供されます。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) ではサポートされておらず、機能的に完全ではない可能性があるため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビュー機能では、最新の製品機能をいち早く提供します。これにより、お客様は開発段階で機能をテストし、フィードバックを提供できます。
3.3.1. xdp-filter ルールに一致するネットワークパケットの破棄 リンクのコピーリンクがクリップボードにコピーされました!
xdp-filter ユーティリティーは、特定のルールに一致するパケット (特定の送信元 IP アドレスや送信元 MAC アドレスからのパケット、または特定の宛先ポートへのパケットなど) を除くすべてのトラフィックを許可する allow ポリシーを使用できます。
前提条件
-
xdp-toolsパッケージがインストールされている。 - XDP プログラムをサポートするネットワークドライバー。
手順
xdp-filterを読み込み、enp1s0などの特定のインターフェイスの着信パケットを処理します。# xdp-filter load enp1s0デフォルトでは、
xdp-filterはallowポリシーを使用し、ユーティリティーはすべてのルールに一致するトラフィックのみを破棄します。オプション:
tcp、ipv4、ethernetなどの特定の機能のみを有効にするには、-f <feature>オプションを使用します。すべての機能をロードするのではなく、必要な機能のみをロードすることで、パケット処理の速度が向上します。複数の機能を有効にするには、コンマで区切ります。コマンドがエラーで失敗した場合、ネットワークドライバーは XDP プログラムをサポートしません。
ルールを追加して、それに一致するパケットをドロップします。以下に例を示します。
受信パケットをポート
22に破棄するには、次のコマンドを実行します。# xdp-filter port 22このコマンドは、TCP および UDP トラフィックに一致するルールを追加します。特定のプロトコルのみと一致する場合は、
-p protocolオプションを使用します。192.0.2.1から着信パケットを破棄するには、次のコマンドを実行します。# xdp-filter ip 192.0.2.1 -m srcxdp-filterは IP 範囲に対応していないことに注意してください。MAC アドレス
00:53:00:AA:07:BEから着信パケットを破棄するには、次のコマンドを実行します。# xdp-filter ether 00:53:00:AA:07:BE -m src
検証
以下のコマンドを使用して、破棄されたパケットおよび許可されるパケットに関する統計を表示します。
# xdp-filter status開発者であり、
xdp-filterのコードに関心がある場合は、Red Hat カスタマーポータルから対応するソース RPM (SRPM) をダウンロードしてインストールします。
3.3.2. xdp-filter ルールに一致するものを除くすべてのネットワークパケットの破棄 リンクのコピーリンクがクリップボードにコピーされました!
xdp-filter ユーティリティーは、特定のルールに一致するパケット (特定の送信元 IP アドレスや送信元 MAC アドレスからのパケット、または特定の宛先ポートへのパケットなど) を除くすべてのトラフィックを破棄する deny ポリシーを使用できます。
インターフェイスで xdp-filter を読み込む際にデフォルトのポリシーを deny に設定すると、特定のトラフィックを許可するルールを作成するまで、カーネルはこのインターフェイスからのパケットをすべて直ちに破棄します。システムからロックアウトしないようにするには、ローカルにコマンドを入力するか、別のネットワークインターフェイスからホストに接続します。
前提条件
-
xdp-toolsパッケージがインストールされている。 - ホストにローカルにログインするか、トラフィックのフィルタリングを予定しないネットワークインターフェイスを使用してホストにログインします。
- XDP プログラムをサポートするネットワークドライバー。
手順
xdp-filterを読み込み、enp1s0などの特定のインターフェイスのパケットを処理します。# xdp-filter load enp1s0 -p denyオプション:
tcp、ipv4、ethernetなどの特定の機能のみを有効にするには、-f <feature>オプションを使用します。すべての機能をロードするのではなく、必要な機能のみをロードすることで、パケット処理の速度が向上します。複数の機能を有効にするには、コンマで区切ります。コマンドがエラーで失敗した場合、ネットワークドライバーは XDP プログラムをサポートしません。
ルールを追加して、一致するパケットを許可します。以下に例を示します。
パケットのポート
22を許可するには、以下のコマンドを実行します。# xdp-filter port 22このコマンドは、TCP および UDP トラフィックに一致するルールを追加します。特定のプロトコルのみと一致するように、
-p protocolオプションをコマンドに渡します。パケットの
192.0.2.1を許可するには、次のコマンドを実行します。# xdp-filter ip 192.0.2.1xdp-filterは IP 範囲に対応していないことに注意してください。MAC アドレス
00:53:00:AA:07:BEへのパケットを許可するには、次のコマンドを実行します。# xdp-filter ether 00:53:00:AA:07:BE
重要xdp-filterユーティリティーは、ステートフルパケットの検査に対応していません。これには、-m modeオプションでモードを設定せず、マシンが送信トラフィックに応答して受信トラフィックを許可する明示的なルールを追加する必要があります。
検証
以下のコマンドを使用して、破棄されたパケットおよび許可されるパケットに関する統計を表示します。
# xdp-filter status開発者であり、
xdp-filterのコードに関心がある場合は、Red Hat カスタマーポータルから対応するソース RPM (SRPM) をダウンロードしてインストールします。
3.4. xdpdump を使用して、XDP プログラムによって破棄されたパケットを含むネットワークパケットをキャプチャーする リンクのコピーリンクがクリップボードにコピーされました!
xdpdump ユーティリティーは、XDP プログラムによって破棄または変更されたパケットを含むネットワークパケットをキャプチャーします。tcpdump とは異なり、xdpdump は eBPF プログラムを使用するため、従来のユーザー空間ユーティリティーではキャプチャーできないパケットをキャプチャーできます。
xdpdump を使用して、インターフェイスにすでに割り当てられている XDP プログラムをデバッグすることができます。したがって、ユーティリティーは、XDP プログラムを起動し、終了する前にパケットをキャプチャーできます。後者の場合、xdpdump は XDP アクションもキャプチャーします。デフォルトでは、xdpdump は XDP プログラムのエントリーで着信パケットをキャプチャーします。
AMD および Intel 64 ビット以外のアーキテクチャーでは、xdpdump ユーティリティーはテクノロジープレビュー機能としてのみ提供されます。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) ではサポートされておらず、機能的に完全ではない可能性があるため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビュー機能では、最新の製品機能をいち早く提供します。これにより、お客様は開発段階で機能をテストし、フィードバックを提供できます。
テクノロジープレビュー機能のサポート範囲は、Red Hat カスタマーポータルの テクノロジープレビュー機能のサポート範囲 を参照してください。
xdpdump には、パケットフィルターまたはデコード機能がないことに注意してください。ただし、パケットのデコードに tcpdump と組み合わせて使用できます。
前提条件
- XDP プログラムをサポートするネットワークドライバー。
-
XDP プログラムが
enp1s0インターフェイスに読み込まれている。プログラムが読み込まれていない場合は、xdpdumpが後方互換性としてtcpdumpと同様にパケットをキャプチャーします。
手順
enp1s0インターフェイスでパケットをキャプチャーして、/root/capture.pcapファイルに書き込むには、次のコマンドを実行します。# xdpdump -i enp1s0 -w /root/capture.pcap開発者であり、
xdpdumpのソースコードに関心がある場合は、Red Hat カスタマーポータルから対応するソース RPM (SRPM) をダウンロードしてインストールします。- パケットの取得を停止するには、Ctrl+C を押します。