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に制限されます。ルールファミリーが指定されていない場合は、IPv4とIPv6の両方にルールが追加されます。ルールで送信元アドレスまたは宛先アドレスが使用されている場合は、ルールファミリーを提供する必要があります。これは、ポートフォワーディングにも当てはまります。
ソースアドレスおよび宛先のアドレス
source- 送信元アドレスを指定することにより、接続試行の発信元を送信元アドレスに制限できます。ソースアドレスまたはアドレス範囲は、
IPv4またはIPv6のマスクを持つ IP アドレスまたはネットワーク IP アドレスのいずれかです。IPv4の場合、マスクはネットワークマスクまたは単純な番号になります。IPv6の場合、マスクは単純な番号です。ホスト名の使用はサポートされていません。NOTキーワードを追加することで、source address コマンドの意味を反転させることができます。指定されたアドレス以外はすべて一致します。ルールにファミリーが指定されていない場合は、IPv4およびIPv6に MAC アドレスと タイプの IP セットを追加できます。他の IP セットは、ルールのfamily設定と一致する必要があります。 destination- 宛先アドレスを指定することにより、ターゲットを宛先アドレスに限定することができます。宛先アドレスは、IP アドレスまたはアドレス範囲の送信元アドレスと同じ構文を使用します。送信元アドレスと宛先アドレスの使用はオプションであり、すべての要素で宛先アドレスを使用できるわけではありません。これは、たとえば、サービスエントリーでの宛先アドレスの使用によって異なります。
destinationとactionを組み合わせることができます。
要素
要素には、
service、port、プロトコル、masquerade、icmp-block、forward-port 、および source-port の いずれかのタイプのみ を使用できます。
serviceservice要素は、firewalld が提供するサービスの 1 つです。定義済みサービスの一覧を取得するには、次のコマンドを入力します。サービスが宛先アドレスを提供する場合、ルール内の宛先アドレスと競合し、エラーが発生します。内部で宛先アドレスを使用するサービスは、ほとんどがマルチキャストを使用するサービスである。コマンドは以下の形式になります。~]$ firewall-cmd --get-servicesservice name=service_nameportport要素には、単一のポート番号またはポート範囲(例:5060-5062)と、その後にtcpまたはudpなどのプロトコルを使用できます。コマンドは以下の形式になります。port port=number_or_range protocol=protocolprotocolprotocol値は、プロトコル ID 番号またはプロトコル名のいずれかになります。許可されるプロトコルエントリーについては、/etc/protocolsを参照してください。コマンドは以下の形式になります。protocol value=protocol_name_or_IDicmp-block- このコマンドを使用して、1 つ以上の
ICMPタイプをブロックします。ICMPタイプは、firewalld がサポートするICMPタイプの 1 つです。サポートされているICMPタイプの一覧を取得するには、次のコマンドを入力します。ここではアクションの特定はできません。icmp-block はアクション~]$ firewall-cmd --get-icmptypesrejectを内部で使用します。コマンドは以下の形式になります。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 source-port- パケットのソースポート、つまり接続を試みる際の発信元で使用されるポートに一致します。現在のマシンのポートに一致させるには、
port要素を使用します。source-port要素は、単一のポート番号またはポート範囲(例:5060-5062)のいずれかで、その後にtcpまたはudpとしてプロトコルを指定できます。コマンドは以下の形式になります。source-port port=number_or_range protocol=protocol
ロギング
log- カーネルロギングを使用して、ルールへの新しい接続試行を syslog などに記録します。ログメッセージに接頭辞として追加される接頭辞テキストを定義できます。ログレベルは、
emerg、alert、crit、error、warning、notice、info、またはdebugのいずれかです。ログの使用はオプションです。でロギングを制限することができます。レートは自然な正の数 [1, ..] で、期間はlog [prefix=prefix text] [level=log level] limit value=rate/durations、m、h、dです。sは秒、mは分、hは時間、d日を意味します。最大制限値は1/dです。これは、1 日あたり最大 1 つのログエントリーを意味します。 audit- Audit は、サービス
auditdに送信される監査レコードを使用してロギングを行う別の方法を提供します。監査タイプはACCEPT、REJECT、またはDROPのいずれかにすることができますが、ルールアクションから自動的に 監査 タイプを収集するため、コマンド audit の後に指定されません。監査には独自のパラメーターはありませんが、オプションで制限を追加できます。監査の使用はオプションになります。
アクション
accept|reject|drop|mark- アクションは、
accept、reject、drop、または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 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
プロトコル
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
その他の例は、
firewalld.richlanguage (5) の man ページを参照してください。