From Fedora Project Wiki

Revision as of 09:57, 20 December 2012 by Rfujita (talk | contribs) (Created page with "{{autolang|base=yes}} = FirewallDによる動的ファイアウォール = firewalldは、ネットワークコネクションやインターフェースの信頼度を定義...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

FirewallDによる動的ファイアウォール

firewalldは、ネットワークコネクションやインターフェースの信頼度を定義するネットワーク/ファイアウォールのゾーンに対応した動的に管理可能なファイアウォールを提供します。IPv4とIPv6のファイアウォール設定とイーサネットブリッジに対応し、一時的・永続的な設定オプションを分けて保持します。ファイアウォールのルールを直接追加するサービスへのインターフェースとアプリケーションにも対応します。

system-config-firewall/lokkitによる従来のファイアウォールモデルは静的で、いかなる変更でもファイアウォールの完全な再起動が必要でした。再起動するということは、ファイアウォールのnetfilterカーネルモジュールをアンロードし、新しい設定を必要とするモジュールをロードすることも含みます。モジュールをアンロードすることはステートフルなファイアウォールや確立した接続を中断することになります。

反対に、firewallデーモンはファイアウォールを動的に管理し、設定を反映するのにファイアウォール全体の再起動を必要としません。従って、ファイアウォールのカーネルモジュールをリロードする必要もありません。しかし、firewallデーモンを用いるということは、デーモン内部とカーネル内部のファイアウォールの状態が同期していることを確実に出来るデーモンと共に、ファイアウォールの全ての設定変更が行われなければならないことになります。firewallデーモンはip*tablesとetablesコマンドラインツールによって追加されたファイアウォールのルールを解釈出来ません。

デーモンは有効なファイアウォールの設定の情報をD-BUS経由で提供し、PolicyKit認証の仕組みを利用してD-BUS経由で変更を受け付けます。

デーモン

アプリケーションとデーモン、ユーザはD-BUSを通じてファイアウォールの機能を有効に出来ます。機能は、事前に定義されたサービスのようなファイアウォールの機能であったり、ポートとプロトコルの組み合わせ、ポート/パケット転送、マスカレードやicmpのブロッキングといったものです。機能は何回でも有効にしたり、再度無効にしたり出来ます。

いわゆるダイレクトインターフェースによって、他のサービス(例えばlibvirtのような)は、iptablesの引数とパラメータを利用して自らのルールを追加出来ます。

例えばamanda、ftp、sambaやtftpサービスによって利用されるnetfilterファイアウォールヘルパーは、事前に定義されたサービスの部分である限りは、デーモンによって扱われます。追加のヘルパーをロードすることは、現在のインターフェースには含まれません。ヘルパーのいくつかにとっては、モジュールによって扱われる全てのコネクションが閉じられた後にしか、ロードすることが出来ません。従って、コネクションの追跡情報はこの点で重要で、かつ考慮する必要があります。


静的なファイアウォール (system-config-firewall/lokkit)

現実のsystem-config-firewallとlokkitによる静的なファイアウォールモデルは、いまだ有効で利用価値がありますが、一方でデーモンとして実行出来ません。ユーザや管理者はいずれのファイアウォールソリューションを利用すべきか、対応するサービスを有効にすることで決定出来ます。

計画では、インストール時あるいは初回起動時に使ってファイアウォールソリューションを選ぶ方法を追加します。別のソリューションの設定はそのまま保存され、別のモデルに単に切り替えるだけで有効化することが出来ます。

firewallデーモンはsystem-config-firewallに依存していませんが、同時に利用するべきではありません。


ゾーンとは何か?

ネットワークゾーンはネットワークコネクションの信頼度を定義します。これは一対多の関係で、あるコネクションはあるゾーンの単なる部分であることを意味しますが、あるゾーンが多数のネットワークコネクションに利用されることもあり得ます。

多くのゾーンは変化しやすいですが、変化しないゾーンもあります。変化しないゾーンは変更することが出来ず、上書きするいかなる方法もありません。

事前定義のサービス

サービスはポートおよび[または]プロトコルの組み合わせの項目です。さらにnetfilterヘルパーモジュールやIPv4 / IPv6の宛先アドレスを追加することも出来ます。

ポートとプロトコル

tcpやudpのポートの定義、単一のポートやポートの範囲からなります。

ICMPブロック

特定のInternet Control Message Protocol (ICMP)メッセージ。メッセージは情報のリクエストであったり、情報のリクエストやそれに対する応答、あるいはエラーの状況などです。

マスカレーディング

マップされるあるいはパブリックIPアドレスの背後に隠されるプライベートネットワークのアドレス。アドレス変換の一種の形式です。

転送ポート

他のポートおよび[または]他のホストにマップされるポート。

いずれのゾーンが利用可能か?

firewalldが提供するゾーンで、ゾーンのデフォルトの信頼度の低い方から順に並んでいます。

drop (変更不可)

全ての内向きパケットはドロップされ、応答はありません。外向きネットワークコネクションだけが可能です。

block (変更不可)

全ての内向きネットワークコネクションが、IPv4向けにはicmp-host-prohibitedメッセージと共に、IPv6向けにはicmp6-adm-prohibitedメッセージと共に拒絶されます。システムによって作成されたネットワークコネクションのみが可能です。

public

公共エリアで利用します。あなたのコンピュータを侵害しないようにするため、ネットワーク上の他のコンピュータを信頼しません。選択された内向きのコネクションのみが受け入れられます。

external

特にルータ用にマスカレードが有効な外部ネットワークに利用します。あなたのコンピュータを侵害しないようにするため、ネットワーク上の他のコンピュータを信頼しません。選択された内向きのコネクションのみが受け入れられます。

dmz

あなたの内部のネットワークへの限られたアクセスが外部からできる非武装地帯のコンピュータ用です。選択された内向きのコネクションのみが受け入れられます。

work

業務エリアで利用します。あなたのコンピュータを侵害しないようにするため、ネットワーク上の他のコンピュータの大部分は信頼します。選択された内向きのコネクションのみが受け入れられます。

home

自宅エリアで利用します。あなたのコンピュータを侵害しないようにするため、ネットワーク上の他のコンピュータの大部分は信頼します。選択された内向きのコネクションのみが受け入れられます。

internal

内部ネットワーク用です。あなたのコンピュータを侵害しないようにするため、ネットワーク上の他のコンピュータの大部分は信頼します。選択された内向きのコネクションのみが受け入れられます。

trusted (変更不可)

全てのネットワークコネクションが受け入れられます。

いずれのゾーンを使うべきか?

例えば、公共のWiFiネットワーク接続はほぼ信頼すべきでありませんし、有線の自宅ネットワーク接続は信頼しても構わないでしょう。利用しているネットワークに最適なゾーンを選択します。

どのようにゾーンを設定し追加するのか?

ゾーンを設定・追加するには、設定を扱い変更するfirewalldのいずれかのインターフェースが利用可能です:グラフィカルな設定ツールであるfirewall-config、コマンドラインツールであるfirewall-cmd、そしてD-BUSインターフェースです。あるいは、設定もディレクトリのいずれかにゾーンファイルを作成する、あるいはコピーすることも出来ます。/etc/firewalld/zonesがデフォルトかつフォールバックの設定として用いられ、@PREFIX@/lib/firewalld/zonesが、ユーザが作成し修正した設定ファイル用に用いられます。

どのように接続用のゾーンを設定・変更するのか

ゾーンはコネクションのifcfgにZONE=オプションと共に保持されます。もしオプションが失われるあるいは無い場合は、firewalldに設定されたデフォルトのゾーンが利用されます。

もしコネクションがNetworkManagerによって制御されている場合は、nm-connection-editorを利用してゾーンを変更することが出来ます。

NetworkManagerによって扱われるネットワーク接続

ファイアウォールはNetworkManagerによって表示される名前を持つネットワーク接続を扱えませんが、ネットワークインターフェースだけは扱えます。従って、NetworkManagerは、コネクションが確立する前に、コネクションに関連するネットワークインターフェースをコネクションの設定ファイル(ifcfg)によって定義されるゾーンに入れるように、firewalldに通知します。もしゾーンが設定ファイル中に指定されていなければ、インターフェースはfirewalldによって設定されるデフォルトゾーンに入れられます。もしコネクションが2つ以上のインターフェースを持つ場合は、両方ともfirewalldに通知されます。さらに、インターフェース名の変更はNetworkManagerによって扱われ、firewalldに通知されます。

このコネクションの単純化はその瞬間からゾーンに関連するものとして利用されます。

もしコネクションが切断すると、NetworkManagerは再びゾーンからコネクションを取り除くように、firewalldに通知もします。

もしfirewalldがsystemdやinitスクリプトによって起動あるいは再起動すると、firewalldはNetworkManagerに通知し、コネクションはゾーンに追加されます。

ネットワークスクリプトによって扱われるネットワーク接続

ネットワークスクリプトによって扱われるコネクションについては制限があります:デーモンはゾーンにコネクションを追加するようにfirewalldに通知することが出来ません。ifcfg-postスクリプト中でしか行われません。従って、それ以降の名前の変更は、firewalldに通知され得ません。また、コネクションが既に有効な場合にはfirewalldの起動や再起動は関連性を失う結果になります。ただし、これを修正する方法はあります。最も単純なのは、全てのコネクションをデフォルトゾーンに入れてしまって、他に設定しないことです。

ゾーンはこのゾーンで有効なファイアウォールの機能を定義します:

firewalldでの作業

ゾーンでファイアウォールの機能を有効・無効化する例として、グラフィカルな設定ツールであるfirewall-configやコマンドラインツールのクライアントであるfirewall-cmdを利用可能です。

firewall-cmdを使う

コマンドラインツールのクライアントであるfirewall-cmdは、ファイアウォールの機能全てに対応しています。ステータスやクエリでは出力がありませんが、コマンドは状態を返しています。

一般的な利用方法

  • firewalldのステータスを取得する
 firewall-cmd --state

firewalldのステータスを返しますが、出力はありません。目で見えるようにするには:

 firewall-cmd --state && echo "Running" || echo "Not running"
  • firewalldを状態の情報を失わずにリロードする:
 firewall-cmd --reload

もし--complete-reloadを代わりに使うと、状態の情報は失われます。このオプションは深刻なファイアウォールの問題、例えばコネクションが全く確立出来ないけれどファイアウォールのルールは正しいというような状態の情報の問題がある場合にのみ、用いるべきです。

  • サポートされる全てのゾーンのリストを取得する
 firewall-cmd --get-zones

スペースで区切られたリストを表示します。

  • サポートされる全てのサービスのリストを取得する
 firewall-cmd --get-services

スペースで区切られたリストを表示します。

  • サポートされる全てのICMPタイプのリストを取得する
 firewall-cmd --get-icmptypes

スペースで区切られたリストを表示します。

  • 全ての有効な機能とゾーンを一覧表示します。
 firewall-cmd --list-all-zones

出力書式:

 <zone>
   interfaces: <interface1> ..
   services: <service1> ..
   ports: <port1> ..
   forward-ports: <forward port1> ..
   icmp-blocks: <icmp type1> ..
   
   ..
  • 有効な機能と<zone>ゾーンを表示します。もしゾーンが省略されると、デフォルトゾーンが表示されます。
 firewall-cmd [--zone=<zone>] --list-all
  • ネットワーク接続用のデフォルトゾーンを取得する
 firewall-cmd --get-default-zone
  • デフォルトゾーンを設定する
 firewall-cmd --set-default-zone=<zone>

デフォルトゾーンにある全てのインターフェースは、新しいデフォルトゾーンに入れられます。新しいデフォルトゾーンは外部の新規接続の制限を定義します。既存の接続には影響しません。

  • 既存のゾーンを取得する
 firewall-cmd --get-active-zones

ゾーンの一部として設定されているインターフェースを次の書式で表示します:

 <zone1>: <interface1> <interface2> ..
 <zone2>: <interface3> ..
  • インターフェースに関連するゾーンを取得する
 firewall-cmd --get-zone-of-interface=<interface>

もしインターフェースがゾーンの一部である場合、ゾーン名を表示します。

  • ゾーンにインターフェースを追加する
 firewall-cmd [--zone=<zone>] --add-interface=<interface>

もし以前にゾーンにインターフェースが無ければ、ゾーンに追加します。ゾーンオプションを省略すると、デフォルトゾーンに追加されます。インターフェースはリロード後に再適用されます。

  • インターフェースの属するゾーンを変更する
 firewall-cmd [--zone=<zone>] --change-interface=<interface>

--add-interfaceオプションと同様ですが、以前に別のゾーンにインターフェースがあった場合、新しいゾーンに入れます。

  • ゾーンからインターフェースを取り除く
 firewall-cmd [--zone=<zone>] --remove-interface=<interface>
  • ゾーンにインターフェースがあるか問い合わせる
 firewall-cmd [--zone=<zone>] --query-interface=<interface>

ゾーンにインターフェースがあるか否かを返します。

  • ゾーンで有効なサービスを一覧表示します。
 firewall-cmd [ --zone=<zone> ] --list-services
  • 緊急時に全てのネットワークトラフィックをブロックするためにパニックモードを有効化します。
 firewall-cmd --enable-panic
  • パニックモードを無効化します。
 firewall-cmd --disable-panic
  • パニックモードか否かを問い合わせます。
 firewall-cmd --query-panic

パニックモードの状態を返しますが、出力はありません。目で見えるようにするには:

 firewall-cmd --query-panic && echo "On" || echo "Off"


ランタイムのゾーンの扱い

ランタイムモードでのゾーンの変更は永続的ではありません。リロードあるいは再起動後に変更は失われます。

  • ゾーンのサービスを有効化する。
 firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>]

