4.5. ファイアウォールの使用

動的ファイアウォールデーモンである firewalld は、動的に管理されるファイアウォールを提供し、信頼レベルをネットワークと関連する接続およびインターフェースに割り当てるネットワークゾーンをサポートします。これは、IPv4 および IPv6 のファイアウォール設定をサポートします。また、イーサネットブリッジをサポートし、実行時と永続的な設定オプションを別々にすることできます。ファイアウォールルールを直接追加するためのサービスやアプリケーション向けのインターフェースもあります。

4.5.1. firewalld の概要

firewalld は、グラフィカルな設定ツールである firewall-config で設定します。firewalld は、カーネルにある Netfilteriptables tool を使用して通信します。パケットフィルタリングの実装は、Netfilter が行います。
グラフィカルの firewall-config ツールを使用するには、Super キーを押してアクティビティを開き、firewall と入力してから Enter を押します。firewall-config ツールが表示され、管理者パスワードの入力が求められます。
firewall-config ツールには、設定 のラベルが付いたドロップダウンメニューがあります。ここで、実行時永続 のモードが選べます。永続 を選ぶと、左下に新たなアイコンの列が表示されます。サービスのパラメーターは実行時モードでは変更できないため、これらのアイコンは永続モードでのみ表示されます。
firewalld が提供するファイアウォールのサービスは、設定の変更はいつでも可能で即座に実行されるので、静的ではなく動的なものです。変更は保存したり適用したりする必要がありません。ファイアウォールはリロードの必要がないので、既存のネットワーク接続が意図せずに中断されることがありません。
コマンドラインクライアントである firewall-cmd が提供され、これを使うと man firewall-cmd(1) で説明されている永続および非永続の実行時の変更を行うことができます。永続的な変更は、firewalld(1) man ページの説明にしたがってください。firewall-cmd コマンドは、root ユーザーと管理者ユーザーといういわゆる wheel グループのメンバーのみが実行できることに注意してください。管理者ユーザーの場合は、polkit メカニズム経由でコマンドが承認されます。
firewalld の設定は、様々な XML ファイルで /usr/lib/firewalld//etc/firewalld/ に保存されます。これらのファイルは修正、書き込み、バックアップ、他のインストールへのテンプレートとしての使用などができるので、柔軟性が高まります。
他のアプリケーションは、D-bus を使って firewalld と通信できます。

4.5.1.1. firewalld と system-config-firewall および iptables との比較

firewalldiptables service の本質的な違いは、以下の通りです。
  • iptables service は設定を /etc/sysconfig/iptables に保存しますが、firewalld は様々な XML ファイルで /usr/lib/firewalld/ および /etc/firewalld/ に保存します。Red Hat Enterprise Linux では firewalld がデフォルトでインストールされるので、/etc/sysconfig/iptables ファイルがないことに注意してください。
  • iptables service では変更のひとつひとつで古いルールがフラッシュされ新しいルールが /etc/sysconfig/iptables から読み込まれますが、firewalld ではそのようなすべてのルールの再生はなく、差異のみが適用されます。このため、firewalld では既存の接続が中断されることなく実行時に設定変更ができます。
これら両方が iptables tool を使用してカーネルパケットフィルターと通信します。

図4.1 ファイアウォールスタック

4.5.1.2. ネットワークゾーンについて

ファイアウォールを使うと、ユーザーがネットワーク内のデバイスとトラフィックに配置する信頼レベルに基づいて、ネットワークを異なるゾーンに分けることができます。NetworkManagerfirewalld にインターフェースが所属するゾーンを通知します。インターフェースに割り当てられたゾーンは NetworkManager で、または関連する NetworkManager ウィンドウを開く firewall-config ツール経由で変更できます。
/etc/firewalld/ におけるゾーン設定は、ネットワークインターフェースにすぐに適用可能な事前設定の範囲です。以下でこれらを簡単に説明します。
drop
着信ネットワークパケットはすべて遮断され、返信されません。送信ネットワーク接続のみが可能です。
block
IPv4 では icmp-host-prohibited メッセージで、IPv6 では icmp6-adm-prohibited メッセージですべての着信ネットワーク接続が拒否されます。システム内で開始されたネットワーク接続のみが可能です。
public
公開エリア用です。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターを信頼しません。選択された着信接続のみが許可されます。
external
マスカレードを特別にルーター用に有効にした外部ネットワーク上での使用向けです。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターを信頼しません。選択された着信接続のみが許可されます。
dmz
公開アクセスが可能ではあるものの、内部ネットワークへのアクセスには制限がある非武装地帯にあるコンピューター用。選択された着信接続のみが許可されます。
work
作業エリア用です。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターをほぼ信頼します。選択された着信接続のみが許可されます。
home
ホームエリア用です。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターをほぼ信頼します。選択された着信接続のみが許可されます。
internal
内部ネットワーク用です。自分のコンピューターを保護するため、ネットワーク上の他のコンピューターをほぼ信頼します。選択された着信接続のみが許可されます。
trusted
すべてのネットワーク接続が許可されます。
これらのゾーンのいずれかをデフォルトに指定することができます。インターフェース接続が NetworkManager に追加されると、デフォルトのゾーンに割り当てられます。インストール時には、firewalld のデフォルトは public ゾーンに設定されます。
ネットワークゾーンの選択
ネットワークゾーンの名前は、すぐに分かりユーザーが妥当な決定をすばやく下せるように付けられています。ただし、ユーザーのニーズおよびリスク評価に合わせて、デフォルト設定の見直しを行ったり、不要なサービスを無効にしてください。

4.5.1.3. 事前定義のサービスについて

サービスは、ローカルポートと宛先のリストとするか、サービスが有効な場合に自動的にロードされるファイアウォールヘルパーモジュールのリストとすることができます。事前定義サービスを使用すると、ユーザーによるサービスへのアクセスの有効、無効の切り替えが容易になります。ポートやポート範囲を開くのではなく、事前定義のサービスまたはカスタム定義のサービスを使用すると、管理が容易になる場合があります。サービスの設定オプションと一般的なファイル情報は、firewalld.service(5) man ページで説明されています。サービスは個別の XML 設定ファイルで指定されており、これらのファイル名の形式は、service-name.xml となります。
グラフィカルの firewall-config ツールを使用してサービス一覧を表示するには、Super キーを押してアクティビティを開き、firewall と入力してから Enter を押します。firewall-config ツールが表示され、管理者パスワードの入力が求められます。サービスタブでサービスの一覧を確認できます。
コマンドラインを使用してデフォルトの利用可能な事前定義サービスを一覧表示するには、root で以下のコマンドを実行します。
~]# ls /usr/lib/firewalld/services/
/usr/lib/firewalld/services/ にあるファイルは編集しないでください。/etc/firewalld/services/ にあるファイルのみを編集してください。
システムもしくはユーザーが作成したサービスを一覧表示するには、root で以下のコマンドを実行します。
~]# ls /etc/firewalld/services/
サービスの追加もしくは削除は、グラフィカルな firewall-config ツールを使用するか、/etc/firewalld/services/ にある XML ファイルを編集することで実行できます。ユーザーがサービスを追加もしくは変更していない場合、そのサービスに対応する XML ファイルは /etc/firewalld/services/ にありません。サービスの追加または変更には、/usr/lib/firewalld/services/ のファイルをテンプレートとして使うことが可能です。root で以下の形式でコマンドを実行します。
~]# cp /usr/lib/firewalld/services/[service].xml /etc/firewalld/services/[service].xml
この後に、新規作成されたファイルを編集することができます。firewalld はファイルが /etc/firewalld/services/ にあることを好みますが、もしファイルが削除されてしまった場合でも、/usr/lib/firewalld/services/ にフォールバックします。ただし、これはリロードの後になります。

4.5.1.4. ダイレクトインターフェースについて

