Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

5.15. リッチランゲージ構文を使用した複雑なファイアウォールルールの設定

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

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

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

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
ルールファミリー( ipv4 または ipv6 のいずれか)を指定すると、ルールがそれぞれ IPv4 または IPv6 に制限されます。ルールファミリーが指定されていない場合は、IPv4IPv6 の両方にルールが追加されます。ルールで送信元アドレスまたは宛先アドレスが使用されている場合は、ルールファミリーを提供する必要があります。これは、ポートフォワーディングにも当てはまります。

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

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

要素

要素には、service、port、プロトコルmasqueradeicmp-blockforward-port 、および source-portいずれかのタイプのみ を使用できます。
service
service 要素は、firewalld が提供するサービスの 1 つです。定義済みサービスの一覧を取得するには、次のコマンドを入力します。
~]$ firewall-cmd --get-services
サービスが宛先アドレスを提供する場合、ルール内の宛先アドレスと競合し、エラーが発生します。内部で宛先アドレスを使用するサービスは、ほとんどがマルチキャストを使用するサービスである。コマンドは以下の形式になります。
service name=service_name
port
port 要素には、単一のポート番号またはポート範囲(例:5060- 50 62)と、その後に tcp または udp などのプロトコルを使用できます。コマンドは以下の形式になります。
port port=number_or_range protocol=protocol
protocol
protocol 値は、プロトコル ID 番号またはプロトコル名のいずれかになります。許可される プロトコル エントリーについては、/etc/protocols を参照してください。コマンドは以下の形式になります。
protocol value=protocol_name_or_ID
icmp-block
このコマンドを使用して、1 つ以上の ICMP タイプをブロックします。ICMP タイプは、firewalld がサポートする ICMP タイプの 1 つです。サポートされている ICMP タイプの一覧を取得するには、次のコマンドを入力します。
~]$ firewall-cmd --get-icmptypes
ここではアクションの特定はできません。icmp-block はアクション reject を内部で使用します。コマンドは以下の形式になります。
icmp-block name=icmptype_name
masquerade
ルール内の IP マスカレードを有効にします。マスカレードをこのエリアに限定するために送信元アドレスを指定できますが、宛先アドレスは指定できません。ここではアクションの特定はできません。
forward-port
プロトコルが tcp または udp として指定されたローカルポートから、ローカルにある別のポート、別のマシン、または別のマシンの別のポートにパケットを転送します。portto-port は、単一のポート番号またはポート範囲のいずれかになります。宛先アドレスは、単純な 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 要素は、単一のポート番号またはポート範囲(例: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
でロギングを制限することができます。レートは自然な正の数 [1, ..] で、期間は smhd です。s は秒、m は分、h は時間、d 日を意味します。最大制限値は 1/d です。これは、1 日あたり最大 1 つのログエントリーを意味します。
audit
Audit は、サービス auditd に送信される監査レコードを使用してロギングを行う別の方法を提供します。監査タイプは ACCEPTREJECT、または DROP のいずれかにすることができますが、ルールアクションから自動的に 監査 タイプを収集するため、コマンド 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 ルールは ゾーン_deny チェーンに置かれ、ログチェーンの後に解析されます。すべての accept ルールは ゾーン_allow チェーンに置かれ、deny チェーンの後に解析されます。ルールに log が含まれ、deny または allow アクションも含まれる場合、これらのアクションを指定するルールの一部は一致するチェーンに配置されます。

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

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

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

プロトコル FTP の新しい IPv4 および IPv6 接続を許可し、監査を使用して 1 分あたり 1 回ログに記録します。
rule service name="ftp" log limit value="1/m" audit accept

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

プロトコル TFTP のアドレス 192.168.0.0/24 からの新しい IPv4 接続を許可し、syslog を使用して 1 分あたり 1 回ログに記録します。
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

プロトコル RADIUS1: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
その他の例は、firewalld.richlanguage (5) の man ページを参照してください。