ゾーンのサービスを有効化します。ゾーンが指定されていない場合、デフォルトゾーンのサービスが有効化されます。もしタイムアウトが指定されると、そのゾーンにおいて、ある秒数の間だけサービスが有効化されます。サービスが既に有効な場合、特に警告メッセージはありません。

  • 例: 60秒間だけhomeゾーンでippクライアントサービスを有効化する:
 firewall-cmd --zone=home --add-service=ipp-client --timeout=60
  • 例: デフォルトゾーンでhttpサービスを有効化する:
 firewall-cmd --add-service=http
  • ゾーンのサービスを無効化する
 firewall-cmd [--zone=<zone>] --remove-service=<service>

ゾーンのサービスを無効化します。もしゾーンが指定されていなければ、デフォルトゾーンが対象になります。

  • 例: homeゾーンでhttpサービスを無効化する:
 firewall-cmd --zone=home --remove-service=http

homeゾーンのサービスを無効化します。もしゾーンに有効なサービスが無ければ、警告メッセージが出ます。

  • ゾーンに有効なサービスがあるか問い合わせる。
 firewall-cmd [--zone=<zone>] --query-service=<service>

ゾーンに有効なサービスがあれば1を、無ければ0を返します。出力はありません。

  • ゾーンでポートとプロトコルの組み合わせを有効化する。
 firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]