firewalld には、ルールを直接 iptablesip6tables、および ebtables に渡すことを可能にするダイレクトインターフェース と呼ばれるものがあります。これはユーザーではなく、アプリケーションが使用するものです。iptables に精通していないと意図せずにファイアウォール侵害を引き起こす可能性があるので、ダイレクトインターフェースを使用することは危険です。firewalld は追加されたものを追跡するので、firewalld にクエリを行い、ダイレクトインターフェースモードを使用してアプリケーションが行った変更を確認することができます。ダイレクトインターフェースは、--direct オプションを firewall-cmd コマンドに追加すると使用できます。
直接インターフェースモードは、サービスまたはアプリケーションが実行時に特定のファイアーウォールルールを追加するためのものです。--permanent オプションを追加して firewall-cmd --permanent --direct コマンドを使用するか、/etc/firewalld/direct.xml を修正することで、ルールを永続的なものにできます。ルールが永続的になっていないと、D-BUS を使用して firewalld から開始、再開、リロードのメッセージを受け取るたびにルールを毎回適用する必要があります。

4.5.2. firewalld のインストール

Red Hat Enterprise Linux 7 では、firewalld はデフォルトでインストールされます。必要な場合は、確実にインストールするために root で以下のコマンドを入力します。
~]# yum install firewalld
グラフィカルユーザーインターフェース設定ツール firewall-config は一部のバージョンの Red Hat Enterprise Linux 7 でデフォルトでインストールされます。必要な場合は、確実にインストールするために root で以下のコマンドを入力します。
~]# yum install firewall-config

firewalld の停止

firewalld を停止するには、root で以下のコマンドを入力します。
~]# systemctl stop firewalld
firewalld がシステム起動時に自動的に起動しないようにするには、root で以下のコマンドを発行します。
~]# systemctl disable firewalld

firewalld の起動

firewalld を起動するには、root で以下のコマンドを実行します。
~]# systemctl start firewalld
firewalld をシステム起動時に自動的に起動するには、root で以下のコマンドを入力します。
~]# systemctl disable firewalld

firewalld の稼働確認

firewalld が稼働しているかどうかを確認するには、以下のコマンドを実行します。
~]$ systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
	  Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
	  Active: active (running) since Sat 2013-04-06 22:56:59 CEST; 2 days ago
	Main PID: 688 (firewalld)
	  CGroup: name=systemd:/system/firewalld.service
さらに、firewall-cmd がデーモンに接続可能かどうかを確認するには、以下のコマンドを実行します。
~]$ firewall-cmd --state
running

4.5.3. firewalld の設定

デーモン firewalld により実装されるファイアーウォールサービスは、グラフィカルユーザーインターフェースツール firewall-config またはコマンドラインインターフェースツール firewall-cmd を使用するか、XML 設定ファイルを編集して設定できます。これらの方法について順番に説明します。

4.5.3.1. グラフィカルユーザーインターフェースを使った firewalld の設定

4.5.3.1.1. グラフィカルファイアウォール設定ツールの起動
グラフィカルの firewall-config ツールを起動するには、Super キーを押してアクティビティを開き、firewall と入力してから Enter を押します。firewall-config ツールが表示され、管理者パスワードの入力が求められます。
コマンドラインを使ってグラフィカルなファイアウォール設定ツールを起動するには、root で以下のコマンドを入力します。
~]# firewall-config
ファイアウォールの設定 ウィンドウが開きます。このコマンドは一般ユーザーとしても実行できますが、その場合は時折、管理者パスワードの入力を求められることに注意してください。

図4.2 ファイアウォール設定ツール

ウィンドウ左下の 接続しました の表示を確認してください。これは、firewall-config ツールがユーザースペースデーモン firewalld に接続されていることを示します。ICMP タイプダイレクト設定、およびロックダウン・ホワイトリスト のタブは、表示 のドロップダウンメニューから選択した後にのみ、表示されることに注意してください。
4.5.3.1.2. ファイアウォールの設定変更
現行のファイアウォール設定を直ちに変更するには、現在の表示が 実行時 に設定されていることを確認してください。次回のシステム起動時またはファイアウォールの再読み込み時に設定が適用されるようにするには、ドロップダウンリストから 永続 を選択します。

注記

実行時 モードでファイアウォール設定を変更する際には、サービスに関連するチェックボックスにチェックを入れたり消したりすると、その選択が直ちに反映されます。他のユーザーが使用している可能性のあるシステムでこの作業を行う場合は、この点を考慮してください。
永続 モードでファイアウォール設定を変更すると、ファイアウォールを再読み込みした場合かシステムの再起動時にのみ変更が反映されます。ファイル メニューの下にある再読み込みアイコンを使用するか、オプション メニューをクリックして Firewalld の再読み込み を選択します。
ゾーンは左側のコラムで選択できます。ゾーンには有効になっているサービスがいくつかあり、すべてを閲覧するにはウィンドウのサイズを変更するか、スクロールする必要がある場合があります。サービスを選択および選択解除することで、設定をカスタマイズできます。
4.5.3.1.3. インターフェースをゾーンに追加する
接続インターフェースをゾーンに追加したり再度割り当てるには、firewall-config を開始して、メニューバーから オプション を選び、ドロップダウンメニューから 接続のゾーンの変更 を選択すると、ネットワーク接続 のリストが表示されます。ここで、再度割り当てる接続を選択します。接続のゾーンを選択する のウィンドウが表示されます。ドロップダウンメニューから新規のファイアウォールゾーンを選択して OK をクリックします。
4.5.3.1.4. デフォルトゾーンの設定
新たなインターフェースに割り当てるデフォルトのゾーンを設定するには、firewall-config を開始して、メニューバーから オプション を選び、ドロップダウンメニューから 標準のゾーンの変更 を選択します。標準ゾーン のウィンドウが表示されるので、デフォルトのゾーンとして使用するゾーンをリストから選択して OK をクリックします。
4.5.3.1.5. サービスの設定
事前定義またはカスタマイズサービスを有効、無効にするには、firewall-config ツールを起動して、設定するサービスのネットワークゾーンを選択します。サービス タブを選択し、信頼するサービスの各タイプのチェックボックスを選択します。サービスをブロックするには、チェックボックスを外します。
サービスを編集するには、firewall-config ツールを起動してから 設定 ラベルのあるドロップダウン選択メニューで 永続 モードを選びます。サービス ウィンドウの下部に新たなアイコンとメニューボタンが表示されます。設定するサービスを選びます。
ポートとプロトコル のタブでは、選択されたサービスのポートとプロトコルの追加、変更、削除 ができます。モジュールタブでは、Netfilter ヘルパーモジュールの設定を行います。送信先 タブでは、特定の送信先アドレスとインターネットプロトコル (IPv4 または IPv6) へのトラフィックが制限できます。
4.5.3.1.6. ファイアウォールでポートを開く
特定のポートへのトラフィックがファイアウォールを通過できるようにするには、firewall-config ツールを起動して、設定を変更するネットワークゾーンを選択します。ポート タブを選んで 追加 ボタンをクリックします。ポートとプロトコル ウィンドウが開きます。
許可するポート番号またはポートの範囲を入力します。ドロップダウンリストから tcp または udp を選択します。
4.5.3.1.7. IP アドレスのマスカレードの有効化
IPv4 アドレスを単一の外部アドレスに変換するには、firewall-config ツールを起動して、変換するアドレスのネットワークゾーンを選択します。 マスカレーディング タブを選択し、チェックボックスを選択して IPv4 アドレスの単一アドレスへの変換を有効にします。
4.5.3.1.8. ポート転送の設定
特定のポートに向けられた受信ネットワークトラフィック または パケット を、内部アドレスまたは別のポートに転送するには、まず IP アドレスのマスカレーディングを有効にしてから、ポート転送 タブを選択します。
受信トラフィックのプロトコルとポートもしくはポート範囲をウィンドウの上部で選択します。
ローカルポートにトラフィックを転送する、つまり同一システム上のポートに転送するには、ローカル転送 のチェックボックスを選択します。トラフィックの送信先となるローカルポートまたはポート範囲を入力します。
トラフィックを別の IPv4 アドレスに転送するには、他のポートへの転送 チェックボックスを選択します。送信先の IP アドレスとポートまたはポート範囲を入力します。ポートのフィールドに入力がないと、デフォルトで同一ポートに送信されます。OK をクリックして変更を適用します。
4.5.3.1.9. ICMP フィルターの設定
ICMP フィルターを有効、無効にするには、firewall-config ツールを起動して、フィルターにかけるメッセージのネットワークゾーンを選択します。ICMP フィルター タブを選択し、フィルターにかける ICMP メッセージの各タイプのチェックボックスを選択します。フィルターを無効にするには、チェックボックスの選択を外します。これは方向ごとに設定され、デフォルトではすべてが許可されます。
ICMP タイプを編集するには、firewall-config ツールを起動してから 設定 ラベルのあるドロップダウンメニューで 永続 モードを選びます。サービス ウィンドウの下部に新たなアイコンが表示されます。

