【Linux】firewall-cmdの設定とオプション一覧 ~rich-rule等ルール追加や設定ファイル, 設定初期化, targetの意味, serviceの定義~ | SEの道標
Linux基礎

【Linux】firewall-cmdの設定とオプション一覧 ~rich-rule等ルール追加や設定ファイル, 設定初期化, targetの意味, serviceの定義~

firewalld のコマンドの使い方まとめ

(デフォルトのZoneである)Publicの設定状態を表示する

# firewall-cmd --list-all

サービスを即時に削除する

# firewall-cmd --remove-service=dhcpv6-client

この場合、即座に設定が反映されますが、OS 再起動等の reload 時に設定が戻ってしまいます。

設定が戻らないようにするには --permanent を付け加えます。

サービスを恒久的に削除する

# firewall-cmd --permanent --remove-service=dhcpv6-client

この場合だと設定は恒久的に残りますが、即座には反映されません。reload 等が必要です。

firewalld を reload する

# firewall-cmd --reload

通常の reload だと、通信中のセッションは通信が継続できます。なので例えば ssh の許可ルールを外したにも関わらず、既存 ssh セッションは残ります。

これを強制的に切りたいときは以下コマンドを使います。

# firewall-cmd --complete-reload

複数のサービスを削除する

複数のサービスを一行で削除するには、bash の brace 展開で対応します。(firewalld の設定としては無いようです。)

# firewall-cmd --remove-service={dhcpv6-client,cockpit} --permanent

サービスを追加する

# firewall-cmd --add-service=http

※後述しますが、それぞれのサービスがどの TCP/UDP ポートに対応しているのかについては /usr/lib/firewalld/services ディレクトリ配下の xml ファイルで定義されています。

ポートを削除する

# firewall-cmd --remove-port=123/udp

ポートを追加する

# firewall-cmd --add-port=80/tcp

※この設定は --add-service=http と同義です。(上記 /usr/lib/firewalld/services/http.xml に 80/tcp と定義されている。)なので両方設定する必要はありません。

rich-rule を追加する

rich-rule とは、送信元 IP やポート番号、サービスを AND 条件で 1 セットで定義できるルールのことです。シングル or ダブルクォーテーションで囲みます。

# firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.200.0/24 port port=135 protocol=tcp accept"
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.200.0/24 service name=smtp accept'

firewalld の再起動/再読み込み時に反映させる

前述していますが、サーバ再起動や firewalld reload 時に恒久的に反映させるためには、コマンドのどこかに --permanent を入れます(前でも後でも良い)

# firewall-cmd --permanent --add-port=123/udp
# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.200.0/24 port port=135 protocol=tcp accept' --permanent

firewalld の初期化方法

--permanent を付けて設定した内容は、以下の設定ファイルに書き込まれます。

/etc/firewalld/zones/public.xml

設定ファイルに書き込むだけなので、再起動/再読込時には反映されますが、既存稼働中プロセスには反映しません。

firewalld を初期化したいときは上記 xml ファイルを削除もしくは mv で退避すれば OK です。元ネタは /usr/lib/firewalld/zones にあるから大丈夫。

[root@localhost zones]# pwd
/usr/lib/firewalld/zones
[root@localhost zones]# cat public.xml
<?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"/>
</zone>
[root@localhost zones]#

/etc/firewalld/zones/public.xml のファイルを削除して --reload すると上記元ネタから読み込んできます。次回--permanent設定をすると、/etc/firewalld/zones に pulic.xml が新たに生成されます。

firewall-cmd --list-all で表示されるパラメータの意味

target: { default , ACCEPT , DROP , REJECT }

default ⇒ Zoneによって以下3つのいずれかになる。publicの場合はREJECTの動作になる。

ACCEPT ⇒ 全てを許可するようになる。

DROP ⇒ 拒否ルールに引っ掛かった通信はルール通り拒否し、何も返さない。

REJECT ⇒ 拒否ルールに引っ掛かった通信はルール通り拒否し、ICMP の Type 3(Destination Unreachable) の Code 10 ( Host administratively prohibited) を返す。

DROPとREJECTの違いは、上記のようにICMPのエラーコードを返すか返さないかです。

icmp-block-inversion: { yes , no }

yes ⇒ icmp-blocks に記載されたICMP Typeを受け入れ、記載されていないICMP Type を拒否するようになる。つまり、逆の動作になる。

