【firewalld(firewall-cmd)】使い方一覧 〜rich-rule や設定ファイル, 設定初期化, targetの意味, serviceの定義〜

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

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

firewall-cmd --list-all

サービスを削除する

firewall-cmd --remove-service=dhcpv6-client
--permanent を付ければ firewalld 再起動/再読み込み時に反映、付けなければ即時反映しますが再起動/再読み込み時には元に戻ります。

サービスを追加する

firewall-cmd --add-service=rsyncd

ポートを削除する

firewall-cmd --remove-port=80/tcp

ポートを追加する

firewall-cmd --add-port=123/udp

rich-rule を追加する

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 の再読み込み

firewall-cmd --reload

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

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

firewall-cmd --complete-reload

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"/>
</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 等と記載されます。

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

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

sourceports: 50000/tcp 等と記載されます。

コマンドは何故か firewall-cmd --add-source-port=50000/tcp と、source と port の間にハイフンが必要です。

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

シェアする

  • このエントリーをはてなブックマークに追加

フォローする