4.5.3.2. コマンドラインツール firewall-cmd を使ったファイアウォールの設定

コマンドラインツール firewall-cmd は、デフォルトでインストールされる firewalld アプリケーションの一部です。これがインストールされているかどうかを確認するには、バージョンを確認するか、ヘルプの出力を表示させます。バージョンのチェックは以下のコマンドで実行します。
~]$ firewall-cmd --version
ヘルプの出力を表示するには、以下のコマンドを実行します。
~]$ firewall-cmd --help
以下でコマンドをいくつか表示しています。完全一覧については、man firewall-cmd(1) man ページを参照してください。

注記

コマンドを永続的にするには、--direct コマンド (これらは元々一時的なもの) を除いて すべてのコマンドに --permanent オプションを追加します。こうすると変更が永続的になるだけではなく、変更はファイアウォールのリロード、サービスの再起動、もしくはシステムの再起動後にのみ適用されることに注意してください。--permanent オプションなしで firewall-cmd を使って設定すると、変更は即座に適用されますが、これが有効なのはファイアウォールがリロードされる、システム再起動、または firewalld サービスが再起動されるまでになります。ファイアウォールのリロード自体は接続を切断しませんが、一時的な変更が破棄されることに注意してください。
コマンドを永続的にし、すぐに有効にするには、コマンドを --permanent を使用して 1 回、オプションなしで 1 回の合計 2 回入力します。これは、ファイアーウォールのリロードには単にコマンドを繰り返すよりも時間がかかるためです (すべての設定ファイルをリロードし、ファイアーウォール設定全体を再作成する必要があります)。リロード中に、安全上の理由により組み込みチェーンのポリシーは DROP に設定され、最終的に ACCEPT に再設定されます。したがって、リロード中にサービスが破棄されることがあります。

重要

--permanent --add-interface オプションは、NetworkManager ユーティリティーによって管理されないインターフェースのみに使用します。これは、NetworkManager (つまり、従来のネットワークサービス) では、ifcfg インターフェース設定ファイルの ZONE= ディレクティブに従ってインターフェースがゾーンに自動的に追加されるためです。NetworkManagerifcfg ファイルの使用については、Red Hat Enterprise Linux 7 Networking Guide を参照してください。

4.5.3.3. コマンドラインインターフェース (CLI) を使ったファイアウォール設定の表示

firewalld の状態をテキスト表示するには、以下のコマンドを実行します。
~]$ firewall-cmd --state
アクティブなゾーンと、それらに割り当てられているインターフェースの一覧を表示するには、以下のコマンドを実行します。
~]$ firewall-cmd --get-active-zones
public
  interfaces: em1
たとえば、インターフェース em1 が現在割り当てられているゾーンを確認するには、以下のコマンドを実行します。
~]$ firewall-cmd --get-zone-of-interface=em1
public
あるゾーン、たとえば public ゾーンに割り当てられているすべてのインターフェースを確認するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=public --list-interfaces
em1 wlan0
この情報は NetworkManager から得られるもので、接続ではなくインターフェースのみを表示します。
あるゾーン、たとえば public ゾーンの設定すべてを確認するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=public --list-all
public
  interfaces: 
  services: mdns dhcpv6-client ssh
  ports: 
  forward-ports: 
  icmp-blocks: source-quench
現在読み込まれているサービスを一覧表示するには、root で以下のコマンドを実行します。
~]# firewall-cmd --get-services
cluster-suite pop3s bacula-client smtp ipp radius bacula ftp mdns samba dhcpv6-client dns openvpn imaps samba-client http https ntp vnc-server telnet libvirt ssh ipsec ipp-client amanda-client tftp-client nfs tftp libvirt-tls
ここで表示されるのは、/usr/lib/firewalld/services/ から読み込まれた事前定義サービスの名前と、現在読み込まれているカスタムサービスになります。設定ファイル自体は service-name.xml. と命名されることに注意してください。
カスタムが作成されていても読み込まれていない場合は、以下のコマンドで確認できます。
~]# firewall-cmd --permanent --get-services
ここでは、サービスが読み込まれていなくても、/etc/firewalld/services/ で設定されたカスタムサービスを含めたすべてのサービスが一覧表示されます。

4.5.3.4. コマンドラインインターフェース (CLI) を使ったファイアウォール設定の変更

4.5.3.4.1. 全パケットの遮断 (パニックモード)
すべての送受信パケットの遮断を開始するには、root で以下のコマンドを実行します。
~]# firewall-cmd --panic-on
これですべての送受信パケットが遮断されます。アクティブな接続は、一定期間アクションがないと切断されます。この期間は、個別のセッションタイムアウト値によって異なります。
すべての送受信パケットの受け渡しを再開するには、root で以下のコマンドを実行します。
~]# firewall-cmd --panic-off
パニックモードの有効期間が短かった場合、パニックモードを無効にすると、確立されていた接続が再度機能する可能性があります。
パニックモードの有効、無効を確認するには、以下のコマンドを実行します。
~]$ firewall-cmd --query-panic
有効な場合は終了状態が 0yes がプリントされ、無効だと終了状態が 1no がプリントされます。
4.5.3.4.2. コマンドラインインターフェース (CLI) を使ったファイアウォールのリロード
ユーザー接続を切断せず、状態情報を失わずにファイアーウォールをリロードするには、root で以下のコマンドを実行します。
~]# firewall-cmd --reload
ファイアーウォールをリロードするには、すべての設定ファイルをリロードし、ファイアーウォール設定全体を再作成する必要があります。リロード中に、安全上の理由により組み込みチェーンのポリシーは DROP に設定され、最終的に ACCEPT に再設定されます。したがって、リロード中にサービスが破棄されることがあります。
ユーザー接続を切断し、状態情報を破棄してファイアーウォールをリロードするには、root で以下のコマンドを実行します。
~]# firewall-cmd --complete-reload
このコマンドは通常、重大なファイアウォール問題の場合にのみ使用されます。たとえば、状態情報に問題があって接続が確立されないものの、ファイアウォールルール自体は適正な場合などです。
4.5.3.4.3. コマンドラインインターフェース (CLI) を使ってインターフェースをゾーンに追加する
インターフェースをゾーンに追加するには、たとえば em1 を public ゾーンに追加するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=public --add-interface=em1
この設定を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。
4.5.3.4.4. インターフェース設定ファイルを編集してインターフェースをゾーンに追加する
ifcfg-em1 設定ファイルを編集してインターフェース、たとえば em1 を work ゾーンに追加するには、root でエディターを使用して以下の行を ifcfg-em1 に追加します。
ZONE=work
ZONE オプションを省略するか、ZONE= または ZONE='' を使用すると、デフォルトのゾーンが使用されます。
NetworkManager が自動的に再接続を行い、ゾーンがそれに応じて設定されます。
4.5.3.4.5. ファイアウォール設定ファイルを編集してデフォルトゾーンを設定する
root/etc/firewalld/firewalld.conf ファイルを開き、以下のように編集します。
 # default zone
 # The default zone used if an empty zone string is used.
 # Default: public
 DefaultZone=home