no ⇒ icmp-blocks に記載された ICMP Type を拒否する。通常の動作。

これは一時的にデバッグを行うときのために使うものです。

interfaces: { 該当インタフェース }

そのゾーンに属するインタフェースです。

sources: { IP or NW address }

送信元IPもしくはNWアドレス単位で全てを許可したい場合はここで指定します。

sources: 192.168.100.0/24 等と記載されます。

services: { サービスタイプ }

サービス単位で (送信元 IP 等に依らず) 許可したい場合はここで指定します。使えるサービスタイプ文字列は、firewall-cmd --get-services で確認できますが、ポート情報がありません。各サービスの定義情報を見たいときは /usr/lib/firewalld/services/ 配下の xml ファイルを見ます。以下は rsync の例です。tcp および udp の 873 番が定義されています。

[root@localhost services]# pwd
/usr/lib/firewalld/services
[root@localhost services]# cat rsyncd.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Rsync in daemon mode</short>
<description>Rsync in daemon mode works as a central server, in order to house centralized files and keep them synchronized.</description>
<port protocol="tcp" port="873"/>
<port protocol="udp" port="873"/>
</service>
[root@localhost services]#

ports: { ポート/プロトコル }

ポート単位で(送信元IP等に依らず)許可したい場合はここで指定します。サービスと使い分ける意味はあまりありません。

ports: 80/tcp 等と記載されます。

protocols: { プロトコル }

プロトコル単位で(送信元IP等に依らず)許可したい場合はここで指定します。TCP や UDP, ICMP, OSPF 等が入れられます。

protocols: tcp udp icmp ospf 等と記載されます。

masquerade: { yes , no }

NAPT を掛けるかどうかを決めます。カーネルでルーティングを有効にした場合や、firewalld のポートフォワードの機能を使う際に使うことができます。

firewall-cmd --add-masqueradeyes に、firewall-cmd --remove-masqueradeno に設定できます。

forward-ports: { port=待受ポート:proto=プロトコル:toport=変換後ポート:toaddr=変換後IPアドレス }

待ち受けポートおよびプロトコルの通信を受信した場合に、ポートおよび送信元IPアドレスを変換してルーティングを行います。

forward-ports: port=8080:proto=tcp:toport=80:toaddr=192.168.1.1 等と記載されます。

source-ports: { ポート/プロトコル }

送信元ポート番号で(送信元IP等に依らず)許可したい場合はここで指定します。

source-ports: 50000/tcp 等と記載されます。

icmp-blocks: { ICMP Type }

送られてきたときに拒否するICMPのタイプを指定します。ICMP タイプは firewall-cmd --get-icmptypes で確認できますが定義情報を見たいときは /usr/lib/firewalld/icmptypes の .xml ファイルを確認します。以下は redirect の例です。

[root@localhost icmptypes]# pwd
/usr/lib/firewalld/icmptypes
[root@localhost icmptypes]# cat redirect.xml
<?xml version="1.0" encoding="utf-8"?>
<icmptype>
<short>Redirect</short>
<description>This error message informs a host to send packets on another route.</description>
</icmptype>
[root@localhost icmptypes]#

rich-rules: {rich rule}

細かいルールを指定します。例えば送信元IPが192.168.200.0/24 からの TCP 135 番ポートを許可する場合は以下のように指定します。

# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.200.0/24 port port=135 protocol=tcp accept'

zoneについて

zone とは、いわゆるゾーンベースポリシーファイアウォールの概念のゾーンと同じ意味で、インタフェースをカテゴリ分けして、設定する数をインタフェースの数ではなくゾーンの数に減らし、管理を簡素化する概念です。

firewalld で全ての zone の設定を確認するには、以下コマンドを打ちます。

# firewall-cmd --list-all-zones

特定の zone (例えば external) だけの設定を確認するには、以下コマンドを打ちます。

# firewall-cmd -list-all --zone=external

interface の Zone は NetworkManager により管理されているため、変更するには nmcli コマンドを使います。以下は ens33 のインタフェースのゾーンを internal に変更する場合の例です。

[root@localhost ~]# nmcli con show ens33 | grep zone
connection.zone: public
[root@localhost ~]# nmcli con mod ens33 connection.zone internal
[root@localhost ~]# nmcli con show ens33 | grep zone
connection.zone: internal

コメント

タイトルとURLをコピーしました