21.5. firewalld の使用および設定
ファイアウォール は、外部からの不要なトラフィックからマシンを保護する方法です。ファイアウォールルール セットを定義することで、ホストマシンへの着信ネットワークトラフィックを制御できます。このようなルールは、着信トラフィックを分類して、拒否または許可するために使用されます。
firewalld
は、D-Bus インターフェイスを使用して、動的にカスタマイズできるホストベースのファイアウォールを提供するファイアウォールサービスデーモンです。ルールが変更するたびに、ファイアウォールデーモンを再起動しなくても、ルールの作成、変更、および削除を動的に可能にします。
firewalld
は、ゾーンおよびサービスの概念を使用して、トラフィック管理を簡素化します。ゾーンは、事前定義したルールセットです。ネットワークインターフェイスおよびソースをゾーンに割り当てることができます。許可されているトラフィックは、コンピューターが接続するネットワークと、このネットワークが割り当てられているセキュリティーレベルに従います。ファイアウォールサービスは、特定のサービスに着信トラフィックを許可するのに必要なすべての設定を扱う事前定義のルールで、ゾーンに適用されます。
サービスは、ネットワーク接続に 1 つ以上のポートまたはアドレスを使用します。ファイアウォールは、ポートに基づいて接続のフィルターを設定します。サービスに対してネットワークトラフィックを許可するには、そのポートを開く必要があります。firewalld
は、明示的に開いていないポートのトラフィックをすべてブロックします。trusted などのゾーンでは、デフォルトですべてのトラフィックを許可します。
nftables
バックエンドを使用した firewalld
が、--direct
オプションを使用して、カスタムの nftables
ルールを firewalld
に渡すことに対応していないことに注意してください。
21.5.1. firewalld
の使用
以下は、サービスやゾーンなどの firewalld
機能の概要と、firewalld
systemd サービスの管理方法を示しています。
21.5.1.1. firewalld、nftables、または iptables を使用する場合
以下は、次のユーティリティーのいずれかを使用する必要があるシナリオの概要です。
-
firewalld
:簡単なファイアウォールのユースケースには、firewalld
ユーティリティーを使用します。このユーティリティーは、使いやすく、このようなシナリオの一般的な使用例に対応しています。 -
nftables
:nftables
ユーティリティーを使用して、ネットワーク全体など、複雑なパフォーマンスに関する重要なファイアウォールを設定します。 -
iptables
:Red Hat Enterprise Linux のiptables
ユーティリティーは、legacy
バックエンドの代わりにnf_tables
カーネル API を使用します。nf_tables
API は、iptables
コマンドを使用するスクリプトが、Red Hat Enterprise Linux で引き続き動作するように、後方互換性を提供します。新しいファイアウォールスクリプトの場合には、Red Hat はnftables
を使用することを推奨します。
ファイアウォールサービスがそれぞれに影響し合うことを回避するためには、RHEL ホストでそのうちの 1 つだけを実行し、他のサービスを無効にします。
21.5.1.2. ゾーン
firewalld
は、インターフェイスに追加する信頼レベルと、そのネットワークのトラフィックに従って、複数のネットワークを複数のゾーンに分類できます。接続は、1 つのゾーンにしか指定できませんが、ゾーンは多くのネットワーク接続に使用できます。
NetworkManager
は、firewalld
にインターフェイスのゾーンを通知します。以下を使用して、ゾーンをインターフェイスに割り当てることができます。
-
NetworkManager
-
firewall-config
ツール -
firewall-cmd
コマンドラインツール - RHEL Web コンソール
後者の 3 つは、適切な 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
- 公開アクセスは可能ですが、内部ネットワークへのアクセスに制限がある非武装地帯にあるコンピューター向けです。選択した着信接続のみが許可されます。
drop
- 着信ネットワークパケットは、通知なしで遮断されます。発信ネットワーク接続だけが可能です。
external
- マスカレードをルーター用に特別に有効にした外部ネットワークでの使用向けです。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターを信頼しません。選択した着信接続のみが許可されます。
home
- そのネットワークでその他のコンピューターをほぼ信頼できる自宅での使用向けです。選択した着信接続のみが許可されます。
internal
- そのネットワークでその他のコンピューターをほぼ信頼できる内部ネットワーク向けです。選択した着信接続のみが許可されます。
public
- そのネットワークでその他のコンピューターを信頼できないパブリックエリーア向けです。選択した着信接続のみが許可されます。
trusted
- すべてのネットワーク接続が許可されます。
work
- そのネットワークで、その他のコンピューターをほぼ信頼できる職場での使用向けです。選択した着信接続のみが許可されます。
このゾーンのいずれかを デフォルト ゾーンに設定できます。インターフェイス接続を NetworkManager
に追加すると、デフォルトゾーンに割り当てられます。firewalld
のデフォルトゾーンは、インストール時に public
ゾーンに設定されます。デフォルトゾーンは変更できます。
ネットワークゾーン名は、分かりやすく、ユーザーが妥当な決定をすばやく下せるような名前が付けられています。セキュリティー問題を回避するために、ニーズおよびリスク評価に合わせて、デフォルトゾーンの設定の見直しを行ったり、不要なサービスを無効にしてください。
関連情報
-
firewalld.zone(5)
の man ページ
21.5.1.3. 事前定義サービス
サービスが、ローカルポート、プロトコル、ソースポート、宛先、そしてサービスが有効になると自動的に読み込まれるファイアウォールのヘルパーモジュールのリストを指す場合があります。サービスを使用すると、ポートのオープン、プロトコルの定義、パケット転送の有効化などを 1 つ 1 つ行うのではなく、1 回のステップで定義できます。
サービス設定オプションと、一般的なファイル情報は、man ページの firewalld.service(5)
で説明されています。サービスは、個々の XML 設定ファイルを使用して指定し、名前は、service-name.xml
のような形式になります。プロトコル名は、firewalld
のサービス名またはアプリケーション名よりも優先されます。
サービスは、グラフィカルな firewall-config
ツールと、firewall-cmd
および firewall-offline-cmd
を使用して追加または削除できます。
または、/etc/firewalld/services/
ディレクトリーの XML ファイルを変更できます。ユーザーがサービスを追加または変更しないと、/etc/firewalld/services/
には、対応する XML ファイルが記載されません。/usr/lib/firewalld/services/
ディレクトリーのファイルは、サービスを追加または変更する場合にテンプレートとして使用できます。
関連情報
-
firewalld.service(5)
の man ページ
21.5.1.4. firewalld の起動
手順
firewalld
を開始するには、root
で次のコマンドを実行します。# systemctl unmask firewalld # systemctl start firewalld
システムの起動時に
firewalld
を自動的に起動するように設定するには、root
で次のコマンドを実行します。# systemctl enable firewalld
21.5.1.5. firewalld の停止
手順
firewalld
を停止するには、root
で次のコマンドを実行します。# systemctl stop firewalld
システムの起動時に
firewalld
を自動的に起動しないように設定するには、次のコマンドを実行します。# systemctl disable firewalld
firewalld
D-Bus
インターフェイスにアクセスして firewalld を起動していないこと、そしてその他のサービスがfirewalld
を求めているかどうかを確認するには、次のコマンドを実行します。# systemctl mask firewalld
21.5.1.6. 永続的な firewalld 設定の確認
firewalld
設定ファイルを手動で編集した後など、特定の状況では、変更が正しいことを管理者が確認します。firewall-cmd
ユーティリティーを使用して設定を確認することができます。
前提条件
-
firewalld
サービスが実行している。
手順
firewalld
サービスの永続的な設定を確認します。# firewall-cmd --check-config success
永続的な設定が有効になると、コマンドが
success
を返します。その他の場合は、以下のような詳細で、コマンドがエラーを返します。# firewall-cmd --check-config Error: INVALID_PROTOCOL: 'public.xml': 'tcpx' not from {'tcp'|'udp'|'sctp'|'dccp'}
21.5.2. firewalld
の現在の状況および設定の表示
firewalld
サービスを監視するために、ステータス、許可されたサービス、および設定を表示できます。
21.5.2.1. firewalld
の現在の状況の表示
ファイアウォールサービス firewalld
は、システムにデフォルトでインストールされています。CLI インターフェイス firewalld
を使用して、サービスが実行していることを確認します。
手順
サービスの状況を表示するには、次のコマンドを実行します。
# firewall-cmd --state
サービスの状況の詳細は、
systemctl status
サブコマンドを実行します。# systemctl status firewalld firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor pr Active: active (running) since Mon 2017-12-18 16:05:15 CET; 50min ago Docs: man:firewalld(1) Main PID: 705 (firewalld) Tasks: 2 (limit: 4915) CGroup: /system.slice/firewalld.service └─705 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid
21.5.2.2. GUI を使用した許可されたサービスの表示
グラフィカルの firewall-config ツールを使用してサービスの一覧を表示する場合は、Super キーを押してアクティビティーの概要を開き、firewall
と入力して Enter を押します。firewall-config ツールが表示されます。Services
タブの下にサービスのリストが表示されます。
グラフィカルなファイアウォール設定ツールは、コマンドラインを使用して起動できます。
前提条件
-
firewall-config
パッケージがインストールされている。
手順
コマンドラインを使用してグラフィカルなファイアウォール設定ツールを起動するには、次のコマンドを実行します。
$ firewall-config
Firewall Configuration
ウィンドウが開きます。このコマンドは通常のユーザーとして実行できますが、監理者パスワードが求められる場合もあります。
21.5.2.3. CLI を使用した firewalld 設定の表示
CLI クライアントで、現在のファイアウォール設定を、複数の方法で表示できます。--list-all
オプションは、firewalld
設定の完全概要を表示します。
firewalld
は、ゾーンを使用してトラフィックを管理します。--zone
オプションでゾーンを指定しないと、コマンドは、アクティブネットワークインターフェイスおよび接続に割り当てたデフォルトゾーンに対して有効になります。
手順
デフォルトゾーンに関連する情報をすべて表示するには、次のコマンドを実行します。
# firewall-cmd --list-all public target: default icmp-block-inversion: no interfaces: sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
設定を表示するゾーンを指定するには、たとえば、
--zone=zone-name
引数をfirewall-cmd --list-all
コマンドに指定します。# firewall-cmd --list-all --zone=home home target: default icmp-block-inversion: no interfaces: sources: services: ssh mdns samba-client dhcpv6-client ...
サービス、ポートなど、特定情報の設定を確認するには、特定のオプションを使用します。
firewalld
の man ページか、コマンドの help でオプションのリストを表示します。# firewall-cmd --help
現在のゾーンで許可されているサービスを表示するには、次のコマンドを実行します。
# firewall-cmd --list-services ssh dhcpv6-client
CLI ツールを使用してリスト表示した特定のサブパートの設定は、解釈が難しいことがしばしばあります。たとえば、firewalld
で SSH
サービスを許可し、そのサービスに必要なポート (22) を開くことができます。許可されたサービスをリスト表示すると、リストには SSH
サービスが表示されますが、開いているポートをリスト表示しても、何も表示されません。したがって、--list-all
オプションを使用して、完全な情報を取得することが推奨されます。
21.5.3. firewalld
でネットワークトラフィックの制御
firewalld
パッケージは、事前定義された多数のサービスファイルをインストールし、それらをさらに追加したり、カスタマイズしたりできます。さらに、これらのサービス定義を使用して、サービスが使用するプロトコルとポート番号を知らなくても、サービスのポートを開いたり閉じたりできます。
21.5.3.1. 緊急時に CLI を使用してすべてのトラフィックの無効化
システムへの攻撃などの緊急な状態にあるとき、すべてのネットワークトラフィックを無効にし、攻撃を遮断できます。
手順
ネットワークトラフィックを直ちに無効にするには、パニックモードをオンにします。
# firewall-cmd --panic-on
重要パニックモードを有効にすると、ネットワークトラフィックがすべて停止します。したがって、そのマシンへの物理アクセスがある場合、またはシリアルコンソールを使用してログインする場合に限り使用してください。
パニックモードをオフにし、ファイアウォールを永続設定に戻します。パニックモードを無効にするには、次のコマンドを実行します。
# firewall-cmd --panic-off
検証
パニックモードを有効または無効にするには、次のコマンドを実行します。
# firewall-cmd --query-panic
21.5.3.2. CLI を使用して事前定義されたサービスでトラフィックの制御
トラフィックを制御する最も簡単な方法は、事前定義したサービスを firewalld
に追加する方法です。これにより、必要なすべてのポートが開き、service definition file に従ってその他の設定が変更されます。
手順
サービスが許可されていないことを確認します。
# firewall-cmd --list-services ssh dhcpv6-client
事前定義したサービスのリストを表示します。
# 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 ...
サービスを、許可されたサービスに追加します。
# firewall-cmd --add-service=<service_name>
新しい設定を永続化します。
# firewall-cmd --runtime-to-permanent
21.5.3.3. GUI を使用して事前定義サービスでトラフィックを制御
グラフィカルユーザーインターフェイスを使用して、事前定義サービスでネットワークトラフィックを制御できます。
前提条件
-
firewall-config
パッケージがインストールされている
手順
事前定義したサービスまたはカスタマイズしたサービスを有効または無効にするには、以下を行います。
- firewall-config ツールを起動して、サービスを設定するネットワークゾーンを選択します。
-
Zones
タブを選択してから、下のServices
タブを選択します。 - 信頼するサービスのタイプごとにチェックボックスをオンにするか、チェックボックスをオフにして、選択したゾーンのサービスをブロックします。
サービスを編集するには、以下を行います。
- firewall-config ツールを起動します。
-
Configuration
メニューからPermanent
を選択します。 ウィンドウの下部に、その他のアイコンおよびメニューボタンが表示されます。 - 設定するサービスを選択します。
Ports
、Protocols
、Source Port
のタブでは、選択したサービスのポート、プロトコル、およびソースポートの追加、変更、ならびに削除が可能です。モジュールタブは、Netfilter ヘルパーモジュールの設定を行います。Destination
タブは、特定の送信先アドレスとインターネットプロトコル (IPv4
または IPv6
) へのトラフィックが制限できます。
Runtime
モードでは、サービス設定を変更できません。
21.5.3.4. 新しいサービスの追加
サービスは、グラフィカルな firewall-config ツールと、firewall-cmd
および firewall-offline-cmd
を使用して追加または削除できます。または、/etc/firewalld/services/
にある XML ファイルを編集できます。ユーザーがサービスを追加または変更しないと、対応する XML ファイルが /etc/firewalld/services/
に作成されません。/usr/lib/firewalld/services/
のファイルは、サービスを追加または変更する際にテンプレートとして使用できます。
サービス名は英数字にする必要があります。_
(下線) 文字および -
(ハイフン) 文字も使用できます。
手順
firewalld
がアクティブでない場合に、ターミナルで新しいサービスを追加するには、firewall-cmd
または firewall-offline-cmd
を使用します。
新しい、空のサービスを追加するには、次のコマンドを実行します。
$ firewall-cmd --new-service=<service_name> --permanent
ローカルファイルを使用して新規サービスを追加するには、次のコマンドを使用します。
$ firewall-cmd --new-service-from-file=<service_xml_file> --permanent
--name= <service_name>
オプションを追加して、サービス名を変更できます。サービス設定を変更すると、直ちにサービスの更新コピーが
/etc/firewalld/services/
に作成できます。root
で次のコマンドを実行して、サービスを手動でコピーします。# cp /usr/lib/firewalld/services/service-name.xml /etc/firewalld/services/service-name.xml
firewalld
は、最初に /usr/lib/firewalld/services
のファイルを読み込みます。ファイルは /etc/firewalld/services
に置かれ、そのファイルが有効な場合は、/usr/lib/firewalld/services
で一致するファイルを上書きします。/usr/lib/firewalld/services
で上書きしたファイルは、/etc/firewalld/services
で一致するファイルが削除されるとすぐに、もしくはサービスのデフォルトを読み込むように firewalld
が求められた場合に使用されます。これに該当するのは永続環境のみです。ランタイム環境でフォールバックさせるには、再読み込みが必要です。
21.5.3.5. GUI を使用してポートを開く
特定のポートへのファイアウォールを通過するトラフィックを許可する場合は、GUI でポートを開くことができます。
前提条件
-
firewall-config
パッケージがインストールされている
手順
- firewall-config ツールを起動し、設定を変更するネットワークゾーンを選択します。
-
右側の
Ports
タブを選択し、 ボタンをクリックします。Port and Protocol
ウィンドウが開きます。 - 許可するポート番号またはポートの範囲を入力します。
-
リストから
tcp
またはudp
を選択します。
21.5.3.6. GUI を使用してプロトコルを使用したトラフィックの制御
特定のプロトコルを使用してファイアウォールを経由したトラフィックを許可するには、GUI を使用できます。
前提条件
-
firewall-config
パッケージがインストールされている
手順
- firewall-config ツールを起動し、設定を変更するネットワークゾーンを選択します。
-
右側で
Protocols
タブを選択し、Add
ボタンをクリックします。Protocol
ウィンドウが開きます。 -
リストからプロトコルを選択するか、
Other Protocol
チェックボックスを選択し、そのフィールドにプロトコルを入力します。
21.5.3.7. GUI を使用してソースポートを開く
特定ポートからファイアウォールを経由したトラフィックを許可するには、GUI を使用できます。
前提条件
-
firewall-config
パッケージがインストールされている
手順
- firewall-config ツールを起動し、設定を変更するネットワークゾーンを選択します。
-
右側の
Source Port
タブを選択し、Add
ボタンをクリックします。Source Port
ウィンドウが開きます。 -
許可するポート番号またはポートの範囲を入力します。リストから
tcp
またはudp
を選択します。
21.5.4. CLI を使用したポートの制御
ポートは、オペレーティングシステムが、ネットワークトラフィックを受信し、区別し、システムサービスに従って転送する論理デバイスです。これは、通常、ポートをリッスンするデーモンにより示されますが、このポートに入るトラフィックを待ちます。
通常、システムサービスは、サービスに予約されている標準ポートでリッスンします。httpd
デーモンは、たとえば、ポート 80 をリッスンします。ただし、デフォルトでは、システム管理者は、セキュリティーを強化するため、またはその他の理由により、別のポートをリッスンするようにデーモンを設定します。
21.5.4.1. ポートを開く
開かれたポートを介して、システムが外部からアクセスできます。これはセキュリティーリスクでもあります。一般的に、ポートを閉じたままにし、特定サービスに要求される場合に限り開きます。
手順
現在のゾーンで開かれたポートのリストを表示するには、以下を行います。
許可されているポートのリストを表示します。
# firewall-cmd --list-ports
許可されているポートにポートを追加して、着信トラフィックに対してそのポートを開きます。
# firewall-cmd --add-port=port-number/port-type
ポートタイプは、
tcp
、udp
、sctp
、またはdccp
になります。このタイプは、ネットワーク接続の種類と一致させる必要があります。新しい設定を永続化します。
# firewall-cmd --runtime-to-permanent
ポートタイプは、
tcp
、udp
、sctp
、またはdccp
になります。このタイプは、ネットワーク接続の種類と一致させる必要があります。
21.5.4.2. ポートを閉じる
開しているポートが必要なくなった場合に、firewalld
のポートを閉じます。ポートをそのままにするとセキュリティーリスクとなるため、使用されなくなったらすぐに不要なポートを閉じることが強く推奨されます。
手順
ポートを閉じるには、許可されているポートのリストからそれを削除します。
許可されているポートのリストを表示します。
# firewall-cmd --list-ports
警告このコマンドにより、ポートとして開かれているポートのみが表示されます。サービスとして開いているポートは表示されません。したがって、
--list-ports
ではなく--list-all
オプションの使用を検討してください。許可されているポートからポートを削除し、着信トラフィックに対して閉じます。
# firewall-cmd --remove-port=port-number/port-type
新しい設定を永続化します。
# firewall-cmd --runtime-to-permanent
21.5.5. ファイアウォールゾーンでの作業
ゾーンは、着信トラフィックをより透過的に管理する概念を表しています。ゾーンはネットワークインターフェイスに接続されているか、ソースアドレスの範囲に割り当てられます。各ゾーンは個別にファイアウォールルールを管理しますが、これにより、複雑なファイアウォール設定を定義してトラフィックに割り当てることができます。
21.5.5.1. ゾーンのリスト
コマンドラインを使用してゾーンを一覧表示できます。
手順
システムで利用可能なゾーンを確認するには、次のコマンドを実行します。
# firewall-cmd --get-zones
firewall-cmd --get-zones
コマンドは、システムで利用可能な全てのゾーンを表示し、特定ゾーンの詳細は表示しません。すべてのゾーンで詳細情報を表示する場合は、次のコマンドを実行します。
# firewall-cmd --list-all-zones
特定ゾーンに関する詳細情報を表示する場合は、次のコマンドを実行します。
# firewall-cmd --zone=zone-name --list-all
21.5.5.2. 特定ゾーンに対する firewalld 設定の修正
CLI を使用して事前定義されたサービスでトラフィックの制御 および CLI を使用したポートの制御 では、サービスを追加する方法や、現在のワークゾーンの範囲内でポートを変更する方法について説明します。別のゾーンへのルールの設定が必要になる場合もあります。
手順
別のゾーンで作業するには、
--zone= <zone_name>
オプションを使用します。たとえば、public
ゾーンでSSH
サービスを許可するには、次のようにします。# firewall-cmd --add-service=ssh --zone=public
21.5.5.3. デフォルトゾーンの変更
システム管理者は、設定ファイルのネットワークインターフェイスにゾーンを割り当てます。特定のゾーンに割り当てられないインターフェイスは、デフォルトゾーンに割り当てられます。firewalld
サービスを再起動するたびに、firewalld
は、デフォルトゾーンの設定を読み込み、それをアクティブにします。
手順
デフォルトゾーンを設定するには、以下を行います。
現在のデフォルトゾーンを表示します。
# firewall-cmd --get-default-zone
新しいデフォルトゾーンを設定します。
# firewall-cmd --set-default-zone <zone_name>
注記この手順では、
--permanent
オプションを使用しなくても、設定は永続化します。
21.5.5.4. ゾーンへのネットワークインターフェイスの割り当て
複数のゾーンに複数のルールセットを定義して、使用されているインターフェイスのゾーンを変更することで、迅速に設定を変更できます。各インターフェイスに特定のゾーンを設定して、そのゾーンを通過するトラフィックを設定できます。
手順
特定インターフェイスにゾーンを割り当てるには、以下を行います。
アクティブゾーン、およびそのゾーンに割り当てられているインターフェイスをリスト表示します。
# firewall-cmd --get-active-zones
別のゾーンにインターフェイスを割り当てます。
# firewall-cmd --zone=zone_name --change-interface=interface_name --permanent
21.5.5.5. nmcli を使用して接続にゾーンを割り当て
nmcli
ユーティリティーを使用して、firewalld
ゾーンを NetworkManager
接続に追加できます。
手順
ゾーンを
NetworkManager
接続プロファイルに割り当てます。# nmcli connection modify profile connection.zone zone_name
接続をアクティベートします。
# nmcli connection up profile
21.5.5.6. ifcfg ファイルでゾーンをネットワーク接続に手動で割り当て
NetworkManager で接続を管理する場合は、NetworkManager が使用するゾーンを認識する必要があります。すべてのネットワーク接続にゾーンを指定できます。これにより、ポータブルデバイスを使用したコンピューターの場所に従って、様々なファイアウォールを柔軟に設定できるようになります。したがって、ゾーンおよび設定には、会社または自宅など、様々な場所を指定できます。
手順
接続のゾーンを設定するには、
/etc/sysconfig/network-scripts/ifcfg-connection_name
ファイルを変更して、この接続にゾーンを割り当てる行を追加します。ZONE=zone_name
21.5.5.7. 新しいゾーンの作成
カスタムゾーンを使用するには、新しいゾーンを作成したり、事前定義したゾーンなどを使用したりします。新しいゾーンには --permanent
オプションが必要となり、このオプションがなければコマンドは動作しません。
手順
新しいゾーンを作成します。
# firewall-cmd --permanent --new-zone=zone-name
作成したゾーンが永続設定に追加されたかどうかを確認します。
# firewall-cmd --get-zones
新しい設定を永続化します。
# firewall-cmd --runtime-to-permanent
21.5.5.8. ゾーンの設定ファイル
また、ゾーンの設定ファイル を使用してゾーンを作成できます。このアプローチは、新しいゾーンを作成する必要がある場合に、別のゾーンの設定を変更して利用する場合に便利です。
firewalld
ゾーン設定ファイルには、ゾーンに対する情報があります。これは、XML ファイル形式で、ゾーンの説明、サービス、ポート、プロトコル、icmp-block、マスカレード、転送ポート、およびリッチ言語ルールです。ファイル名は zone-name.xml
となります。zone-name の長さは 17 文字に制限されます。ゾーンの設定ファイルは、/usr/lib/firewalld/zones/
ディレクトリーおよび /etc/firewalld/zones/
ディレクトリーに置かれています。
以下の例は、TCP
プロトコルまたは UDP
プロトコルの両方に、1 つのサービス (SSH
) および 1 つのポート範囲を許可する設定を示します。
<?xml version="1.0" encoding="utf-8"?> <zone> <short>My Zone</short> <description>Here you can describe the characteristic features of the zone.</description> <service name="ssh"/> <port protocol="udp" port="1025-65535"/> <port protocol="tcp" port="1025-65535"/> </zone>
そのゾーンの設定を変更するには、セクションを追加または削除して、ポート、転送ポート、サービスなどを追加します。
関連情報
-
firewalld.zone
man ページ
21.5.5.9. 着信トラフィックにデフォルトの動作を設定するゾーンターゲットの使用
すべてのゾーンに対して、特に指定されていない着信トラフィックを処理するデフォルト動作を設定できます。そのような動作は、ゾーンのターゲットを設定することで定義されます。4 つのオプションがあります。
-
ACCEPT
:指定したルールで許可されていないパケットを除いた、すべての着信パケットを許可します。 -
REJECT
:指定したルールで許可されているパケット以外の着信パケットをすべて拒否します。firewalld
がパケットを拒否すると、送信元マシンに拒否について通知されます。 -
DROP
:指定したルールで許可されているパケット以外の着信パケットをすべて破棄します。firewalld
がパケットを破棄すると、ソースマシンにパケット破棄の通知がされません。 -
default
:REJECT
と似ていますが、特定のシナリオで特別な意味を持ちます。詳細は、firewall-cmd(1)
man ページの適応およびクエリーゾーンとポリシーのオプション
セクションを参照してください。
手順
ゾーンにターゲットを設定するには、以下を行います。
特定ゾーンに対する情報をリスト表示して、デフォルトゾーンを確認します。
# firewall-cmd --zone=zone-name --list-all
ゾーンに新しいターゲットを設定します。
# firewall-cmd --permanent --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>
関連情報
-
firewall-cmd(1)
man ページ
21.5.6. ゾーンを使用し、ソースに応じた着信トラフィックの管理
ゾーンを使用して、そのソースに基づいて着信トラフィックを管理するゾーンを使用できます。これにより、着信トラフィックを分類し、複数のゾーンに向け、トラフィックにより到達できるサービスを許可または拒否できます。
ソースをゾーンに追加する場合は、ゾーンがアクティブになり、そのソースからの着信トラフィックは、それを介して行われます。各ゾーンに異なる設定を指定できますが、それは指定したソースから順次トラフィックに適用されます。ネットワークインターフェイスが 1 つしかない場合でも、複数のゾーンを使用できます。
21.5.6.1. ソースの追加
着信トラフィックを特定のゾーンに転送する場合は、そのゾーンにソースを追加します。ソースは、CIDR (Classless Inter-domain Routing) 表記法の IP アドレスまたは IP マスクになります。
ネットワーク範囲が重複している複数のゾーンを追加する場合は、ゾーン名で順序付けされ、最初のゾーンのみが考慮されます。
現在のゾーンにソースを設定するには、次のコマンドを実行します。
# firewall-cmd --add-source=<source>
特定ゾーンのソース IP アドレスを設定するには、次のコマンドを実行します。
# firewall-cmd --zone=zone-name --add-source=<source>
以下の手順は、信頼される
ゾーンで 192.168.2.15 からのすべての着信トラフィックを許可します。
手順
利用可能なゾーンの一覧を表示します。
# firewall-cmd --get-zones
永続化モードで、信頼ゾーンにソース IP を追加します。
# firewall-cmd --zone=trusted --add-source=192.168.2.15
新しい設定を永続化します。
# firewall-cmd --runtime-to-permanent
21.5.6.2. ソースの削除
ゾーンからソースを削除すると、そのゾーンからのトラフィックを遮断します。
手順
必要なゾーンに対して許可されているソースのリストを表示します。
# firewall-cmd --zone=zone-name --list-sources
ゾーンからソースを永続的に削除します。
# firewall-cmd --zone=zone-name --remove-source=<source>
新しい設定を永続化します。
# firewall-cmd --runtime-to-permanent
21.5.6.3. ソースポートの追加
発信源となるポートに基づいたトラフィックの分類を有効にするには、--add-source-port
オプションを使用してソースポートを指定します。--add-source
オプションと組み合わせて、トラフィックを特定の IP アドレスまたは IP 範囲に制限できます。
手順
ソースポートを追加するには、次のコマンドを実行します。
# firewall-cmd --zone=zone-name --add-source-port=<port-name>/<tcp|udp|sctp|dccp>
21.5.6.4. ソースポートの削除
ソースポートを削除して、送信元ポートに基づいてトラフィックの分類を無効にします。
手順
ソースポートを削除するには、次のコマンドを実行します。
# firewall-cmd --zone=zone-name --remove-source-port=<port-name>/<tcp|udp|sctp|dccp>
21.5.6.5. ゾーンおよびソースを使用して特定ドメインのみに対してサービスの許可
特定のネットワークからのトラフィックを許可して、マシンのサービスを使用するには、ゾーンおよびソースを使用します。以下の手順では、他のトラフィックがブロックされている間に 192.0.2.0/24
ネットワークからの HTTP トラフィックのみを許可します。
このシナリオを設定する場合は、default
のターゲットを持つゾーンを使用します。192.0.2.0/24
からのトラフィックではネットワーク接続がすべて許可されるため、ターゲットが ACCEPT
に設定されたゾーンを使用することは、セキュリティー上のリスクになります。
手順
利用可能なゾーンのリストを表示します。
# firewall-cmd --get-zones block dmz drop external home internal public trusted work
IP 範囲を
internal
ゾーンに追加し、ソースから発信されるトラフィックをゾーン経由でルーティングします。# firewall-cmd --zone=internal --add-source=192.0.2.0/24
http
サービスをinternal
ゾーンに追加します。# firewall-cmd --zone=internal --add-service=http
新しい設定を永続化します。
# firewall-cmd --runtime-to-permanent
検証
internal
ゾーンがアクティブで、サービスが許可されていることを確認します。# firewall-cmd --zone=internal --list-all internal (active) target: default icmp-block-inversion: no interfaces: sources: 192.0.2.0/24 services: cockpit dhcpv6-client mdns samba-client ssh http ...
関連情報
-
firewalld.zones(5)
の man ページ
21.5.7. ゾーン間で転送されるトラフィックのフィルタリング
ポリシーオブジェクトを使用すると、ユーザーはポリシーで同様のパーミッションを必要とする異なるアイデンティティーをグループ化できます。トラフィックの方向に応じてポリシーを適用できます。
ポリシーオブジェクト policy objects 機能は、firewalld で正引きフィルターと出力フィルターを提供します。firewalld を使用して、異なるゾーン間のトラフィックをフィルタリングし、ローカルでホストされている仮想マシンへのアクセスを許可して、ホストを接続できます。
21.5.7.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
シンボリックゾーンは、すべてのゾーンのワイルドカードとして機能します。
21.5.7.2. 優先度を使用したポリシーのソート
同じトラフィックセットに複数のポリシーを適用できるため、優先度を使用して、適用される可能性のあるポリシーの優先順位を作成する必要があります。
ポリシーをソートする優先度を設定するには、次のコマンドを実行します。
# firewall-cmd --permanent --policy mypolicy --set-priority -500
この例では、-500 の優先度は低くなりますが、優先度は高くなります。したがって、-500 は、-100 より前に実行されます。優先度の高い値は、低い値よりも優先されます。
ポリシーの優先度には、以下のルールが適用されます。
- 負の優先度を持つポリシーは、ゾーンのルールの前に適用されます。
- 正の優先度を持つポリシーは、ゾーンのルールの後に適用されます。
- 優先度 0 は予約されているため、使用できません。
21.5.7.3. ポリシーオブジェクトを使用した、ローカルでホストされているコンテナーと、ホストに物理的に接続されているネットワークとの間でのトラフィックのフィルタリング
ポリシーオブジェクト機能を使用すると、コンテナーと仮想マシンのトラフィックをフィルターにかけることができます。
手順
新しいポリシーを作成します。
# firewall-cmd --permanent --new-policy podmanToHost
すべてのトラフィックをブロックします。
# firewall-cmd --permanent --policy podmanToHost --set-target REJECT # firewall-cmd --permanent --policy podmanToHost --add-service dhcp # firewall-cmd --permanent --policy podmanToHost --add-service dns
注記Red Hat では、デフォルトでホストへのすべてのトラフィックをブロックしてから、ホストに必要なサービスを選択的に開くことを推奨しています。
ポリシーで使用する入力ゾーンを定義します。
# firewall-cmd --permanent --policy podmanToHost --add-ingress-zone podman
ポリシーで使用する出力ゾーンを定義します。
# firewall-cmd --permanent --policy podmanToHost --add-egress-zone ANY
検証
ポリシーに関する情報を確認します。
# firewall-cmd --info-policy podmanToHost
21.5.7.4. ポリシーオブジェクトのデフォルトターゲットの設定
ポリシーには --set-target オプションを指定できます。以下のターゲットを使用できます。
-
ACCEPT
- パケットを受け入れます -
DROP
- 不要なパケットを破棄します -
REJECT
- ICMP 応答で不要なパケットを拒否します CONTINUE
(デフォルト) - パケットは、次のポリシーとゾーンのルールに従います。# firewall-cmd --permanent --policy mypolicy --set-target CONTINUE
検証
ポリシーに関する情報の確認
# firewall-cmd --info-policy mypolicy
21.5.8. firewalld を使用した NAT の設定
firewalld
では、以下のネットワークアドレス変換 (NAT) タイプを設定できます。
- マスカレーディング
- ソース NAT (SNAT)
- 宛先 NAT (DNAT)
- リダイレクト
21.5.8.1. NAT タイプ
以下は、ネットワークアドレス変換 (NAT) タイプになります。
- マスカレードおよびソースの NAT (SNAT)
この NAT タイプのいずれかを使用して、パケットのソース IP アドレスを変更します。たとえば、インターネットサービスプロバイダーは、プライベート 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 の特殊なケースです。たとえば、サービスが標準ポートとは異なるポートで実行する場合は、標準ポートからこの特定のポートに着信トラフィックをリダイレクトすることができます。
21.5.8.2. IP アドレスのマスカレードの設定
システムで IP マスカレードを有効にできます。IP マスカレードは、インターネットにアクセスする際にゲートウェイの向こう側にある個々のマシンを隠します。
手順
external
ゾーンなどで IP マスカレーディングが有効かどうかを確認するには、root
で次のコマンドを実行します。# firewall-cmd --zone=external --query-masquerade
このコマンドでは、有効な場合は
yes
と出力され、終了ステータスは0
になります。無効の場合はno
と出力され、終了ステータスは1
になります。zone
を省略すると、デフォルトのゾーンが使用されます。IP マスカレードを有効にするには、
root
で次のコマンドを実行します。# firewall-cmd --zone=external --add-masquerade
-
この設定を永続化するには、
--permanent
オプションをコマンドに渡します。 IP マスカレードを無効にするには、
root
で次のコマンドを実行します。# firewall-cmd --zone=external --remove-masquerade
この設定を永続化するには、
--permanent
をコマンドラインに渡します。
21.5.9. DNAT を使用して HTTPS トラフィックを別のホストに転送する
Web サーバーがプライベート IP アドレスを持つ DMZ で実行されている場合は、宛先ネットワークアドレス変換 (DNAT) を設定して、インターネット上のクライアントがこの Web サーバーに接続できるようにすることができます。この場合、Web サーバーのホスト名はルーターのパブリック IP アドレスに解決されます。クライアントがルーターの定義済みポートへの接続を確立すると、ルーターはパケットを内部 Web サーバーに転送します。
前提条件
- DNS サーバーが、Web サーバーのホスト名をルーターの IP アドレスに解決している。
次の設定を把握している。
- 転送するプライベート IP アドレスおよびポート番号
- 使用する IP プロトコル
- パケットをリダイレクトする Web サーバーの宛先 IP アドレスおよびポート
手順
ファイアウォールポリシーを作成します。
# firewall-cmd --permanent --new-policy ExamplePolicy
ポリシーは、ゾーンとは対照的に、入力、出力、および転送されるトラフィックのパケットフィルタリングを許可します。ローカルで実行されている Web サーバー、コンテナー、または仮想マシン上のエンドポイントにトラフィックを転送するには、このような機能が必要になるため、これは重要です。
受信トラフィックと送信トラフィックのシンボリックゾーンを設定して、ルーター自体がローカル IP アドレスに接続し、このトラフィックを転送できるようにします。
# firewall-cmd --permanent --policy=ExamplePolicy --add-ingress-zone=HOST # firewall-cmd --permanent --policy=ExamplePolicy --add-egress-zone=ANY
--add-ingress-zone=HOST
オプションは、ローカルで生成され、ローカルホストから送信されるパケットを参照します。--add-egress-zone=ANY
オプションは、任意のゾーン宛てのトラフィックを参照します。トラフィックを Web サーバーに転送するリッチルールを追加します。
# firewall-cmd --permanent --policy=ExamplePolicy --add-rich-rule='rule family="ipv4" destination address="192.0.2.1" forward-port port="443" protocol="tcp" to-port="443" to-addr="192.51.100.20"'
リッチルールは、ルーターの IP アドレス 192.0.2.1 のポート 443 から Web サーバーの IP 192.51.100.20 のポート 443 に TCP トラフィックを転送します。ルールは
ExamplePolicy
を使用して、ルーターがローカル IP アドレスにも接続できるようにします。ファイアウォール設定ファイルをリロードします。
# firewall-cmd --reload success
カーネルで 127.0.0.0/8 のルーティングを有効にします。
# echo "net.ipv4.conf.all.route_localnet=1" > /etc/sysctl.d/90-enable-route-localnet.conf # sysctl -p /etc/sysctl.d/90-enable-route-localnet.conf
検証
Web サーバーに転送したルーターの IP アドレスおよびポートに接続します。
# curl https://192.0.2.1:443
オプション:
net.ipv4.conf.all.route_localnet
がアクティブであることを確認します。# sysctl net.ipv4.conf.all.route_localnet net.ipv4.conf.all.route_localnet = 1
ExamplePolicy
がアクティブで、必要な設定が含まれていることを確認します。特に、送信元 IP アドレスとポート、使用するプロトコル、および宛先 IP アドレスとポート:# firewall-cmd --info-policy=ExamplePolicy ExamplePolicy (active) priority: -1 target: CONTINUE ingress-zones: HOST egress-zones: ANY services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" destination address="192.0.2.1" forward-port port="443" protocol="tcp" to-port="443" to-addr="192.51.100.20"
関連情報
-
firewall-cmd(1)
、firewalld.policies(5)
、firewalld.richlanguage(5)
、sysctl(8)
、およびsysctl.conf(5)
の man ページ - /etc/sysctl.d/ の設定ファイルでカーネルパラメーターの調整
21.5.10. ICMP リクエストの管理
Internet Control Message Protocol
(ICMP
) は、接続問題 (要求されているサービスが利用できないなど) を示すエラーメッセージと運用情報を送信するために、様々なネットワークデバイスにより使用されているサポート対象のプロトコルです。ICMP
は、システム間でデータを交換するのに使用されていないため、TCP、UDP などの転送プロトコルとは異なります。
ただし、ICMP
メッセージ (特に echo-request
および echo-reply
) を利用して、ネットワークに関する情報を明らかにし、その情報をさまざまな不正行為に悪用することが可能です。したがって、firewalld
は、ネットワーク情報を保護するため、ICMP
リクエストをブロックできます。
21.5.10.1. ICMP リクエストのリスト表示およびブロック
ICMP
リクエストのリスト表示
ICMP
リクエストは、/usr/lib/firewalld/icmptypes/
ディレクトリーにある各 XML ファイルで説明されています。リクエストの説明は、このファイルを参照してください。firewall-cmd
コマンドは、ICMP
リクエストの操作を制御します。
利用可能な
ICMP
タイプのリストを表示するには、次のコマンドを実行します。#
firewall-cmd --get-icmptypes
ICMP
リクエストは、IPv4、IPv6、またはその両方のプロトコルで使用できます。ICMP
リクエストが使用されているプロトコルを表示するには、次のコマンドを実行します。#
firewall-cmd --info-icmptype=<icmptype>
ICMP
リクエストのステータスは、リクエストが現在ブロックされている場合はyes
、ブロックされていない場合はno
となります。ICMP
リクエストが現在ブロックされているかどうかを確認するには、次のコマンドを実行します。#
firewall-cmd --query-icmp-block=<icmptype>
ICMP
リクエストのブロックまたはブロックの解除
サーバーが ICMP
リクエストをブロックした場合は、通常の情報が提供されません。ただし、情報が全く提供されないというわけではありません。クライアントは、特定の ICMP
リクエストがブロックされている (拒否されている) 情報を受け取ります。ICMP
リクエストは、特に IPv6 トラフィックを使用すると、接続問題が発生することがあるため、注意深く検討する必要があります。
ICMP
リクエストが現在ブロックされているかどうかを確認するには、次のコマンドを実行します。#
firewall-cmd --query-icmp-block=<icmptype>
ICMP
リクエストをブロックするには、次のコマンドを実行します。#
firewall-cmd --add-icmp-block=<icmptype>
ICMP
リクエストのブロックを削除するには、次のコマンドを実行します。#
firewall-cmd --remove-icmp-block=<icmptype>
情報をまったく指定せずに ICMP
リクエストのブロック
通常、ICMP
リクエストをブロックすると、ブロックしていることをクライアントは認識します。したがって、ライブの IP アドレスを傍受している潜在的な攻撃者は、IP アドレスがオンラインであることを確認できます。この情報を完全に非表示にするには、ICMP
リクエストをすべて破棄する必要があります。
-
すべての
ICMP
リクエストをブロックして破棄するには、次のコマンドを実行します。 ゾーンのターゲットを
DROP
に設定します。#
firewall-cmd --permanent --set-target=DROP
これで、明示的に許可されるトラフィックを除き、ICMP
リクエストを含むすべてのトラフィックが破棄されます。
特定の ICMP
リクエストをブロックして破棄し、その他のリクエストを許可するには、以下を行います。
ゾーンのターゲットを
DROP
に設定します。#
firewall-cmd --permanent --set-target=DROP
すべての
ICMP
リクエストを一度にブロックする、ICMP ブロックの反転を追加します。#
firewall-cmd --add-icmp-block-inversion
許可する
ICMP
リクエストに ICMP ブロックを追加する場合は、次のコマンドを実行します。#
firewall-cmd --add-icmp-block=<icmptype>
新しい設定を永続化します。
#
firewall-cmd --runtime-to-permanent
ブロックの反転 は、ICMP
リクエストブロックの設定を反転します。そのため、ゾーンのターゲットが DROP
に変更されたため、ブロックされていないリクエストはすべてブロックされます。ブロックされているリクエストはブロックされません。これは、リクエストのブロックを解除する場合は、ブロックコマンドを使用する必要があることを示しています。
ブロックの反転を、完全許可の設定に戻すには、以下を行います。
ゾーンのターゲットを
default
またはACCEPT
に戻すには、次のコマンドを設定します。#
firewall-cmd --permanent --set-target=default
ICMP
リクエストに追加したすべてのブロックを削除します。#
firewall-cmd --remove-icmp-block=<icmptype>
ICMP
ブロックの反転を削除します。#
firewall-cmd --remove-icmp-block-inversion
新しい設定を永続化します。
#
firewall-cmd --runtime-to-permanent
21.5.10.2. GUI を使用した ICMP フィルターの設定
-
ICMP
フィルターを有効または無効にするには、firewall-config ツールを起動して、フィルターをかけるメッセージのネットワークゾーンを選択します。ICMP フィルター
タブを選択し、フィルターをかけるICMP
メッセージの各タイプのチェックボックスを選択します。フィルターを無効にするには、チェックボックスの選択を外します。これは方向ごとに設定され、デフォルトではすべてが許可されます。 -
ICMP フィルター
の反転を有効にするには、右側のフィルターの反転
チェックボックスをクリックします。マークがついたICMP
タイプだけが許可され、その他はすべて拒否されます。DROP ターゲットを使用するゾーンでは破棄されます。
21.5.11. firewalld
を使用した IP セットの設定および制御
firewalld
で対応する IP セットタイプのリストを表示するには、root で次のコマンドを実行します。
# firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net
Red Hat は、firewalld
を介して管理していない IP セットを使用することは推奨しません。このような IP セットを使用すると、そのセットを参照する永続的なダイレクトルールが必要で、IP セットを作成するカスタムサービスを追加する必要があります。このサービスは、firewalld
を起動する前に起動する必要があります。先に起動しておかないと、firewalld
が、このセットを使用してダイレクトルールを追加できません。/etc/firewalld/direct.xml
ファイルを使用して、永続的なダイレクトルールを追加できます。
21.5.11.1. CLI を使用した IP セットオプションの設定
IP セットは、firewalld
ゾーンでソースとして使用でき、リッチルールでソースとして使用できます。Red Hat Enterprise Linux で推奨される方法は、ダイレクトルールで firewalld
を使用して作成した IP セットを使用する方法です。
永続的な環境で
firewalld
に認識されている IP セットのリストを表示するには、次のコマンドをroot
で実行します。# firewall-cmd --permanent --get-ipsets
新しい IP セットを追加するには、永続化環境を使用し、
root
で次のコマンドを実行します。# firewall-cmd --permanent --new-ipset=test --type=hash:net success
上記のコマンドは、名前 test とタイプ
hash:net
で、IPv4
の新しい IP セットを作成します。IPv6
で使用する IP セットを作成する場合は、--option=family=inet6
オプションを追加します。ランタイム環境で新しい設定を有効にするには、firewalld
を再読み込みします。root
で次のコマンドを実行して、新しい IP セットのリストを表示します。# firewall-cmd --permanent --get-ipsets test
IP セットの詳細は、
root
で次のコマンドを実行します。# firewall-cmd --permanent --info-ipset=test test type: hash:net options: entries:
この時点では IP セットにエントリーがありません。
IP セット test にエントリーを追加するには、
root
で次のコマンドを実行します。# firewall-cmd --permanent --ipset=test --add-entry=192.168.0.1 success
上記のコマンドは、IP アドレス 192.168.0.1 を IP セットに追加します。
IP セットの現在のエントリーをリスト表示するには、
root
で次のコマンドを実行します。# firewall-cmd --permanent --ipset=test --get-entries 192.168.0.1
IP アドレスのリストを含む
iplist.txt
ファイルを作成します。次に例を示します。192.168.0.2 192.168.0.3 192.168.1.0/24 192.168.2.254
IP セットの IP アドレスのリストが含まれるファイルには、行ごとにエントリーが含まれている必要があります。ハッシュ、セミコロン、また空の行から始まる行は無視されます。
iplist.txt ファイルからアドレスを追加するには、
root
で次のコマンドを実行します。# firewall-cmd --permanent --ipset=test --add-entries-from-file=iplist.txt success
拡張された IP セットのエントリーリストを表示するには、
root
で次のコマンドを実行します。# firewall-cmd --permanent --ipset=test --get-entries 192.168.0.1 192.168.0.2 192.168.0.3 192.168.1.0/24 192.168.2.254
IP セットからアドレスを削除し、更新したエントリーリストを確認するには、
root
で次のコマンドを実行します。# firewall-cmd --permanent --ipset=pass:_test_ --remove-entries-from-file=iplist.txt success # firewall-cmd --permanent --ipset=test --get-entries 192.168.0.1
IP セットをゾーンへのソースとして追加し、ゾーンを使用して、IP セットに記載されるアドレスから受信するすべてのトラフィックを処理します。たとえば、IP セットの test をソースとして drop ゾーンに追加し、IP セットの test のリストに表示されるすべてのエントリーから発信されるパケットをすべて破棄するには、
root
で次のコマンドを実行します。# firewall-cmd --permanent --zone=drop --add-source=ipset:test success
ソースの
ipset:
接頭辞は、ソースが IP セットで、IP アドレスまたはアドレス範囲ではないfirewalld
を示しています。
IP セットの作成および削除は、永続環境に限定されますが、その他の IP セットオプションは、--permanent
オプションを使用しないランタイム環境で使用できます。
21.5.12. リッチルールの優先度設定
デフォルトでは、リッチルールはルールアクションに基づいて設定されます。たとえば、許可
ルールよりも 拒否
ルールが優先されます。リッチルールで priority
パラメーターを使用すると、管理者はリッチルールとその実行順序をきめ細かく制御できます。
21.5.12.1. priority パラメーターを異なるチェーンにルールを整理する方法
リッチルールの priority
パラメーターは、-32768
~ 32767
の任意の数値に設定でき、値が小さい方が優先されます。
firewalld
サービスは、優先度の値に基づいて、ルールを異なるチェーンに整理します。
-
優先度が 0 未満 - ルールは
_pre
接尾辞が付いたチェーンにリダイレクトされます。 -
優先度が 0 を超える - ルールは
_post
接尾辞が付いたチェーンにリダイレクトされます。 -
優先度が 0 - アクションに基づいて、ルールは、
_log
、_deny
、または_allow
のアクションを使用してチェーンにリダイレクトされます。
このサブチェーンでは、firewalld
は優先度の値に基づいてルールを分類します。
21.5.12.2. リッチルールの優先度の設定
以下は、priority
パラメーターを使用して、他のルールで許可または拒否されていないすべてのトラフィックをログに記録するリッチルールを作成する方法を示しています。このルールを使用して、予期しないトラフィックにフラグを付けることができます。
手順
優先度が非常に低いルールを追加して、他のルールと一致していないすべてのトラフィックをログに記録します。
# firewall-cmd --add-rich-rule='rule priority=32767 log prefix="UNEXPECTED: " limit value="5/m"'
このコマンドでは、ログエントリーの数を、毎分
5
に制限します。
検証
前の手順のコマンドで作成した
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 } }
21.5.13. ファイアウォールロックダウンの設定
ローカルのアプリケーションやサービスは、root
で実行していれば、ファイアウォール設定を変更できます (たとえば libvirt)。管理者は、この機能を使用してファイアウォール設定をロックし、すべてのアプリケーションでファイアウォール変更を要求できなくするか、ロックダウンの許可リストに追加されたアプリケーションのみがファイアウォール変更を要求できるようにすることが可能になります。ロックダウン設定はデフォルトで無効になっています。これを有効にすると、ローカルのアプリケーションやサービスによるファイアウォールへの望ましくない設定変更を確実に防ぐことができます。
21.5.13.1. CLI を使用したロックダウンの設定
コマンドラインでロックダウン機能を有効または無効にすることができます。
手順
ロックダウンが有効になっているかどうかを確認するには、
root
で次のコマンドを使用します。# firewall-cmd --query-lockdown
ロックダウンが有効な場合は、
yes
と出力され、終了ステータスは0
になります。無効の場合はno
と出力され、終了ステータスは1
になります。ロックダウンを有効にするには、
root
で次のコマンドを実行します。# firewall-cmd --lockdown-on
ロックダウンを無効にするには、
root
で次のコマンドを実行します。# firewall-cmd --lockdown-off
21.5.13.2. CLI を使用したロックダウン許可リストオプションの設定
ロックダウンの許可リストには、コマンド、セキュリティーのコンテキスト、ユーザー、およびユーザー ID を追加できます。許可リストのコマンドエントリーがアスタリスク*で終了している場合は、そのコマンドで始まるすべてのコマンドラインが一致することになります。*がなければ、コマンドと引数が完全に一致する必要があります。
ここでのコンテキストは、実行中のアプリケーションやサービスのセキュリティー (SELinux) コンテキストです。実行中のアプリケーションのコンテキストを確認するには、次のコマンドを実行します。
$ ps -e --context
このコマンドは、実行中のアプリケーションをすべて返します。grep ツールを使用して、出力から目的のアプリケーションをパイプ処理します。以下に例を示します。
$ ps -e --context | grep example_program
許可リストにあるコマンドラインの一覧を表示するには、
root
で次のコマンドを実行します。# firewall-cmd --list-lockdown-whitelist-commands
許可リストに command コマンドを追加するには、
root
で次のコマンドを実行します。# firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'
許可リストから command コマンドを削除するには、
root
で次のコマンドを実行します。# firewall-cmd --remove-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'
command コマンドが許可リストに含まれるかどうかを確認するには、
root
で次のコマンドを実行します。# firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'
このコマンドでは、含まれる場合は
yes
が出力され、終了ステータスは0
になります。無効の場合はno
と出力され、終了ステータスは1
になります。許可リストにあるセキュリティーコンテキストの一覧を表示するには、
root
で次のコマンドを実行します。# firewall-cmd --list-lockdown-whitelist-contexts
許可リストに context コンテキストを追加するには、
root
で次のコマンドを実行します。# firewall-cmd --add-lockdown-whitelist-context=context
許可リストから context コンテキストを削除するには、
root
で次のコマンドを実行します。# firewall-cmd --remove-lockdown-whitelist-context=context
context コンテキストが許可リストに含まれるかどうかを確認するには、
root
で次のコマンドを実行します。# firewall-cmd --query-lockdown-whitelist-context=context
含まれる場合は、
yes
と出力され、終了ステータスは0
になります。含まれない場合は、no
が出力され、終了ステータスは1
になります。許可リストにあるユーザー ID すべての一覧を表示するには、
root
で次のコマンドを実行します。# firewall-cmd --list-lockdown-whitelist-uids
許可リストにユーザー ID (uid) を追加するには、
root
で次のコマンドを実行します。# firewall-cmd --add-lockdown-whitelist-uid=uid
許可リストからユーザー ID (uid) を削除するには、
root
で次のコマンドを実行します。# firewall-cmd --remove-lockdown-whitelist-uid=uid
許可リストにユーザー ID (uid) があるかどうかを確認するには、次のコマンドを実行します。
$ firewall-cmd --query-lockdown-whitelist-uid=uid
含まれる場合は、
yes
と出力され、終了ステータスは0
になります。含まれない場合は、no
が出力され、終了ステータスは1
になります。許可リストにある全ユーザー名の一覧を表示するには、
root
で次のコマンドを実行します。# firewall-cmd --list-lockdown-whitelist-users
許可リストにユーザー名 (user) を追加するには、
root
で次のコマンドを実行します。# firewall-cmd --add-lockdown-whitelist-user=user
許可リストからユーザー名 (user) を削除するには、
root
で次のコマンドを実行します。# firewall-cmd --remove-lockdown-whitelist-user=user
ユーザー名 (user) が許可リストに含まれるかどうかを確認するには、次のコマンドを実行します。
$ firewall-cmd --query-lockdown-whitelist-user=user
含まれる場合は、
yes
と出力され、終了ステータスは0
になります。含まれない場合は、no
が出力され、終了ステータスは1
になります。
21.5.13.3. 設定ファイルを使用したロックダウンの許可リストオプションの設定
デフォルトの許可リスト設定ファイルには、NetworkManager
コンテキストと、libvirt
のデフォルトコンテキストが含まれます。リストには、ユーザー ID (0) もあります。
+ 許可リスト設定ファイルは /etc/firewalld/
ディレクトリーに保存されます。
<?xml version="1.0" encoding="utf-8"?> <whitelist> <selinux context="system_u:system_r:NetworkManager_t:s0"/> <selinux context="system_u:system_r:virtd_t:s0-s0:c0.c1023"/> <user id="0"/> </whitelist>
以下の許可リスト設定ファイルの例では、firewall-cmd
ユーティリティーのコマンドと、ユーザー ID が 815
である user のコマンドをすべて有効にしています。
<?xml version="1.0" encoding="utf-8"?> <whitelist> <command name="/usr/libexec/platform-python -s /bin/firewall-cmd*"/> <selinux context="system_u:system_r:NetworkManager_t:s0"/> <user id="815"/> <user name="user"/> </whitelist>
この例では、user id
と user name
の両方が使用されていますが、実際にはどちらか一方のオプションだけが必要です。Python はインタープリターとしてコマンドラインに追加されています。または、以下のような明確なコマンドも使用できます。
# /usr/bin/python3 /bin/firewall-cmd --lockdown-on
この例では、--lockdown-on
コマンドだけが許可されます。
Red Hat Enterprise Linux では、すべてのユーティリティーが /usr/bin/
ディレクトリーに格納されており、/bin/
ディレクトリーは /usr/bin/
ディレクトリーへのシンボリックリンクとなります。つまり、root
で firewall-cmd
のパスを実行すると /bin/firewall-cmd
に対して解決しますが、/usr/bin/firewall-cmd
が使用できるようになっています。新たなスクリプトは、すべて新しい格納場所を使用する必要があります。ただし、root
で実行するスクリプトが /bin/firewall-cmd
へのパスを使用するようになっているのであれば、これまでは root
以外のユーザーにのみ使用されていた /usr/bin/firewall-cmd
パスに加え、このコマンドのパスも許可リストに追加する必要があります。
コマンドの名前属性の最後にある *
は、その名前で始まるすべてのコマンドが一致することを意味します。*
がなければ、コマンドと引数が完全に一致する必要があります。
21.5.14. firewalld ゾーン内の異なるインターフェイスまたはソース間でのトラフィック転送の有効化
ゾーン内転送は、firewalld
ゾーン内のインターフェイスまたはソース間のトラフィック転送を可能にする firewalld
機能です。
21.5.14.1. ゾーン内転送と、デフォルトのターゲットが ACCEPT に設定されているゾーンの違い
ゾーン内転送を有効にすると、1 つの firewalld
ゾーン内のトラフィックは、あるインターフェイスまたはソースから別のインターフェイスまたはソースに流れることができます。ゾーンは、インターフェイスおよびソースの信頼レベルを指定します。信頼レベルが同じである場合、インターフェイスまたはソース間の通信が可能です。
firewalld
のデフォルトゾーンでゾーン内転送を有効にすると、現在のデフォルトゾーンに追加されたインターフェイスおよびソースにのみ適用されることに注意してください。
firewalld
の trusted
ゾーンは、ACCEPT
に設定されたデフォルトのターゲットを使用します。このゾーンは、転送されたすべてのトラフィックを受け入れ、ゾーン内転送は適用されません。
他のデフォルトのターゲット値の場合、転送されたトラフィックはデフォルトでドロップされます。これは、信頼済みゾーンを除くすべての標準ゾーンに適用されます。
21.5.14.2. ゾーン内転送を使用したイーサネットと Wi-Fi ネットワーク間でのトラフィックの転送
ゾーン内転送を使用して、同じ firewalld
ゾーン内のインターフェイスとソース間のトラフィックを転送することができます。たとえば、この機能を使用して、enp1s0
に接続されたイーサネットネットワークと、wlp0s20
に接続された Wi-Fi ネットワーク間のトラフィックを転送するには、この機能を使用します。
手順
カーネルでパケット転送を有効にします。
# 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 --permanent
enp1s0
およびwlp0s20
インターフェイスをinternal
ゾーンに追加します。# firewall-cmd --zone=internal --add-interface=enp1s0 --add-interface=wlp0s20
ゾーン内転送を有効にします。
# firewall-cmd --zone=internal --add-forward
検証
以下の検証手順では、nmap-ncat
パッケージが両方のホストにインストールされている必要があります。
-
ゾーン転送を有効にしたホストの
enp1s0
インターフェイスと同じネットワーク内にあるホストにログインします。 ncat
で echo サービスを起動し、接続をテストします。# ncat -e /usr/bin/cat -l 12345
-
wlp0s20
インターフェイスと同じネットワークにあるホストにログインします。 enp1s0
と同じネットワークにあるホスト上で実行している echo サーバーに接続します。# ncat <other_host> 12345
- 試しに何かを入力して キーを押し、テキストが返送されることを確認します。
関連情報
-
firewalld.zones(5)
の man ページ
21.5.15. システムロールを使用した firewalld
の設定
firewall
システムロールを使用すると、一度に複数のクライアントに firewalld
サービスを設定できます。この解決策は以下のとおりです。
- 入力設定が効率的なインターフェイスを提供する。
-
目的の
firewalld
パラメーターを 1 か所で保持する。
コントロールノードで firewall
ロールを実行すると、システムロールは firewalld
パラメーターをマネージドノードに即座に適用し、再起動後も維持されます。
21.5.15.1. RHEL システムロール firewall
の概要
RHEL システムロールは、Ansible 自動化ユーティリティーのコンテンツセットです。このコンテンツは、Ansible 自動化ユーティリティーとともに、複数のシステムをリモートで管理するための一貫した設定インターフェイスを提供します。
firewalld
サービスの自動設定に、RHEL システムロールからの rhel-system-roles.firewall
ロールが導入されました。rhel-system-roles
パッケージには、このシステムロールと参考ドキュメントも含まれます。
firewalld
パラメーターを自動化された方法で 1 つ以上のシステムに適用するには、Playbook で firewall
システムロール変数を使用します。Playbook は、テキストベースの YAML 形式で記述された 1 つ以上のプレイのリストです。
インベントリーファイルを使用して、Ansible が設定するシステムセットを定義できます。
firewall
ロールを使用すると、以下のような異なる firewalld
パラメーターを設定できます。
- ゾーン。
- パケットが許可されるサービス。
- ポートへのトラフィックアクセスの付与、拒否、または削除。
- ゾーンのポートまたはポート範囲の転送。
関連情報
-
/usr/share/doc/rhel-system-roles/firewall/
ディレクトリーのREADME.md
ファイルおよびREADME.html
ファイル - Playbook の使用
- インベントリーの構築方法
21.5.15.2. ファイアウォール RHEL システムロールを使用した firewalld 設定のリセット
firewall
RHEL システムロールを使用すると、firewalld
設定をデフォルトの状態にリセットできます。previous:replaced
パラメーターを変数リストに追加すると、システムロールは既存のユーザー定義の設定をすべて削除し、firewalld
をデフォルトにリセットします。previous:replaced
パラメーターを他の設定と組み合わせると、firewall
ロールは新しい設定を適用する前に既存の設定をすべて削除します。
Ansible コントロールノードで以下の手順を実行します。
前提条件
- 制御ノードと管理ノードを準備している
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントには、そのノードに対する
sudo
権限がある。 - この Playbook を実行する管理対象ノードまたは管理対象ノードのグループが、Ansible インベントリーファイルにリストされている。
手順
~/reset-firewalld.yml
などの Playbook ファイルを次の内容で作成します。--- - name: Reset firewalld example hosts: managed-node-01.example.com tasks: - name: Reset firewalld include_role: name: rhel-system-roles.firewall vars: firewall: - previous: replaced
Playbook を実行します。
# ansible-playbook ~/configuring-a-dmz.yml
検証
管理対象ノードで
root
として次のコマンドを実行し、すべてのゾーンを確認します。# firewall-cmd --list-all-zones
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md
-
ansible-playbook(1)
-
firewalld(1)
21.5.15.3. 別のローカルポートへの着信トラフィックの転送
firewall
ロールを使用すると、複数の管理対象ホストで設定が永続化されるので firewalld
パラメーターをリモートで設定できます。
Ansible コントロールノードで以下の手順を実行します。
前提条件
- 制御ノードと管理ノードを準備している
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントには、そのノードに対する
sudo
権限がある。 - この Playbook を実行する管理対象ノードまたは管理対象ノードのグループが、Ansible インベントリーファイルにリストされている。
手順
~/port_forwarding.yml
などの Playbook ファイルを次の内容で作成します。--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Forward incoming traffic on port 8080 to 443 include_role: name: rhel-system-roles.firewall vars: firewall: - { forward_port: 8080/tcp;443;, state: enabled, runtime: true, permanent: true }
Playbook を実行します。
# ansible-playbook ~/port_forwarding.yml
検証
管理対象ホストで、
firewalld
設定を表示します。# firewall-cmd --list-forward-ports
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md
21.5.15.4. システムロールを使用したポートの設定
RHEL firewall
システムロールを使用すると、着信トラフィックに対してローカルファイアウォールでポートを開くか閉じて、再起動後に新しい設定を永続化できます。たとえば、HTTPS サービスの着信トラフィックを許可するようにデフォルトゾーンを設定できます。
Ansible コントロールノードで以下の手順を実行します。
前提条件
- 制御ノードと管理ノードを準備している
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントには、そのノードに対する
sudo
権限がある。 - この Playbook を実行する管理対象ノードまたは管理対象ノードのグループが、Ansible インベントリーファイルにリストされている。
手順
~/opening-a-port.yml
などの Playbook ファイルを次の内容で作成します。--- - name: Configure firewalld hosts: managed-node-01.example.com tasks: - name: Allow incoming HTTPS traffic to the local host include_role: name: rhel-system-roles.firewall vars: firewall: - port: 443/tcp service: http state: enabled runtime: true permanent: true
permanent: true
オプションを使用すると、再起動後も新しい設定が維持されます。Playbook を実行します。
# ansible-playbook ~/opening-a-port.yml
検証
管理対象ノードで、
HTTPS
サービスに関連付けられた443/tcp
ポートが開いていることを確認します。# firewall-cmd --list-ports 443/tcp
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md
21.5.15.5. firewalld RHEL システムロールを使用した DMZ firewalld
ゾーンの設定
システム管理者は、firewall
システムロールを使用して、enp1s0 インターフェイスで dmz
ゾーンを設定し、ゾーンへの HTTPS
トラフィックを許可できます。これにより、外部ユーザーが Web サーバーにアクセスできるようにします。
Ansible コントロールノードで以下の手順を実行します。
前提条件
- 制御ノードと管理ノードを準備している
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントには、そのノードに対する
sudo
権限がある。 - この Playbook を実行する管理対象ノードまたは管理対象ノードのグループが、Ansible インベントリーファイルにリストされている。
手順
~/configuring-a-dmz.yml
などの Playbook ファイルを次の内容で作成します。--- - 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 include_role: name: rhel-system-roles.firewall vars: firewall: - zone: dmz interface: enp1s0 service: https state: enabled runtime: true permanent: true
Playbook を実行します。
# ansible-playbook ~/configuring-a-dmz.yml
検証
管理ノードで、
dmz
ゾーンに関する詳細情報を表示します。# firewall-cmd --zone=dmz --list-all 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:
関連情報
-
/usr/share/ansible/roles/rhel-system-roles.firewall/README.md
21.5.16. 関連情報
-
firewalld(1)
の man ページ -
firewalld.conf(5)
の man ページ -
firewall-cmd(1)
man ページ -
firewall-config(1)
の man ページ -
firewall-offline-cmd(1)
の man ページ -
firewalld.icmptype(5)
の man ページ -
firewalld.ipset(5)
の man ページ -
firewalld.service(5)
の man ページ -
firewalld.zone(5)
の man ページ -
firewalld.direct(5)
の man ページ -
firewalld.lockdown-whitelist(5)
-
firewalld.richlanguage(5)
-
firewalld.zones(5)
の man ページ -
firewalld.dbus(5)
の man ページ