root で以下のコマンドを実行して、ファイアウォールをリロードします。
~]# firewall-cmd --reload
この結果、状態情報を失わずにファイアーウォールがリロードされます (TCP セッションが中断されません) が、リロード中にサービスが破棄されることがあります。
4.5.3.4.6. コマンドラインインターフェース (CLI) を使ってデフォルトゾーンを設定する
デフォルトのゾーンをたとえば public に設定するには、root で以下のコマンドを実行します。
~]# firewall-cmd --set-default-zone=public
この変更は即座に有効になり、このケースではファイアウォールのリロードは不要です。
4.5.3.4.7. コマンドラインインターフェース (CLI) を使ったファイアウォールでのポート確認
あるゾーン、たとえば dmz で開いているすべてのポートを一覧表示するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=dmz --list-ports
--add-services コマンドで開いたポートはここで表示されないことに注意してください。
ゾーンにポートを追加するには、たとえば TCP トラフィックを dmz ゾーンでポート 8080 で許可するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=dmz --add-port=8080/tcp
この設定を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。
ポート範囲をゾーンに追加するには、たとえばポート 5060 から 5061 を public ゾーンで許可するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=public --add-port=5060-5061/udp
この設定を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。
4.5.3.4.8. コマンドラインインターフェース (CLI) を使ってサービスをゾーンに追加する
サービスをゾーンに追加するには、たとえば SMTP を work ゾーンに許可するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=work --add-service=smtp
この設定を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。
4.5.3.4.9. コマンドラインインターフェース (CLI) を使ってサービスをゾーンから削除する
サービスをゾーンから削除するには、たとえば SMTP を work ゾーンから削除するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=work --remove-service=smtp
この変更を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。この変更により、確立されている接続は切断されません。切断したい場合は --complete-reload オプションが使えますが、この場合切断されるのは削除したサービスだけでなく、すべての確立されている接続が切断されることに注意してください。
4.5.3.4.10. XML ファイルを編集してサービスをゾーンに追加する
デフォルトゾーンのファイルを表示するには、root で以下のコマンドを実行します。
~]# ls /usr/lib/firewalld/zones/
block.xml  drop.xml      home.xml      public.xml   work.xml
dmz.xml    external.xml  internal.xml  trusted.xml
これらのファイルは、編集しないでください。これらのファイルは、/etc/firewalld/zones/ ディレクトリーに同等のファイルがない場合に、デフォルトで使用されます。
デフォルトから変更されたゾーンファイルを表示するには、root で以下のコマンドを実行します。
~]# ls /etc/firewalld/zones/
external.xml  public.xml  public.xml.old
上記の例では、work ゾーンのファイルは存在しません。work ゾーンのファイルを追加するには、root で以下のコマンドを実行します。
~]# cp /usr/lib/firewalld/zones/work.xml /etc/firewalld/zones/
これで /etc/firewalld/zones/ ディレクトリー内のファイルを編集できます。ファイルを削除してしまった場合は、firewalld/usr/lib/firewalld/zones/ にあるデフォルトファイルを使用してフォールバックします。
サービスをゾーンに追加するには、たとえば SMTP を work ゾーンに許可するには、root でエディターを使用し、/etc/firewalld/zones/work.xml ファイルに以下の行を含めます。
<service name="smtp"/>
4.5.3.4.11. XML ファイルを編集してサービスをゾーンから削除する
XML ゾーンファイルを編集するには、root 権限でエディターを実行する必要があります。以前に設定されたゾーンのファイルを表示するには、root で以下のコマンドを実行します。
~]# ls /etc/firewalld/zones/
external.xml  public.xml  work.xml
サービスをゾーンから削除するには、たとえば SMTP を work ゾーンから削除するには、root でエディターを使用し、/etc/firewalld/zones/work.xml ファイルを編集して、以下の行を削除します。
<service name="smtp"/>
work.xmlファイルにそれ以外の変更がなされない場合、これでこの行は削除され、firewalld は次回リロード時またはシステム起動時にデフォルトの /usr/lib/firewalld/zones/work.xml 設定ファイルを使用します。
4.5.3.4.12. IP アドレスのマスカレーディングの設定
IP マスカレーディングがたとえば external で有効かどうかを確認するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=external --query-masquerade
有効な場合は終了状態が 0yes がプリントされ、無効だと終了状態が 1no がプリントされます。zone が省略されると、デフォルトのゾーンが使用されます。
IP マスカレーディングを有効にするには、root で以下のコマンドを発行します。
~]# firewall-cmd --zone=external --add-masquerade
この設定を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。
IP マスカレーディングを無効にするには、root で以下のコマンドを発行します。
~]# firewall-cmd --zone=external --remove-masquerade
この設定を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。
4.5.3.4.13. コマンドラインインターフェース (CLI) を使ったポート転送の設定
受信ネットワークパケットをあるポートから別のポートまたはアドレスに転送するには、まず root で以下のコマンドを実行して、ゾーン (たとえば external) の IP アドレスマスカレーディングを有効にします。
~]# firewall-cmd --zone=external --add-masquerade
パケットをローカルポート (つまり同一システム上の別のポート) に転送するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3753
この例では、ポート 22 に向けられていたパケットがポート 3753 に転送されます。元の宛先のポートは、port オプションで指定します。このオプションでは、プロトコルとともにポートまたはポート範囲を指定できます。プロトコルが指定された場合、プロトコルは tcp、または udp のいずれかにする必要があります。トラフィックの転送先となるポートまたはポート範囲である新しいローカルポートは、toport オプションで指定します。この設定を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。
宛先ポートを変更せずに、パケットを別の IPv4 アドレス (通常は内部アドレス) に転送するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.0.2.55
この例では、ポート 22 に向けられていたパケットがtoaddr で与えられたアドレスの同一ポートに転送されます。元の宛先のポートは、port オプションで指定します。このオプションでは、プロトコルとともにポートまたはポート範囲を指定できます。プロトコルが指定された場合、プロトコルは tcp または udp のいずれかに指定する必要があります。トラフィックの転送先となるポートまたはポート範囲である新しい宛先ポートは、toport オプションで指定します。この設定を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。
パケットを別の IPv4 アドレス (通常は内部アドレス) の別のポートに転送するには、root で以下のコマンドを実行します。
~]# firewall-cmd --zone=external /
      --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.0.2.55
この例では、ポート 22 に向けられていたパケットがtoaddr オプションで与えられたアドレスのポート 2055 に転送されます。元の宛先のポートは、port オプションで指定します。このオプションでは、プロトコルとともにポートまたはポート範囲を指定できます。プロトコルが指定された場合、プロトコルは tcp または udp のいずれかである必要があります。トラフィックの転送先となるポートまたはポート範囲である新しい宛先ポートは、toport オプションで指定します。この設定を永続的にするには、--permanent オプションを追加してコマンドを繰り返します。

4.5.3.5. XML ファイルを使ったファイアウォールの設定

firewalld の設定は、XML ファイルで /etc/firewalld/ ディレクトリーに保存されています。/usr/lib/firewalld/ ディレクトリー内のファイルはデフォルト設定なので、変更しないでください。XML ファイルの閲覧と変更には、root ユーザー権限が必要になります。XML ファイルは、以下の 3 つの man ページで説明されています。
  • firewalld.icmptype(5) man ページ — ICMP フィルタリングの XML 設定ファイルについて説明しています。
  • firewalld.service(5) man ページ — firewalld service の XML 設定ファイルについて説明しています。
  • firewalld.zone(5) man ページ — firewalld ゾーン設定の XML 設定ファイルについて説明しています。
XML ファイルは直接作成、編集するか、グラフィカルおよびコマンドラインツールを使って間接的に作成することができます。組織内では RPM ファイルでこれらを配布することで、管理とバージョンコントロールが容易になります。Puppet のようなツールを使うと、このような設定ファイルの配布が可能になります。

4.5.3.6. ダイレクトインターフェースの使用

firewall-cmd ツールで --direct オプションを使うと、ランタイム時にチェーンの追加、削除が可能になります。ここではいくつかの例を紹介していますが、詳細は firewall-cmd(1) man ページを参照してください。
ダイレクトインターフェースの使用は意図せずにファイアウォール侵害を引き起こす可能性があるので、iptables に精通していない場合には危険です。
ダイレクトインターフェースモードは、サービスもしくはアプリケーションが実行時に特定のファイアウォールルールを追加するためのものです。--permanent オプションを追加して firewall-cmd --permanent --direct コマンドを使用するか、/etc/firewalld/direct.xml を修正することで、ルールを永続的なものにできます。/etc/firewalld/direct.xml ファイルの詳細は、firewalld.direct(5) の man ページを参照してください。
4.5.3.6.1. ダイレクトインターフェースを使用したカスタムルールの追加
チェーン IN_public_allow にカスタムルールを追加するには、root で以下の形式のコマンドを実行します。
~]# firewall-cmd --direct --add-rule ipv4 filter IN_public_allow \
      0 -m tcp -p tcp --dport 666 -j ACCEPT
この設定を永続的にするには、--permanent オプションを追加します。
4.5.3.6.2. ダイレクトインターフェースを使用したカスタムルールの削除
チェーン IN_public_allow からカスタムルールを削除するには、root で以下の形式のコマンドを実行します。
~]# firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow \
      0 -m tcp -p tcp --dport 666 -j ACCEPT