ポートとプロトコルの組み合わせを有効化します。ポートは単一の<port>ポートや<port>-<port>というポートの範囲を使えます。プロトコルはtcpudpです。

  • ゾーンでポートとプロトコルの組み合わせを無効化する。
 firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
  • ゾーンに有効なポートとプロトコルの組み合わせがあるか問い合わせる。
 firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>

このコマンドは有効か否かを返しますが、出力はありません。

  • ゾーンでマスカレーディングを有効化する。
 firewall-cmd [--zone=<zone>] --add-masquerade

ゾーンでマスカレーディングを有効化します。プライベートネットワークのアドレスはマップされ、パブリックIPアドレスの背後に隠されます。これはアドレス変換の一種でルータでよく使われます。マスカレーディングはカーネルの制限によりIPv4のみです。

  • ゾーンのマスカレーディングを無効化します。
 firewall-cmd [--zone=<zone>] --remove-masquerade
  • ゾーンのマスカレーディングを問い合わせます。
 firewall-cmd [--zone=<zone>] --query-masquerade

このコマンドは有効か否かを返しますが、出力はありません。

  • ゾーンのICMPブロックを有効化する。
 firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype>

選択されたInterne Control Message Protocol (ICMP)メッセージのブロックを有効化します。ICMPメッセージは、情報のリクエストやそれに対する応答、あるいはエラーの状況などです。

  • ゾーンのICMPブロックを無効化する。
 firewall-cmd [--zone=<zone>] --remove-icmp-block=<icmptype>
  • ゾーンのICMPブロックを問い合わせます。
 firewall-cmd [--zone=<zone>] --query-icmp-block=<icmptype>

