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
に制限されます。ルールファミリーが指定されていない場合は、IPv4
とIPv6
の両方にルールが追加されます。ルールで送信元アドレスまたは宛先アドレスが使用されている場合は、ルールファミリーを提供する必要があります。これは、ポートフォワーディングにも当てはまります。
ソースアドレスおよび宛先のアドレス
source
- 送信元アドレスを指定することにより、接続試行の発信元を送信元アドレスに制限できます。ソースアドレスまたはアドレス範囲は、
IPv4
またはIPv6
のマスクを持つ IP アドレスまたはネットワーク IP アドレスのいずれかです。IPv4
の場合、マスクはネットワークマスクまたは単純な番号になります。IPv6
の場合、マスクは単純な番号です。ホスト名の使用はサポートされていません。NOT
キーワードを追加することで、source address コマンドの意味を反転させることができます。指定されたアドレス以外はすべて一致します。ルールにファミリー
が指定されていない場合は、IPv4
およびIPv6
に MAC アドレスと hash:mac タイプの IP セットを追加できます。他の IP セットは、ルールのfamily
設定と一致する必要があります。 destination
- 宛先アドレスを指定することにより、ターゲットを宛先アドレスに限定することができます。宛先アドレスは、IP アドレスまたはアドレス範囲の送信元アドレスと同じ構文を使用します。送信元アドレスと宛先アドレスの使用はオプションであり、すべての要素で宛先アドレスを使用できるわけではありません。これは、たとえば、サービスエントリーでの宛先アドレスの使用によって異なります。
destination
とaction
を組み合わせることができます。
要素
要素には、
service
、port、プロトコル
、masquerade
、icmp-block
、forward-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
として指定されたローカルポートから、ローカルにある別のポート、別のマシン、または別のマシンの別のポートにパケットを転送します。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
のいずれかです。ログの使用はオプションです。log [prefix=prefix text] [level=log level] limit value=rate/duration
でロギングを制限することができます。レートは自然な正の数 [1, ..] で、期間はs
、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 ページを参照してください。