この設定を永続的にするには、--permanent オプションを追加します。
4.5.3.6.3. ダイレクトインターフェースを使用したカスタムルールの一覧表示
チェーン IN_public_allow 内のカスタムルールを一覧表示するには、root で以下の形式のコマンドを実行します。
~]# firewall-cmd --direct --get-rules ipv4 filter IN_public_allow

4.5.3.7. "リッチ言語" 構文を使った複雑なファイアウォールルールの設定

リッチ言語 構文を使用すると、ダイレクトインターフェースよりも理解しやすい方法で複雑なファイアウォールルールが作成できます。さらに、設定を永続的にすることができます。この言語は値の付いたキーワードを使用するもので、iptables ルールの抽象表現です。ゾーンはこの言語を使って設定することができ、現行の設定方式もそのままサポートされます。
4.5.3.7.1. リッチ言語コマンドの形式
本セクションのコマンドはすべて、root で実行する必要があります。ルールを追加するコマンド形式は以下のようになります。
firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
これでリッチ言語ルールの rule がゾーン zone に追加されます。このオプションは複数回指定することができます。ゾーンが省略されると、デフォルトのゾーンが使用されます。タイムアウトが指定されていれば、ルールは指定の秒数の間、アクティブになり、その後に自動的に削除されます。
ルールを削除するコマンド形式は以下のようになります。
firewall-cmd [--zone=zone] --remove-rich-rule='rule'
これでゾーン zone のルール rule が削除されます。このオプションは複数回指定することができます。ゾーンが省略されると、デフォルトのゾーンが使用されます。
ルールが存在するかどうかを確認するには、以下のコマンドを実行します。
firewall-cmd [--zone=zone] --query-rich-rule='rule'
このコマンドは、リッチ言語ルールの rule がゾーン zone に追加されたかどうかを返します。有効な場合は終了状態が 0yes がプリントされ、無効だと終了状態が 1no がプリントされます。ゾーンが省略されると、デフォルトのゾーンが使用されます。
ゾーン設定ファイルで使用されるリッチ言語表現についての詳細情報は、firewalld.zone(5) man ページを参照してください。
4.5.3.7.2. リッチルールの構造について
リッチルールコマンドの形式または構造は、以下のようになります。
rule [family="rule family"]
    [ source address="address" [invert="True"] ]
    [ destination address="address" [invert="True"] ]
    [ element ]
    [ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ]
    [ audit ]
    [ action ]
ルールは特定のゾーンに関連付けられます。ゾーンには複数のルールを関連付けることができます。いくつかのルールが相互に作用する、または矛盾する場合は、パケットに適合する最初のルールが適用されます。
4.5.3.7.3. リッチルールのコマンドオプションについて
family
ルール family が提供されている場合は、ipv4ipv6 になり、ルールを IPv4 または IPv6 に制限します。ルール family が提供されていない場合は、このルールは IPv4IPv6 の両方に追加されます。ルール内でソースまたは宛先のアドレスが使用されていると、ルール family を提供する必要があります。これは、ポート転送の場合でも同じです。
ソースおよび宛先のアドレス
source
ソースのアドレスを指定すると、接続試行の元を指定したソースアドレスに限定することができます。ソースアドレスまたはアドレスの範囲は、IPv4 または IPv6 のマスクを伴う IP アドレスかネットワーク IP アドレスになります。ネットワーク family (IPv4 または IPv6) が自動的に見つけられます。IPv4 のマスクは、ネットワークマスクか単純な番号になります。IPv6 のマスクは、単純な番号になります。ホスト名の使用はサポートされていません。invert="true" または invert="yes" を追加すると、ソースアドレスコマンドの意味が逆になり、提供されたアドレス以外のものがマッチすることになります。
destination
宛先のアドレスを指定すると、ターゲットを指定した宛先アドレスに限定することができます。宛先アドレスでは、ソースアドレスと同様の構文を使用します。ソースおよび宛先アドレスの使用はオプションで、宛先アドレスの使用はすべての要素と使用できるわけではありません。これは、たとえばサービスエントリーにおける宛先アドレスの使用などによります。
要素
要素は、以下のいずれか ひとつのみ のタイプになります。serviceportprotocolmasqueradeicmp-block または forward-port です。
service
service 要素は、firewalld が提供するサービスのひとつです。事前定義のサービス一覧を入手するには、以下のコマンドを実行します。
~]$ firewall-cmd --get-services
サービスが宛先アドレスを提供する場合、ルール内の宛先アドレスと競合し、エラーが発生します。内部で宛先アドレスを使用するサービスのほとんどは、マルチキャストを使用するサービスです。コマンドは以下の形式になります。
service name=service_name
port
port 要素は、単一のポート番号か 5060-5062 のようなポート範囲のどちらかで、その後に tcpudp のプロトコルが続きます。コマンドは以下の形式になります。
port port=number_or_range protocol=protocol
protocol
プロトコルの値は、プロトコル ID 番号かプロトコル名になります。利用可能なプロトコルエントリーについては、/etc/protocols を参照してください。コマンドは以下の形式になります。
protocol value=protocol_name_or_ID
icmp-block
ひとつ以上の ICMP タイプをブロックするには、このコマンドを使用します。ICMP タイプは、firewalld がサポートする ICMP タイプのひとつになります。サポートされる ICMP タイプの一覧を入手するには、以下のコマンドを実行します。
~]$ firewall-cmd --get-icmptypes
ここではアクションの特定はできません。icmp-blockreject のアクションを内部で使用します。コマンドは以下の形式になります。
icmp-block name=icmptype_name
masquerade
ルール内の IP マスカレードを有効にします。ソースアドレスを提供するとこの分野へのマスカレードを制限できますが、宛先アドレスは制限できません。ここではアクションの特定はできません。
forward-port
tcp または udp として指定されたプロトコルのローカルポートから別のローカルポート、別のマシン、または別のマシン上の別のポートにパケットを転送します。port および to-port は、単一のポート番号もしくはポート範囲のどちらでも構いません。宛先アドレスは、単純な IP アドレスになります。ここではアクションの特定はできません。forward-port コマンドは accept のアクションを内部で使用します。コマンドは以下の形式になります。
forward-port port=number_or_range protocol=protocol /
            to-port=number_or_range to-addr=address
ロギング
log
syslog などのカーネルロギングでルールへの新たな接続試行を記録します。ログメッセージに接頭辞として追加される接頭辞テキストを定義することができます。ログレベルは、emergalertcriterrorwarningnoticeinfo または debug のいずれかになります。ログの使用はオプションです。ログの使用は以下のように制限できます。
log [prefix=prefix text] [level=log level] limit value=rate/duration
rate は正の自然数 [1, ..] で、smhd は時間の長さになります。s は秒数、m は分数、h は時間数、d は日数を表します。制限の最大値は 1/d で、これは 1 日あたり最大 1 ログエントリーになります。
audit
Audit は、サービス auditd に送信された監査記録を使ってロギングの別の方法を提供します。audit タイプは ACCEPTREJECT または DROP のいずれかになりますが、これはルールのアクションから自動的に獲得されるので、audit コマンドの後では指定されません。Audit にはそれ自体のパラメーターはありませんが、オプションで制限を加えることができます。Audit の使用はオプションになります。
アクション
accept|reject|drop
アクションは acceptreject または drop のいずれかになります。ルールに含めることができるのは、単一の要素またはソースのみになります。ルールに要素が含まれている場合、その要素のマッチする新たな接続はそのアクションで処理されます。ルールにソースが含まれている場合、そのソースアドレスからのものがすべて指定されたアクションで処理されます。
accept | reject [type=reject type] | drop
accept を使うと、新たな接続試行がすべて許可されます。reject を使うとそれらは拒否され、そのソースは拒否メッセージを受け取ります。拒否のタイプは、別の値を使用するように設定できます。drop を使うと、すべてのパケットが即座に切断され、ソースにはなにも情報が送られません。
4.5.3.7.4. リッチルールログコマンドの使用
ロギングは Netfilter ログターゲットおよび audit ターゲットを使用して実行できます。zone_log という形式の名前で新たなチェーンがすべてのゾーンに追加されます。ここでの zone はゾーン名になります。適切な順序にするために、これは deny チェーンの前に処理されます。ルールまたはルールの部分は以下のようにルールのアクションにしたがって、別個のチェーンに置かれます。
zone_log
zone_deny
zone_allow
ロギングのルールはすべて zone_log チェーンに置かれ、これが最初に解析されます。reject および drop ルールはすべて zone_deny チェーンに置かれ、これは log チェーンの後に解析されます。accept ルールはすべて zone_allow チェーンに置かれ、これは deny チェーンの後に解析されます。ルールに logdeny または allow アクションが含まれる場合、これらのアクションを指定しているルールの部分は一致するチェーンに置かれます。
4.5.3.7.4.1. リッチルールログコマンドの使用例 1
認証ヘッダープロトコル AH 用に新たな IPv4 および IPv6 接続を有効にします :
rule protocol value="ah" accept
4.5.3.7.4.2. リッチルールログコマンドの使用例 2
プロトコル FTP および audit を使用した 1 分あたり 1 件のログ用に新たな IPv4 および IPv6 接続を許可します :
rule service name="ftp" log limit value="1/m" audit accept
4.5.3.7.4.3. リッチルールログコマンドの使用例 3
プロトコル TFTP と syslog を使用した毎分 1 件のログ用にアドレス 192.168.0.0/24 からの新たな IPv4 接続を許可します。
rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept
4.5.3.7.4.4. リッチルールログコマンドの使用例 4
プロトコル RADIUS 用の 1:2:3:4:6:: からの新たな IPv6 接続はすべて拒否されます。他のソースからの新たな IPv6 接続は許可されます:
rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject
rule family="ipv6" service name="radius" accept
4.5.3.7.4.5. リッチルールログコマンドの使用例 5
プロトコル TCP を使ってポート 4011 で 1:2:3:4:6:: から受信した IPv6 パケットを、ポート 4012 上の 1::2:3:4:7 に転送します。
rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"
4.5.3.7.4.6. リッチルールログコマンドの使用例 6
ソースアドレスをホワイトリスト化してそのソースからの接続すべてを許可します。
rule family="ipv4" source address="192.168.2.2" accept
他の例については、firewalld.richlanguage(5) man ページを参照してください。