このコマンドは有効か否かを返しますが、出力はありません。

  • 例: echo応答メッセージをpublicゾーンでブロックする:
 firewall-cmd --zone=public --add-icmp-block=echo-reply
  • ゾーンでポート転送あるいはポートマッピングを有効化する。
 firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

ポートは、他のホストの同じポートや、同じホストの別のポート、あるいは別のホストの別のポートにマップされます。ポートは単一の<port>ポートや<port>-<port>というポートの範囲を使えます。プロトコルはtcpudpです。toportは<port>ポートや<port>-<port>というポートの範囲を使えます。toaddrはIPv4アドレスです。ポート転送はカーネルの制限によりIPv4のみです。

  • ゾーンでポート転送あるいはポートマッピングを無効化する。
 firewall-cmd [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
  • ゾーンのポート転送あるいはポートマッピングを問い合わせます。
 firewall-cmd [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

このコマンドは有効か否かを返しますが、出力はありません。

  • 例: sshをhomeゾーンの127.0.0.2というホストに転送する。
 firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

永続的な/固定されたゾーンの扱い

永続化オプションはランタイムに直接影響しません。これらのオプションはリロードあるいは再起動後にのみ利用可能になります。ランタイムかつ永続的な設定をするには、両方を指定する必要があります。 --permanentオプションは全ての永続的引数の最初に無ければなりません。

  • サポートされた永続的なサービスのリストを表示する。
 firewall-cmd --permanent --get-services
  • サポートされた永続的なICMPタイプのリストを表示する。
 firewall-cmd --permanent --get-icmptypes
  • サポートされた永続的なゾーンのリストを表示する。
 firewall-cmd --permanent --get-zones
  • ゾーンのサービスを有効化する。
 firewall-cmd --permanent [--zone=<zone>] --add-service=<service>

ゾーンのサービスを永続的に有効化します。もしゾーンが指定されていなければ、デフォルトゾーンが対象になります。 This enables the service in the zone permanently. If the zone option is omitted, the default zone is used.

  • ゾーンのサービスを無効化する。
 firewall-cmd --permanent [--zone=<zone>] --remove-service=<service>
  • ゾーンに有効なサービスがあるか問い合わせる。
 firewall-cmd --permanent [--zone=<zone>] --query-service=<service>

このコマンドは有効か否かを返しますが、出力はありません。

  • 例: homeゾーンでippクライアントサービスを永続的に有効化する:
 firewall-cmd --permanent --zone=home --add-service=ipp-client
  • ゾーンでポートとプロトコルの組み合わせを永続的に有効化する。
 firewall-cmd --permanent [--zone=<zone>] --add-port=<port>[-<port>]/<protocol>
  • ゾーンでポートとプロトコルの組み合わせを永続的に無効化する。
 firewall-cmd --permanent [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
  • ゾーンに永続的に有効なポートとプロトコルの組み合わせがあるか問い合わせる。
 firewall-cmd --permanent [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>

このコマンドは有効か否かを返しますが、出力はありません。

  • 例: homeゾーンでhttpsのポート443/tcpを永続的に有効化する。
 firewall-cmd --permanent --zone=home --add-port=443/tcp
  • ゾーンでマスカレーディングを永続的に有効化する。
 firewall-cmd --permanent [--zone=<zone>] --add-masquerade

ゾーンでマスカレーディングを有効化します。プライベートネットワークのアドレスはマップされ、パブリックIPアドレスの背後に隠されます。これはアドレス変換の一種でルータでよく使われます。マスカレーディングはカーネルの制限によりIPv4のみです。

  • ゾーンのマスカレーディングを永続的に無効化します。
 firewall-cmd --permanent [--zone=<zone>] --remove-masquerade
  • ゾーンの永続的なマスカレーディングを問い合わせます。
 firewall-cmd --permanent [--zone=<zone>] --query-masquerade

このコマンドは有効か否かを返しますが、出力はありません。

  • ゾーンのICMPブロックを永続的に有効化する。
 firewall-cmd --permanent [--zone=<zone>] --add-icmp-block=<icmptype>

選択されたInterne Control Message Protocol (ICMP)メッセージのブロックを有効化します。ICMPメッセージは、情報のリクエストやそれに対する応答、あるいはエラーの状況などです。

  • ゾーンのICMPブロックを永続的に無効化する。
 firewall-cmd --permanent [--zone=<zone>] --remove-icmp-block=<icmptype>
  • ゾーンの永続的なICMPブロックを問い合わせます。
 firewall-cmd --permanent [--zone=<zone>] --query-icmp-block=<icmptype>

このコマンドは有効か否かを返しますが、出力はありません。

  • 例: echo応答メッセージをpublicゾーンでブロックする:
 firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply
  • ゾーンでポート転送あるいはポートマッピングを永続的に有効化する。
 firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

ポートは、他のホストの同じポートや、同じホストの別のポート、あるいは別のホストの別のポートにマップされます。ポートは単一の<port>ポートや<port>-<port>というポートの範囲を使えます。プロトコルはtcpudpです。toportは<port>ポートや<port>-<port>というポートの範囲を使えます。toaddrはIPv4アドレスです。ポート転送はカーネルの制限によりIPv4のみです。

  • ゾーンでポート転送あるいはポートマッピングを永続的に無効化する。
 firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
  • ゾーンの永続的なポート転送あるいはポートマッピングを問い合わせます。
 firewall-cmd --permanent [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

このコマンドは有効か否かを返しますが、出力はありません。

  • 例: sshをhomeゾーンの127.0.0.2というホストに転送する。
 firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

ダイレクトオプション

ダイレクトオプションは主にサービスやアプリケーションのためのもので、カスタムルールを追加することが出来ます。 ルールは保存されず、リロードあるいは再起動後に再投入しなければなりません。パススルーオプションの引数<args>は、対応するiptablesやip6tables、ebtablesの引数と同様です。

--directオプションは、全てのダイレクトオプションの前にある必要があります。

  • コマンドをファイアウォールに渡す。<args>はiptablesやip6tables、ebtablesのコマンドラインの引数が使えます。
 firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args>
  • <table>テーブルに<chain>チェインを追加する。
 firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain>
  • <chain>という名前のチェインを<table>テーブルから削除する。
 firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain>
  • <chain>という名前のチェインが<table>テーブルに存在するか問い合わせる。真であれば0を、偽ならば1を返す。
 firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain>

有効か否かを返します。出力はありません。

  • <table>テーブルに追加された全てのチェインを、スペースで区切って表示します。
 firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table>
  • <table>テーブルの<chain>チェインに優先度<priority>で、<args>引数と共にルールを追加する。
 firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>
  • <table>テーブルの<chain>チェインから、<args>引数と共にルールを削除する。
 firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args>
  • <table>テーブルの<chain>チェインに<args>引数を持つルールが存在するか問い合わせる。真であれば0を、偽ならば1を返す。
 firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args>

有効か否かを返します。出力はありません。

  • <table>テーブルの<chain>チェインに追加された全てのチェインを、改行で区切って表示します。
 firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>

現時点のfirewalldの機能

D-BUSインターフェース

D-BUSインターフェースはファイアウォールの状態を提供し、ファイアウォールの設定の有効化や無効化、問い合わせを可能にします。

ゾーン

ネットワークやファイアウォールのゾーンは、コネクションに用いられるインターフェースの信頼度を定義します。いくつか事前に定義されたゾーンがfirewalldによって提供されます。ゾーンの設定オプションと一般的なファイル情報は、firewalld.zone(5) manページに記載されています。

サービス

サービスはローカルポートと宛先のリストと、サービスが有効であれば自動的にロードされるファイアウォールヘルパーモジュールのリストでもあります。事前定義のサービスを利用することで、ユーザは簡単にサービスへのアクセスの有効化・無効化が行えます。サービスの設定オプションと一般的なファイル情報は、firewalld.service(5) manページに記載されています。

ICMPタイプ

Internet Control Message Protocol (ICMP)は情報とInternet Protocol (IP)のエラーメッセージの交換に使われます。ICMPタイプはfirewalldにおいて、これらのメッセージ交換の制限に用いられます。ICMPタイプの設定オプションと一般的なファイル情報は、firewalld.icmptype(5) manページに記載されています。

ダイレクトインターフェース

ダイレクトインターフェースは主にサービスやアプリケーションがファイアウォールのルールを追加するのに使われます。ルールは永続的では無いので、起動や再起動、リロードのメッセージがfirewalldからD-BUS経由で通知された後に、適用する必要があります。

ランタイム設定

ランタイム設定は永続的では無いので、リロードに対してのみ保持されます。サービスの再起動や停止、あるいはシステムの再起動後には失われます。

永続的な設定

永続的な設定は設定ファイルに保持されるため、マシンの起動やサービスのリロード・再起動に対しても保持されます。

トレイのアプレット

firewall-appletというトレイのアプレットは、ファイアウォールの状態だけでなくファイアウォールの問題をユーザに対して可視化します。firewall-configを呼び出すことで、設定変更にも用いられます。

グラフィカルな設定ツール

firewall-config設定ツールは、ファイアウォールデーモンの主要な設定ツールです。ルールを追加するサービス/アプリケーションによって扱われるダイレクトインターフェースを除く全てのファイアウォールの機能に対応します。

コマンドラインのクライアント

firewall-cmdはグラフィカルなツールの(ほとんどの)設定機能をコマンドラインで提供します。

ebtablesのサポート

ebtablesのサポートはlibvirtデーモンの要請に応えるためと、カーネルのnetfilterレベルでの、ip*tablesとebtablesの間のアクセスの問題を防止するために必要です。これらのコマンドは同じ構造にアクセスするので、同時に使うべきではありません。

/usr/lib/firewalldのデフォルト/フォールバック設定

ディレクトリにはデフォルトとフォールバックの設定が含まれ、ICMPタイプとサービス、ゾーン用にfirewalldが提供します。firewalldパッケージで提供されるファイルは、変更すべきではなく、firewalldパッケージの更新と共に失われます。追加のICMPタイプとサービス、ゾーンがパッケージによって、あるいはファイルを作成することで提供されます。

/etc/firewalldのシステム設定

システムやユーザの設定が保存され、システム管理者やfirewalldの設定インターフェースによるカスタマイズ、あるいは手動で作成されます。ファイルはデフォルトの設定ファイルを上書きします。

手動で事前に定義されたICMPタイプやゾーン、サービスの設定を変更するには、デフォルトの設定ディレクトリから対応するシステムの設定ディレクトリにファイルをコピーし、適切に変更します。

変更不可能なゾーンを上書きすることは、変更されるべきではないために出来ません。もし、デフォルトあるいはフォールバックのファイルからなるゾーンの初期値をロードする場合は、/etc/firewalldにあるファイルを<file>.oldに名前を変えて、フォールバックを再度用います。

将来的な/提案された機能

ファイアウォールの抽象化モデル

ip*tablesやebtablesのファイアウォールのルールの上に抽象化レイヤーを追加することで、ルールの追加を単純化し、より直感的にします。抽象化レイヤーはパワフルにならなければなりませんが、シンプルにするのは簡単ではありません。ファイアウォールの記述言語を開発しなければなりません。ファイアウォールのルールは固定された位置があり、アクセスの状態やポートへのアクセスポリシー、他のファイアウォールの機能に関する一般的な情報を問い合わせることが出来ます。

conntrackのサポート

Conntrackは無効化された機能のために、確立されたコネクションを切断することが出来る必要があります。ある利用法においては、コネクションを切断するのは良いことではないかもしれません:永続的な外部コネクションをの確立を制限された回数だけファイアウォールサービスが有効化する。

ユーザとの対話的モード

ユーザや管理者が有効化するファイアウォールの特別なモードです。ファイアウォールを変更するアプリケーションの全てのリクエストは、ユーザに通知され、許可あるいは拒否されます。コネクションの受付回数を指定したり、ホストやネットワーク、コネクションに制限することが出来ます。以後、通知なしに同じ動作をするように保持されます。

このモードの追加機能は、事前に選択されたサービスやポートでの直接の外部へのコネクションの試行がユーザに通知されるという、アプリケーションの初期化リクエストと同じような機能です。サービスとポートでの制限は、ユーザに送られるリクエストの総数に制限されます。

ユーザポリシーのサポート

管理者はいずれのユーザがユーザとの対話的モードを利用できるか定義し、一緒に用いられるファイアウォールの機能を制限出来ます。

ポートのメタデータ (Lennart Poetteringが提案)

ポートに独立したメタデータがあることは良いことかもしれません。現在の/etc/servicesによるポートとプロトコルの静的な割り当てモデルは、良いソリューションではなく、現在の利用方法を反映していません。アプリケーションやサービスのポートは動的なので、ポート自身が利用法を説明していません。

メタデータは、ファイアウォールのルールを簡単な形式にするために利用出来ます。いくつかの例:

 allow external access to file sharing applications or services
 allow external access to music sharing applications or services
 allow external access to all sharing applications or services
 allow external access to torrent file sharing applications or services
 allow external access to http web services

ここでのメタデータはアプリケーションに固有のものだけではなく、利用方法のグループでもあります。例えば、"all sharing"グループや"file sharing"グループは、全ての共有あるいはファイル共有のアプリケーションに該当します。例えば、torrentのファイル共有です。これらは例なので、あまり使えないかもしれません。

ファイアウォールにおいてメタデータを取得する方法が2つあり得ます:

1つめは、(カーネル空間の)netfilterに追加することです。この方法のアドバンテージは、誰でも利用可能なことですが、利用方法は限られます。ユーザやシステム固有の情報を考慮するには、カーネル空間に全て実装される必要があります。

他の方法は、ファイアウォールデーモンに追加することです。これらの抽象的なルールは、ネットワーク接続の信頼度のような情報や、ユーザによる特定の人やホストと共有する決定、管理者による共有を一切禁止するという厳しいルール、と共に用いられる可能性があります。

2つめは、新しいメタデータのグループや、ユーザ設定や管理ルールが新しいカーネルの挿入を必要としない信頼度の結合における変更といったアドバンテージを得られます。ファイアウォールデーモンに対するこの種の抽象的なルールを追加することは、より柔軟性を増します。新しいセキュリティレベルでさえ、カーネルの更新を伴わずに容易に追加出来ます。

sysctld

現時点ではきちんと適用出来るsysctlの設定が存在しません。モジュールが設定を提供していても、rc.sysinitが実行されるかモジュールが実行時にリロードされる起動時に読み込まれません。 他の例はnet.ipv4.ip_forwardです。例えば、特定のファイアウォールの設定やlibvirt、ユーザや管理者による変更で必要になります。必要になった時にのみip_forwardingを有効化する2つのアプリケーションやデーモンがあった場合、まだ有効にしようとしている他の一方に通知することなしに、それを無効にしてしまうことがあり得ます。

sysctlデーモンは設定が利用されている数を内部的に保持することで、問題を解決出来る可能性があります。無効にする、あるいは要求を反転するように変更する場合に、元の設定に戻すようなこと、です。

ファイアウォールのルール

netfilterのファイアウォールはルールの順番に影響されてしまうもので、ルールがチェインの中で固定された位置に無いことに起因します。あるルールの前に他のルールが追加されたり削除された場合、位置が変わる可能性があります。

静的なファイアウォールのモデルでは、system-config-firewall / lokkitが直接に対応する機能に限定して、ファイアウォールの変更が真新しく正しいファイアウォールの設定を生成します。他のアプリケーションが作成したファイアウォールのルールは統合されておらず、もし独自のルールファイルの機能が使われていなければsystem-config-firewall / lokkitが知らないことになります。デフォルトチェインが使われ、他に影響を与えずにルールを追加したり削除する安全な方法がありません。

動的なモデルではファイアウォールの機能の追加のチェインがあります。これらの特定のチェインは定義された順番に呼ばれ、チェインに追加されたルールは、チェインにある先に呼ばれたrejectやdropのルールに影響しません。これにより、より正しいファイアウォールの設定が可能になります。

以下のルールの例は、sshとipp-client、mdnsをpublicゾーンで有効にしたフィルタのテーブルがデーモンによって作成されたもので、他のゾーンは簡略化のために削除され出力が短くなっています。

 *filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]
 :FORWARD_ZONES - [0:0]
 :FORWARD_direct - [0:0]
 :INPUT_ZONES - [0:0]
 :INPUT_direct - [0:0]
 :IN_ZONE_public - [0:0]
 :IN_ZONE_public_allow - [0:0]
 :IN_ZONE_public_deny - [0:0]
 :OUTPUT_direct - [0:0]
 -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 -A INPUT -i lo -j ACCEPT
 -A INPUT -j INPUT_direct
 -A INPUT -j INPUT_ZONES
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 -A FORWARD -i lo -j ACCEPT
 -A FORWARD -j FORWARD_direct
 -A FORWARD -j FORWARD_ZONES
 -A FORWARD -p icmp -j ACCEPT
 -A FORWARD -j REJECT --reject-with icmp-host-prohibited
 -A OUTPUT -j OUTPUT_direct
 -A IN_ZONE_public -j IN_ZONE_public_deny
 -A IN_ZONE_public -j IN_ZONE_public_allow
 -A IN_ZONE_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
 -A IN_ZONE_public_allow -d 224.0.0.251/32 -p udp -m udp --dport 5353 -m conntrack --ctstate NEW -j ACCEPT
 -A IN_ZONE_public_allow -p udp -m udp --dport 631 -m conntrack --ctstate NEW -j ACCEPT

用いられているのはdeby/allowモデルで、わかりやすい動作をする他のルールに影響しない最良のものです。例えば、ICMPのブロックはIN_ZONE_public_denyチェインに行きますが、publicゾーンの指定がIN_ZONE_public_allowチェインにあるルールの前に扱われるからです。

このモデルでは他のブロックからのacceptやdropのルールに影響を与えずに特定のブロックにルールを追加・削除することが容易です。