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 を付けて設定した内容は、以下の設定ファイルに書き込まれます。
設定ファイルに書き込むだけなので、再起動/再読込時には反映されますが、既存稼働中プロセスには反映しません。
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-masquerade で yes に、firewall-cmd --remove-masquerade で no に設定できます。
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
コメント