4.5.3.8. ファイアウォールのロックダウン

ローカルのアプリケーションやサービスは、root で実行していれば (たとえば libvirt) ファイアウォール設定を変更することができます。この機能を使うと、管理者はファイアウォール設定をロックして、どのアプリケーションもファイアウォール変更を要求できなくするか、ロックダウンのホワイトリストに追加されたアプリケーションのみがファイアウォール変更を要求できるようにすることが可能になります。ロックダウン設定はデフォルトで無効になっています。これを有効にすると、ローカルのアプリケーションやサービスによるファイアウォールの望ましくない変更を確実に防止することができます。
4.5.3.8.1. ファイアウォールロックダウンの設定
root でエディターを使用し、以下の行を /etc/firewalld/firewalld.conf ファイルに追加します。
Lockdown=yes
root で以下のコマンドを実行して、ファイアウォールをリロードします。
~]# firewall-cmd --reload
管理ユーザーとして、つまり wheel グループのユーザーとして (通常、システムの最初のユーザー) 以下のコマンドを実行し、デフォルトゾーンで imaps サービスの有効化を図ります。ユーザーパスワードが求められます。
~]$ firewall-cmd --add-service=imaps
Error: ACCESS_DENIED: lockdown is enabled
firewall-cmd の使用を有効にするには、root で以下のコマンドを実行します。
~]# firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/firewall-cmd*'
この設定を永続的にするには、--permanent オプションを追加します。
root でファイアウォールをリロードします。
~]# firewall-cmd --reload
管理ユーザーとして以下のコマンドを実行し、再度、デフォルトゾーンで imaps サービスの有効化を図ります。ユーザーパスワードが求められます。
~]$ firewall-cmd --add-service=imaps
これでコマンド実行が成功します。
4.5.3.8.2. コマンドラインクライアントを使用したロックダウンの設定
ロックダウンが有効になっているかどうかを確認するには、root で以下のコマンドを実行します。
~]# firewall-cmd --query-lockdown
有効になっている場合は終了状態が 0yes がプリントされ、無効だと終了状態が 1no がプリントされます。
ロックダウンを有効にするには、root で以下のコマンドを実行します。
~]# firewall-cmd --lockdown-on
ロックダウンを無効にするには、root で以下のコマンドを実行します。
~]# firewall-cmd --lockdown-off
4.5.3.8.3. コマンドラインを使用したロックダウンホワイトリストオプションの設定
ロックダウンのホワイトリストには、コマンドやセキュリティのコンテキスト、ユーザー、およびユーザー 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/python -Es /usr/bin/command'
ホワイトリストからコマンド command を削除するには、root で以下のコマンドを実行します。
~]# firewall-cmd --remove-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
ホワイトリストにコマンド command があるかどうかを確認するには、root で以下のコマンドを実行します。
~]# firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
コマンドがある場合は終了状態が 0yes がプリントされ、ないと終了状態が 1no がプリントされます。
ホワイトリストにあるセキュリティコンテキストすべてを一覧表示するには、root で以下のコマンドを実行します。
~]# firewall-cmd --list-lockdown-whitelist-contexts
ホワイトリストにコンテキスト context を追加するには、root で以下のコマンドを実行します。
~]# firewall-cmd --add-lockdown-whitelist-context=context
この設定を永続的にするには、--permanent オプションを追加します。
ホワイトリストからコンテキスト context を削除するには、root で以下のコマンドを実行します。
~]# firewall-cmd --remove-lockdown-whitelist-context=context
この設定を永続的にするには、--permanent オプションを追加します。
ホワイトリストにコンテキスト context があるかどうかを確認するには、root で以下のコマンドを実行します。
~]# firewall-cmd --query-lockdown-whitelist-context=context
コマンドがある場合は終了状態が 0yes がプリントされ、ないと終了状態が 1no がプリントされます。
ホワイトリストにあるユーザー ID すべてを一覧表示するには、root で以下のコマンドを実行します。
~]# firewall-cmd --list-lockdown-whitelist-uids
ホワイトリストにユーザー ID uid を追加するには、root で以下のコマンドを実行します。
~]# firewall-cmd --add-lockdown-whitelist-uid=uid
この設定を永続的にするには、--permanent オプションを追加します。
ホワイトリストからユーザー ID uid を削除するには、root で以下のコマンドを実行します。
~]# firewall-cmd --remove-lockdown-whitelist-uid=uid
この設定を永続的にするには、--permanent オプションを追加します。
ホワイトリストにユーザー ID uid があるかどうかを確認するには、以下のコマンドを実行します。
~]$ firewall-cmd --query-lockdown-whitelist-uid=uid
コマンドがある場合は終了状態が 0yes がプリントされ、ないと終了状態が 1no がプリントされます。
ホワイトリストにあるユーザー名すべてを一覧表示するには、root で以下のコマンドを実行します。
~]# firewall-cmd --list-lockdown-whitelist-users
ホワイトリストにユーザー名 user を追加するには、root で以下のコマンドを実行します。
~]# firewall-cmd --add-lockdown-whitelist-user=user
この設定を永続的にするには、--permanent オプションを追加します。
ホワイトリストからユーザー名 user を削除するには、root で以下のコマンドを実行します。
~]# firewall-cmd --remove-lockdown-whitelist-user=user
この設定を永続的にするには、--permanent オプションを追加します。
ホワイトリストにユーザー名 user があるかどうかを確認するには、以下のコマンドを実行します。
~]$ firewall-cmd --query-lockdown-whitelist-user=user
コマンドがある場合は終了状態が 0yes がプリントされ、ないと終了状態が 1no がプリントされます。
4.5.3.8.4. 設定ファイルを使用したロックダウンホワイトリストオプションの設定
デフォルトのホワイトリスト設定ファイルには、NetworkManager コンテキストと libvirt のデフォルトのコンテキストが含まれています。また、ユーザー ID 0 がリストに含まれています。
<?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/bin/python -Es /bin/firewall-cmd*"/>
  <selinux context="system_u:system_r:NetworkManager_t:s0"/>
  <user id="815"/>
  <user name="user"/>
</whitelist>
上記の例では user iduser name の両方が使われていますが、実際にはどちらか一方のみが必要になります。インタープリターは Python なので、コマンドラインに追加されています。または、以下のような明確なコマンドを使用することもできます。
/usr/bin/python /bin/firewall-cmd --lockdown-on
この例では、--lockdown-on コマンドのみが許可されます。

