5.15. 「リッチ言語」構文を使用した複雑なファイアウォールルールの設定

リッチ言語 構文を使用すると、ダイレクトインターフェースよりも理解しやすい方法で複雑なファイアウォールルールが作成できます。さらに、設定を永続的にできます。この言語は値の付いたキーワードを使用するもので、iptables ルールの抽象表現です。ゾーンはこの言語を使用して設定でき、現行の設定方式もそのままサポートされます。

5.15.1. リッチ言語コマンドの形式

このセクションのコマンドはすべて root で実行する必要があります。ルールを追加するコマンド形式は以下のとおりです。
firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=timeval]
これでリッチ言語ルール (rule) がゾーン (zone) に追加されます。このオプションは複数回指定できます。ゾーンを省略すると、デフォルトのゾーンが使用されます。タイムアウトが指定されていれば、ルールは指定した秒数の間だけアクティブになり、その後自動的に削除されます。時間の値の後に時間の単位 s (秒)、m (分) または h (時間) を追加できます。デフォルトは秒です。
ルールの削除
firewall-cmd [--zone=zone] --remove-rich-rule='rule'
これでゾーン (zone) のリッチ言語のルール (rule) が削除されます。このオプションは複数回指定できます。ゾーンが省略されると、デフォルトのゾーンが使用されます。
ルールが存在するかの確認
firewall-cmd [--zone=zone] --query-rich-rule='rule'
このコマンドは、リッチ言語ルールの rule がゾーン zone に追加されたかどうかを返します。有効な場合は終了ステータスが 0yes が出力され、無効の場合は終了ステータスが 1no が出力されます。ゾーンを省略すると、デフォルトのゾーンが使用されます。
ゾーン設定ファイルで使用されるリッチ言語表現に関する詳細は、man ページの firewalld.zone(5) を参照してください。

5.15.2. リッチルールの構造について

リッチルールコマンドの形式または構造は、以下のようになります。
rule [family="rule family"]
    [ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ]
    [ destination [NOT] address="address" ]
    [ element ]
    [ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ]
    [ audit ]
    [ action ]

注記

このファイルにおけるリッチルールの構造は、ソースおよび宛先アドレスのコマンドの意味を反転させる NOT キーワードを使用しています。ただし、コマンドラインは invert="true" オプションを使用します。
ルールは特定のゾーンに関連付けられます。ゾーンには複数のルールを関連付けることができます。いくつかのルールが相互に作用する、または矛盾する場合は、パケットに適合する最初のルールが適用されます。

5.15.3. リッチルールのコマンドオプションについて

family
ルールのファミリーを指定している場合は、ipv4ipv6 になり、ルールを IPv4 または IPv6 に制限します。ルールのファミリーを使用しないと、ルールが IPv4IPv6 の両方に追加されます。ルール内でソースまたは宛先のアドレスを使用している場合は、ルールのファイミリーを提供する必要があります。これは、ポート転送の場合でも同じです。

ソースアドレスおよび宛先のアドレス

source
ソースのアドレスを指定すると、接続試行の元を指定したソースアドレスに限定できます。ソースアドレスまたはアドレスの範囲は、IPv4 または IPv6 のマスクを伴う IP アドレスかネットワーク IP アドレスになります。IPv4 のマスクは、ネットワークマスクまたは単純な番号になります。IPv6 のマスクは単純な番号になります。ホスト名の使用はサポートされていません。NOT キーワードを追加すると、ソースアドレスコマンドの意味が逆になり、提供されたアドレス以外のものがマッチすることになります。
そのルールに family が指定されていない場合は、MAC アドレスと、hash:mac を持つ IP セットを、IPv4 および IPv6 に追加できます。その他の IP は、ルールの family 設定に一致させる必要があります。
destination
宛先のアドレスを指定すると、ターゲットを指定した宛先アドレスに限定できます。宛先アドレスでは、IP アドレスまたはアドレス範囲のソースアドレスと同様の構文を使用します。ソースアドレスおよび宛先アドレスの使用はオプションで、宛先アドレスをすべての要素とともに使用できるわけではありません。これは、サービスエントリーにおける宛先アドレスの使用などによって異なります。destinationaction は組み合わせることができます。

