1 はじめに
firewalldのリッチルールをコマンドで入力するのは、
どうしても文字列が長くなってしまいがちで面倒です。
firewalldの永続的な設定情報は、XML形式のファイルとして保存されています。
このファイルを直接編集した方がコマンド入力よりも楽なので、
新しいルールの設定や古いルールの削除は、
既にあるルールを参考にしてXMLファイルを直接編集していました。
機会あってfirewalldのリッチルールを詳しく調べることになりましたので、
ついでにXMLファイルの構成についても整理してみました。
本記事は、それらをまとめたものとなります。
2 XML形式のfirewalld設定ファイル
firewalldの”firewall-cmd”、”firewall-config”GUI設定ツールで永続的として設定した内容は、
firewalldゾーン設定ファイル、もしくはfirewalldゾーン構成ファイルと呼ばれる
XML形式のファイルとして保存されます。
設定内容によっては、
XML形式のファイルを直接編集した方が、コマンドやツールで設定するよりもはるかに簡単です。
本章では、firewalldゾーン設定ファイルの構成について説明します。
本章の内容は、下に示すページの内容に基づいています
(DeepL
を利用して翻訳していますが、和訳全文を採用しているわけではありません)。
2.1 firewalldゾーン設定ファイル
firewalldゾーン設定ファイルは、ゾーン毎に作成されゾーンの情報が含まれています。
これらには、
ゾーンの説明、サービス、ポート、プロトコル、icmp-blocks、マスカレード、
forward-ports、ゾーン内転送、リッチ言語ルールの内容が、
XML形式で書かれています。
ファイル名は”zone_name.xml”で、
zone_nameの長さは現在17文字に制限されています。
firewalldゾーン設定ファイルのパスは、下に示すようになります。
ここでfirewalldが取り扱えるゾーン全てを挙げられませんが、
よく使われるpublicゾーンのゾーン設定ファイルのパスは、次のようになります。
/etc/firewalld/zones/public.xml
下に、publicゾーンのゾーン設定ファイルの実際例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="cockpit"/> <service name="ftp"/> <service name="http"/> <service name="pop3"/> <service name="samba-client"/> <service name="samba"/> <service name="smtp"/> <port port="8080" protocol="tcp"/> <port port="8443" protocol="tcp"/> <rule family="ipv4"> <source address=" 192.0.2.0/24"/> <drop/> </rule> <rule family="ipv4"> <source address=" 198.51.100.0/24"/> <port port="25" protocol="tcp"/> <drop/> </rule> </zone> |
2.2 ゾーン設定ファイルの内部構成
本節では、ゾーン設定ファイル中に記述できる要素について、列挙説明していきます。
ZONE
ZONEタグは必須で、ゾーンを定義します。
このタグはゾーン設定ファイル内で一度だけ使用することができます。
ゾーンには、次のオプションがあります。
version="versionstring"
ゾーンにバージョンを与えます。
target="ACCEPT|%%REJECT%%|DROP"
どのルール(ポート、サービスなど)にもマッチしないすべてのパケットを
受け入れる、拒否する、またはドロップするのかを指示します。
interface
ゾーンにインターフェースをバインドするために使用することができます。
NetworkManagerはインターフェースとゾーンを自動的にバインドするので、
NetworkManagerが管理するインターフーイスにはこのタグは必要ではありません。
NetworkManager経由で管理できないインターフェースのフォールバックメカニズムとして、
これを使用することができます。
name="string"
ゾーンにバインドされるインターフェースの名前です。
source
送信元のアドレスを、
IPアドレス、IPアドレス範囲、MACアドレス、IPセットで、
ゾーンにバインドするために使用します。
address="address[/mask]"
送信元アドレスは、
IPアドレス、またはIPv4もしくはIPv6のマスクを持つネットワークIPアドレスのいずれかです。
ネットワークファミリー(IPv4/IPv6)は、自動的に検出されます。
mac="MAC"
送信元は、MACアドレスです。
XX:XX:XX:XX:XX:XXという形式である必要があります。
ipset="ipset"
送信元は、IPセットです。
icmp-block-inversion
1つのゾーン構成で、1度だけ使用することができます。
このフラグは、icmp-blockの処理を反転させます。
有効なICMPタイプだけが受け入れられ、それ以外はゾーンで拒否されます。
forward
1つのゾーン構成で1度だけ使用できます。
このフラグは、ゾーン内転送を有効にします。
有効にすると、ゾーンのターゲットがACCEPTに設定されていない場合でも、
パケットはゾーン内のインタ-フェースまたはソース間で転送されます。
short
より読みやすい名前を与えるために使用されます。
description
説明を記述します。
service
複数のサービスエントリを有効にするために、複数回使用することができます。
name="string"
有効化するサービスの名前。
有効なサービス名のリストは、「firewall-cmd --get-services」で取得することができます。
port
複数のポートエントリを持つために、複数回使用することができます。
port="portid[-portid]"
portは、
単一のポート番号(portid)か、ポート範囲(portid-portid)のいずれかにすることが
できます。
protocol="tcp|udp|sctp|dccp"
プロトコルは、tcp、udp、sctp、またはdccpのいずれかを指定します。
protocol
複数のプロトコルのエントリを持つために、複数回使用することができます。
value="string"
protocolには、システムでサポートされている任意のプロトコルを指定することができます。
サポートされているプロトコルは、”/etc/protocols”を参照してください。
icmp-block
複数のicmp-blockエントリを持つために、複数回使用することができます。
name="string"
ブロックするICMP(Internet Control Message Protocol)タイプの名前です。
有効なICMPタイプのリストは、「firewall-cmd --get-icmptypes」で取得することができます。
tcp-mss-clamp
複数回使用することができます。
空のままの場合、最大セグメントサイズは'pmtu'に設定されます。
value="string"
valueは、最大セグメントサイズを'pmtu' (Path Maximum Transmission Unit)、
または536以上のユーザー定義値に設定することができます。
masquerade
一度だけ使用することができます。
このタグが存在する場合、マスカレードが有効になります。
forward-port
複数のポートまたはパケット転送エントリを持つために、複数回使用することができます。
forward-portには、必須属性とオプション属性があります。
必須属性
転送するローカルポートおよびプロトコル。
- port="portid[-portid]"
-
ポートは、単一のポート番号(portid)またはポート範囲(portid-portid)の
いずれかになります。
- protocol="tcp|udp|sctp|dccp"
- プロトコルは、tcp、udp、sctp、またはdccpのいずれかになります。
オプション属性
転送先。
ローカル転送の場合、to-portのみを追加します。
リモート転送の場合はto-addrを追加し、
転送先マシンの転送先ポートが異なる場合はオプションでto-portを使用します。
- to-port="portid[-portid]"
-
転送する宛先ポートまたはポート範囲。
省略した場合、port=属性の値は、to-addr属性と一緒に使用されます。
- to-addr="address"
- IPv4またはIPv6のいずれかの転送先IPアドレス。
source-port
複数のソースポートエントリを持つために、複数回使用することができます。
ソースポートエントリーのすべての属性は必須です。
port="portid[-portid]"
ポートは、単一のポート番号(portid)か、ポート範囲(portid-portid)の
いずれかにすることができます。
protocol="tcp|udp|sctp|dccp"
プロトコルは、tcp、udp、sctp、またはdccpのいずれかを指定します。
2.3 ルール構造
オプションの要素タグで、
複数回使用することで複数のリッチ言語ルールエントリーを持つことができます。
一般的なルール構造を、以下に示します。
3 firewalldリッチルール
3.1 コマンド形式
本節では、rule(ルール)を追加したり削除するコマンドの書式を示します。
本節で示す全てのコマンドは、rootで実行する必要があります。
3.1.1 ルールの追加
zoneのリッチ言語ルールのruleを追加します。
このオプションは複数回指定できます。
zoneを省略すると、デフォルトのゾーンが適用されます。
timeoutを指定すると、
指定された時間だけruleが有効になり、その後は自動的に削除されます。
時間値の後に、s (秒)、m (分)、h (時) を続けて、時間の単位を指定します。
デフォルトは秒です。
3.1.2 ルールの削除
zoneのリッチ言語ルールのruleを削除します。
このオプションは複数回指定できます。
zoneを省略すると、デフォルトのゾーンが適用されます。
3.1.3 ルールの存在確認
zoneにリッチ言語ルールのruleが追加されているかどうかが返されます。
zoneを省略すると、デフォルトのゾーンが使用されます。
有効な場合は”yes”と出力され、終了ステータスは0になります。
無効の場合は”no”と出力され、終了ステータスは1になります。
3.2 リッチ言語ルール
本節では、リッチ言語ルールの形式と構造を示します。
3.2.1 コマンド書式
リッチ言語ルールの形式、および構造は次のとおりです。
1 2 3 4 5 6 7 |
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 ] |
rule(ルールは、特定のzone(ゾーン)に関連付けられます。
zoneには、複数のruleを関連付けることができます。
いくつかのruleが相互作用したり矛盾したりする場合、
パケットにマッチする最初のruleが適用されます。
3.2.2 コマンドオプション
family
ルールのfamilyに”ipv4”または”ipv6”が指定されている場合、
それぞれIPv4またはIPv6にルールを限定します。
familyを指定しない場合、IPv4とIPv6の両方がルールに追加されます。
ルールで送信元アドレスまたは宛先アドレスが使用されている場合は、
familyを提供する必要があります。
source
送信元アドレスを指定することにより、接続試行の発信元を送信元アドレスに制限できます。
送信元アドレスまたはアドレス範囲は、
IPv4またはIPv6のマスクを使用したIPアドレス、またはネットワークIPアドレスのいずれかです。
IPv4の場合、マスクはネットワークマスクか普通の数字になります。
IPv6のマスクは単純な番号になります。
ホスト名の使用はサポートされていません。
”NOT”キーワードを追加することで、
”source address”コマンドの意味を反転させることができます。
指定されたアドレス以外はすべて一致します。
ruleに”family”が指定されていない場合は、
IPv4およびIPv6にMACアドレスとhash:macタイプのIPセットを追加できます。
他のIPセットは、ルールの”family”設定と一致する必要があります。
destination
宛先アドレスを指定することにより、ターゲットを宛先アドレスに限定することができます。
宛先アドレスは、
IPアドレスまたはアドレス範囲の送信元アドレスと同じ構文を使用します。
element
”service”、”port”、”protocol”、”masquerade”、”icmp-block”、”forward-port”、
”source-port”の中から1つだけを指定します。
service
”service”要素は、firewalldが提供するサービスの1つです。
サービスが宛先アドレスを提供する場合、ルール内の宛先アドレスと競合しエラーが発生します。
内部で宛先アドレスを使用するサービスは、ほとんどがマルチキャストを使用するサービスです。
定義済みサービスの一覧は、次のコマンドで取得することができます。
port
”port”要素は、
単一のポート番号、またはポート範囲(たとえば 5060-5062)のいずれかで、
その後に、”tcp”または”udp”としてのプロトコルを続けることができます。
コマンドは、以下の形式になります。
protocol
”protocol”値は、プロトコルのID番号、またはプロトコル名のいずれかになります。
コマンドは、以下の形式になります。
許可されたprotocolエントリーについては、”/etc/protocols”を参照してください。
icmp-block
1つ以上のICMPタイプをブロックするには、このコマンドを使用します。
ここではアクションの特定はできません。
”icmp-block”は、アクション”reject”を内部的に使用します。
コマンドは、以下の形式になります。
ICMPタイプは、firewalldがサポートするICMPタイプの1つです。
サポートされているICMPタイプの一覧は、次のコマンドで取得することができます。
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”としてのプロトコルを続けることができます。
コマンドは、以下の形式になります。
ロギング/log
カーネルロギングを使用して、ルールへの新しい接続試行をsyslogなどに記録します。
ログの使用はオプションです。
ログメッセージに接頭辞として追加される接頭辞テキストを定義できます。
ログレベルは、
”emerg”、”alert”、”crit”、”error”、”warning”、”notice”、”info”、または”debug”
のいずれかになります。
ロギングを制限することが可能です。
rateは自然な正の数 [1, ...]で、期間はs、m、h、dです。
sは秒、mは分、hは時間、dは日数を意味します。
最大制限値は1/dで、これは1日に最大1つのログエントリーを意味します。
ロギング/audit
”audit”は、
サービス”auditd”に送られる監査記録を使ってログに記録する別の方法を提供します。
”audit”の使用は、オプションになります。
監査タイプは ”ACCEPT”、”REJECT”、”DROP” のいずれかですが、
ルールアクションから自動的に監査タイプが収集されるため、
コマンド”audit”後に指定されません。
監査には独自のパラメーターはありませんが、オプションで制限を追加できます。
アクション accept | reject | drop | mark
アクションは、”accept”、”reject”、”drop”、または ”mark”のいずれかになります。
ルールは、”element”または”source”にのみ含むことができます。
ルールが”element”に含まれる場合、
その要素に一致する新しい接続は、アクションで処理されます。
ルールが”source”に含まれている場合、
送信元アドレスからのすべてが指定されたアクションで処理されます。
”accept”を指定すると、すべての新しい接続試行が許可されます。
”reject”を指定すると、それらは拒否され、
そのソースには拒否メッセージが表示されます。
拒否タイプは、他の値を使用するように設定することができます。
”drop”を指定すると、
すべてのパケットが直ちにドロップされ、ソースには何も情報が送られません。
”mark”を指定すると、
すべてのパケットは、指定された”mark”とオプションの”mask”でマークされます。
3.3 設定の反映
3.3.1 firewalld設定ファイルのreload
firewalldの新しい設定はreloadすれば、
通信中のセッションを継続したまま、新しいルールを適用することができます。
3.3.2 現在有効リッチルールの確認
現在有効なリッチルールは、”—list-rich-rules”オプションで確認することができます。
たとえば現在ゾーンが”public”であれば、コマンドは次のようになります。
結果は、図3.3-1に示すように表示されます。
以上
HTMLだと、
思うように編集することは難しく、やろうすればとっても時間が掛かります。
ですので、本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。
役に立てていただければ、うれしく思います。
このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元と著者名は明らかにしてください。
なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。