注記

Red Hat Enterprise Linux 7 では、すべてのユーティリティーが /usr/bin/ に格納され、/bin/ ディレクトリーは /usr/bin/ ディレクトリーにシンボリックリンクされています。つまり、 rootfirewall-cmd のパスを実行すると /bin/firewall-cmd に帰着しますが、/usr/bin/firewall-cmd が使用できるようになっています。新たなスクリプトはすべて新しい格納場所を使うべきですが、root で実行するスクリプトが /bin/firewall-cmd のパスを使用するようなっていれば、通常 root ユーザー以外のみに使用される /usr/bin/firewall-cmd パスに加えてこのコマンドパスもホワイトリストに加える必要があります。
コマンドの名前属性の最後にある * は、それで始まるすべてのコマンドが一致することを意味します。* がなければ、引数を含めたコマンドが完全に一致する必要があります。

4.5.4. iptables サービスの使用

firewalld の代わりにiptables および ip6tables の各サービスを使用するには、まず root で以下のコマンドを実行して firewalld を無効にします。
~]# systemctl disable firewalld
~]# systemctl stop firewalld
そして root で以下のコマンドを実行して、iptables-services パッケージをインストールします。
~]# yum install iptables-services
iptables-services パッケージには、iptablesip6tables のサービスが含まれています。
インストール後に root で以下のコマンドを実行して、iptables および ip6tables のサービスを開始します。
~]# systemctl start iptables
~]# systemctl start ip6tables
システム起動時にサービスの起動を有効にするには、以下のコマンドを入力します。
~]# systemctl enable iptables
~]# systemctl enable ip6tables

4.5.4.1. IPTables および IP セット

ipset ユーティリティーは、Linux カーネルで IP セットを管理するために使用します。IP セットは IP アドレス、ポート番号、IP と MAC アドレスのペア、または IP アドレスとポート番号のペアを格納するフレームワークです。IP セットが非常に大きい場合であっても IP セットに対する照合が非常に高速に行われるよう IP セットにはインデックスが作成されます。IP セットにより、設定が簡素化され、管理しやすくなり、iptables を使用した場合にパフォーマンスが向上します。セットを参照する iptables のマッチとターゲットにより、カーネルの該当するセットを保護するリファレンスが作成されます。セットを参照するリファレンスが 1 つでもある限り、セットを破棄することはできません。
ipset を使用すると、以下のような iptables コマンドをセットに置き換えることができます。
~]# iptables -A INPUT -s 10.0.0.0/8 -j DROP
~]# iptables -A INPUT -s 172.16.0.0/12 -j DROP
~]# iptables -A INPUT -s 192.168.0.0/16 -j DROP
セットは以下のように作成されます。
~]# ipset create my-block-set hash:net
~]# ipset add my-block-set 10.0.0.0/8
~]# ipset add my-block-set 172.16.0.0/12
~]# ipset add my-block-set 192.168.0.0/16
セットは、以下のように iptables コマンドで参照されます。
~]# iptables -A INPUT -m set --set my-block-set src -j DROP
セットが複数回使用される場合は、設定時間が短縮されます。セットに多くのエントリーが含まれる場合は、処理時間が短縮されます。
4.5.4.1.1. firewalld での IP セットの使用
firewalld で IP セットを使用するには、セットを参照するために永続的な直接ルールが必要であり、各 ipset に対して firewalld が起動する前にカスタムサービスを作成および起動する必要があります。永続的な直接ルールは、/etc/firewalld/direct.xml ファイルを使用して追加できます。

手順4.1 IP セットのカスタムサービスの設定

firewalld が起動する前に、カスタムサービスが IP セット構造を作成およびロードするよう設定します。
  1. root でエディターを使用して、以下のようにファイルを作成します。
    ~]# vi /etc/systemd/system/ipset_name.service
      [Unit]
    Description=ipset_name
    Before=firewalld.service
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/local/bin/ipset_name.sh start
    ExecStop=/usr/local/bin/ipset_name.sh stop
    
    [Install]
    WantedBy=basic.target
  2. firewalld で IP セットを永続的に使用します。
    ~]# vi /etc/firewalld/direct.xml
    <?xml version="1.0" encoding="utf-8"?>
    <direct>
       <rule ipv="ipv4" table="filter" chain="INPUT" priority="0">-m set
    --match-set <replaceable>ipset_name</replaceable> src -j DROP</rule>
    </direct>
  3. 変更を反映するには firewalld をリロードする必要があります。
    ~]# firewall-cmd --reload
    この結果、状態情報を失わずにファイアーウォールがリロードされます (TCP セッションが中断されません) が、リロード中にサービスが破棄されることがあります。
4.5.4.1.2. ipset のインストール
ipset ユーティリティーをインストールするには、以下のコマンドを root で実行します。
~]# yum install ipset
使用法のメッセージを表示するには、以下のコマンドを実行します。
~]$ ipset --help
ipset v6.11

Usage: ipset [options] COMMAND出力省略
4.5.4.1.3. ipset コマンド
ipset コマンドの形式は以下のようになります。
ipset [options] command [command-options]
Where command is one of:
create | add | del | test | destroy | list | save | restore | flush | rename | swap | help | version | - 
Allowed options are:
-exist | -output [ plain | save | xml ] | -quiet | -resolve | -sorted | -name | -terse
create コマンドは、IP データのセットを格納する新しいデータ構造を作成するために使用します。add コマンドを使用すると、セットに新しいデータが追加され、追加されたデータはセットの要素として参照されます。
-exist オプションを使用すると、要素がすでに存在する場合に、エラーメッセージが表示されず、タイムアウト値を更新する特別なロールが提供されます。タイムアウトを変更するには、ipset add コマンドを使用し、必要に応じてタイムアウト値のみを変更して -exist オプションを使用することにより要素のすべてのデータを再び指定します。
test オプションは、要素がすでにセット内に存在する場合のテスト用です。
create コマンドの形式は以下のようになります。
ipset create set-name type-name [create-options]
set-name は、ユーザーにより選択された適切な名前であり、type-name はセットを構成するデータを格納するために使用するデータ構造の名前です。type-name の形式は以下のとおりです。
method:datatype[,datatype[,datatype]]
データの格納に許可される方法は以下のとおりです。
 bitmap | hash | list 
許可されるデータタイプは以下のとおりです。
ip | net | mac | port | iface 
セット内でエントリー追加、削除、またはテストする場合は、セット内で 1 つのエントリー (つまり要素) を構成するデータに、カンマで区切られた同じデータを使用する必要があります。以下に例を示します。
ipset add set-name ipaddr,portnum,ipaddr

注記

セットには IPv4 アドレスと IPv6 アドレスを同時に含めることはできません。セットは作成されたときにファミリーにバインドされます (IPv4 の場合は inetIPv6 の場合は inet6。デフォルト値は inet)。

例4.2 IP セットの作成

ソース IP アドレス、ポート、および宛先 IP アドレスで構成される IP セットを作成するには、コマンドを以下のように実行します。
~]# ipset create my-set hash:ip,port,ip
セットが作成されると、エントリーは以下のように追加できます。
~]# ipset add my-set 192.168.1.2,80,192.168.2.2
~]# ipset add my-set 192.168.1.2,443,192.168.2.2
セットタイプには共通して以下のオプションのパラメーターがあります。これらのパラメーターを使用するには、セットの作成時にパラメーターを指定する必要があります。
  • timeoutcreate コマンドで提供された値は、作成されたセットのデフォルト値になります。add コマンドで提供された値は要素の非デフォルト初期値になります。
  • counters — オプションが create コマンドで提供された場合は、セット内の各要素に対してパケットおよびバイトカウンターが作成されます。値が add コマンドで提供されない場合、カウンターはゼロから始まります。
  • comment — オプションが create コマンドで提供された場合は、追加される要素の目的を文書化するために add コマンドで引用符で囲まれたテキスト文字列を渡すことができます。引用符は文字列内で許可されず、エスケープ文字は IP セット内で無効になることに注意してください。

例4.3 IP セットのリスト

特定の IP セットである my-set の内容をリストするには、以下のようにコマンドを実行します。
~]# ipset list my-set
    Name: my-set
    Type: hash:ip,port,ip
    Header: family inet hashsize 1024 maxelem 65536
    Size in memory: 8360
    References: 0
    Members:
    192.168.1.2,tcp:80,192.168.2.2
    192.168.1.2,tcp:443,192.168.2.2