要素

要素は、要素タイプ serviceportprotocolmasqueradeicmp-blockforward-port、および source-port に対して 1 つだけ になります。
service
service 要素は、firewalld が提供したサービスのひとつです。事前定義したサービスの一覧を取得するには、以下のコマンドを実行します。
~]$ firewall-cmd --get-services
サービスが宛先アドレスを提供する場合、ルール内の宛先アドレスと競合し、エラーが発生します。内部で宛先アドレスを使用するサービスのほとんどは、マルチキャストを使用するサービスです。コマンドは以下の形式になります。
service name=service_name
port
port 要素は、1 つのポート番号またはポート範囲 (5060-5062 など) のいずれかの後にプロトコル (tcp または udp のいずれか) が続きます。コマンドは以下の形式になります。
port port=number_or_range protocol=protocol
protocol
protocol 値は、プロトコル ID 番号またはプロトコル名となります。許可されている protocol エントリーは /etc/protocols を参照してください。コマンドは以下の形式になります。
protocol value=protocol_name_or_ID
icmp-block
1 つ以上の 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 は、1 つのポート番号もしくはポート範囲のどちらでも構いません。宛先アドレスは、単純な IP アドレスになります。ここではアクションの特定はできません。forward-port コマンドは、accept のアクションを内部で使用します。コマンドは以下の形式になります。
forward-port port=number_or_range protocol=protocol /
            to-port=number_or_range to-addr=address
source-port
パケットのソースポートに一致します。そのポートは、接続試行の発信元として使用されます。現在のマシンのポートに一致させる場合は、port 要素を使用します。source-port 要素は、1 つのポート番号またはポート範囲 (たとえば 5060-5062) のいずれかの後にプロトコル (tcp または udp のいずれか) が続きます。コマンドは以下の形式になります。
source-port port=number_or_range protocol=protocol

ロギング

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|mark
アクションは、acceptrejectdrop、または mark のいずれかに設定できます。このルールには、要素またはソースのいずれかにすることができます。要素と一致する新しい接続は、そのアクションで処理されます。ルールにソースが含まれ、ソースアドレスからのものはすべて指定したアクションで処理されます。
accept | reject [type=reject type] | drop | mark set="mark[/mask]"
accept アクションを使用すると、新たな接続試行がすべて許可されます。reject を使用するとそれは拒否され、そのソースは拒否メッセージを受け取ります。拒否のタイプは、別の値を使用するように設定できます。drop を使用すると、すべてのパケットが即座に破棄され、ソースには何も情報が送られません。mark を使用すると、すべてのパケットには、指定した mark と、オプションの mask でマークされます。

5.15.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 アクションが含まれる場合、これらのアクションを指定しているルールの一部は、一致するチェーンに置かれます。

5.15.4.1. リッチルールログコマンドの使用例 1

認証ヘッダープロトコル AH 用に新たな IPv4 接続および IPv6 接続を有効にします。
rule protocol value="ah" accept

5.15.4.2. リッチルールログコマンドの使用例 2

プロトコル FTP および audit を使用した 1 分あたり 1 件のログ用に新たな IPv4 および IPv6 接続を許可します :
rule service name="ftp" log limit value="1/m" audit accept

5.15.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

5.15.4.4. リッチルールログコマンドの使用例 4

プロトコル RADIUS 用の 1:2:3:4:6:: からの新たな IPv6 接続はすべて拒否され、1 分あたり 3 件のログが作成されます。その他のソースからの新たな 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

5.15.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"

5.15.4.6. リッチルールログコマンドの使用例 6

ソースアドレスをホワイトリスト化してそのソースからの接続をすべて許可します。
rule family="ipv4" source address="192.168.2.2" accept
その他の例は、man ページの firewalld.richlanguage(5) を参照してください。