すべてのセットをリストするにはセット名を省略します。

例4.4 IP セットの要素のテスト

大きいセットの内容をリストするには時間がかかります。以下のように、要素があるかどうかテストできます。
~]# ipset test my-set 192.168.1.2,80,192.168.2.2
    192.168.1.2,tcp:80,192.168.2.2 is in set my-set.
4.5.4.1.4. IP セットタイプ
bitmap:ip
セットの作成時に netmask オプションが使用される場合は、IPv4 ホストアドレス、ネットワーク範囲、またはプレフィックス長が CIDR 表記の IPv4 ネットワークアドレスを格納します。オプションでタイムアウト値、カウンター値、およびコメントを格納できます。最大で 65536 のエントリーを格納できます。bitmap:ip セットを作成するコマンドの形式は以下のとおりです。
ipset create set-name range start_ipaddr-end_ipaddr |ipaddr/prefix-length [netmask prefix-length] [timeout value] [counters] [comment]

例4.5 プレフィックス長を使用したアドレス範囲の IP セットの作成

プレフィックス長を使用してアドレス範囲の IP セットを作成するには、以下のように bitmap:ip セットタイプを使用します。
~]# ipset create my-range bitmap:ip range 192.168.33.0/28
セットが作成されると、エントリーは以下のように追加できます。
~]# ipset add my-range 192.168.33.1
リストのメンバーを確認します。
~]# ipset list my-range
    Name: my-range
    Type: bitmap:ip
    Header: range 192.168.33.0-192.168.33.15
    Size in memory: 84
    References: 0
    Members:
    192.168.33.1
アドレス範囲を追加するには、以下のようにコマンドを実行します。
~]# ipset add my-range 192.168.33.2-192.168.33.4
リストのメンバーを確認します。
~]# ipset list my-range
    Name: my-range
    Type: bitmap:ip
    Header: range 192.168.33.0-192.168.33.15
    Size in memory: 84
    References: 0
    Members:
    192.168.33.1
    192.168.33.2
    192.168.33.3
    192.168.33.4

例4.6 ネットマスクを使用したアドレス範囲の IP セットの作成

ネットマスクを使用してアドレス範囲の IP セットを作成するには、以下のように bitmap:ip セットタイプを使用します。
~]# ipset create my-big-range bitmap:ip range 192.168.124.0-192.168.126.0 netmask 24
セットが作成されると、エントリーは以下のように追加できます。
~]# ipset add my-big-range 192.168.124.0
アドレスを追加しようとすると、そのアドレスを含む範囲が追加されます。
~]# ipset add my-big-range 192.168.125.150
~]# ipset list my-big-range
    Name: my-big-range
    Type: bitmap:ip
    Header: range 192.168.124.0-192.168.126.255 netmask 24
    Size in memory: 84
    References: 0
    Members:
    192.168.124.0
    192.168.125.0
bitmap:ip,mac
IPv4 アドレスと MAC アドレスをペアとして格納します。最大で 65536 のエントリーを格納できます。
ipset create my-range bitmap:ip,mac range start_ipaddr-end_ipaddr | ipaddr/prefix-length [timeout value ] [counters] [comment]

例4.7 IPv4 MAC アドレスペアの範囲の IP セットの作成

IPv4 MAC アドレスペアの範囲の IP セットを作成するには、以下のように bitmap:ip,mac セットタイプを使用します。
~]# ipset create my-range bitmap:ip,mac range 192.168.1.0/24
セットを作成する場合に、MAC アドレスを指定する必要はありません。
セットが作成されると、エントリーは以下のように追加できます。
~]# ipset add my-range 192.168.1.1,12:34:56:78:9A:BC
bitmap:port
ポート範囲を格納します。最大で 65536 のエントリーを格納できます。
ipset create my-port-range bitmap:port range start_port-end_port [timeout value ] [counters] [comment]
設定されたマッチおよび SET ターゲット netfilter カーネルモジュールは、格納された番号を TCP または UDP ポート番号として解釈します。プロトコルはオプションでポートともに指定できます。サービス名が使用され、その名前が TCP サービスとして存在しない場合は、proto のみを指定する必要があります。

例4.8 ポート範囲の IP セットの作成

ポート範囲の IP セットを作成するには、以下のように bitmap:port セットタイプを使用します。
~]# ipset create my-permitted-port-range bitmap:port range 1024-49151
セットが作成されると、エントリーは以下のように追加できます。
~]# ipset add my-permitted-port-range 5060-5061
hash:ip
ホストまたはネットワークアドレスをハッシュ形式で格納します。デフォルトでは、ネットワークプレフィックス長なしで指定されたアドレスがホストアドレスになります。すべてがゼロの IP アドレスを格納することはできません。
ipset create my-addresses hash:ip [family[ inet | inet6 ]] [hashsize value] [maxelem value ] [netmask prefix-length] [timeout value ]
inet ファミリーがデフォルト値になります。family が省略されると、アドレスは IPv4 アドレスとして解釈されます。hashsize 値は使用する初期ハッシュサイズであり、デフォルトで 1024 に設定されます。maxelem 値はセットに格納できる要素の最大数であり、デフォルトで 65536 に設定されます。
netfilter ツールは最も明確なネットワークプレフィックスを検索し、一致するアドレスの最も小さいブロックを見つけようとします。

例4.9 IP アドレスの IP セットの作成

IP アドレスの IP セットを作成するには、以下のように hash:ip セットタイプを使用します。
~]# ipset create my-addresses hash:ip
セットが作成されると、エントリーは以下のように追加できます。
~]# ipset add my-addresses 10.10.10.0
ネットマスクやタイムアウトなどの追加のオプションが必要な場合は、セットの作成時にオプションを指定する必要があります。例を以下に示します。
~]# ipset create my-busy-addresses hash:ip maxelem 24 netmask 28 timeout 100
maxelem オプションを使用すると、セット内の要素の合計数に制限され、メモリー使用量が節約されます。
timeout オプションは、指定された秒数の間にだけ要素がセット内に存在することを意味します。以下に示します。
~]# ipset add my-busy-addresses timeout 100
以下の出力は時間のカウントダウンを示しています。
[root@rhel6 ~]# ipset add my-busy-addresses 192.168.60.0 timeout 100
    [root@rhel6 ~]# ipset list my-busy-addresses
    Name: my-busy-addresses
    Type: hash:ip
    Header: family inet hashsize 1024 maxelem 24 netmask 28 timeout 100
    Size in memory: 8300
    References: 0
    Members:
    192.168.60.0 timeout 90
    [root@rhel6 ~]# ipset list my-busy-addresses
    Name: my-busy-addresses
    Type: hash:ip
    Header: family inet hashsize 1024 maxelem 24 netmask 28 timeout 100
    Size in memory: 8300
    References: 0
    Members:
    192.168.60.0 timeout 83
タイムアウト期間が終了すると、要素がセットから削除されます。
他の例については、ipset(8) man ページを参照してください。

4.5.5. その他のリソース

以下の情報ソースでは、firewalld に関する追加リソースが提供されています。

4.5.5.1. インストールされているドキュメント

  • firewalld(1) man ページ — firewalld のコマンドオプションについて説明しています。
  • firewalld.conf(5) man ページ — firewalld の設定に関する情報が含まれています。
  • firewall-cmd(1) man ページ — firewalld コマンドラインクライアントのコマンドオプションについて説明しています。
  • firewalld.icmptype(5) man ページ — ICMP フィルタリングの XML 設定ファイルについて説明しています。
  • firewalld.service(5) man ページ — firewalld service の XML 設定ファイルについて説明しています。
  • firewalld.zone(5) man ページ — firewalld ゾーン設定の XML 設定ファイルについて説明しています。
  • firewalld.direct(5) man ページ — firewalld ダイレクトインターフェース設定ファイルについて説明しています。
  • firewalld.lockdown-whitelist(5) man ページ — firewalld ロックダウンホワイトリストの設定ファイルについて説明しています。
  • firewall.richlanguage(5) man ページ — firewalld リッチ言語ルールの構造について説明しています。
  • firewalld.zones(5) man ページ — ゾーンについての全般的な説明とそれらの設定方法が説明されています。