CentOS 8のfirewalldでdirectルールがうまく動作しなかった

CentOS 7を使い始めた頃、firewalldではdirectルールに設定を書いていた。

zoneの考え方に慣れず、以前のように iptables ライクに設定を書くことができるため、作法が良くないのかもしれないが、そんな使い方をしていた。

DNATやOUTPUTに関する設定も必要だった時もあり、directルールに書く事は少なくなかった。


CenOS 8がリリースされ、同じようにdirectルールを設定をしても、うまく動作しない。

おかしい、、、iptables コマンドでは確かにINPUTでWebサーバのポートが許可されているのに。

directルールに記載したものは、zoneより先に判定されると思っていた。

困ったので、気休めにRHEL 8のリリースノートを見ていると、

iptables に代わり、nftables フレームワークが、デフォルトのネットワークパケットフィルタリング機能を提供します。

firewalld デーモンで、デフォルトのバックエンドとして nftables が使用されるようになりました。

これか!?

バックエンドは、nftables から従来の iptables へ変更もできる模様。

$ cat /etc/firewalld/firewalld.conf
・
・略
# FirewallBackend
# Selects the firewall backend implementation.
# Choices are:
#       - nftables (default)
#       - iptables (iptables, ip6tables, ebtables and ipset)
FirewallBackend=nftables    ←ここを iptables にするとCentOS 7の頃と同じ

上記を変更して、firewalld サービスを再起動すると、CentOS 7 の時と同じ動作になりました。


デフォルトの nftables をバックエンドに利用する場合については、勉強しないとダメかー(´・ω・`)

iptablesのルールをnftables のへ変換できるって記事も見たことあるなぁ(´・ω・`)
40.3. iptables のルールを nftables ルールに変換 Red Hat Enterprise Linux 8 | Red Hat Customer Portal



nft list ~ というコマンドで確認すると思われるけど、従来のdirectルールがどこに書き込まれるとか、分からない事が色々ある。

# nft list ruleset

と打っても、「chain INPUT」に追加されるようで、動作的にzoneの後に判定されているように思えた。

なので、nftables をバックエンドにしていると、従来のようにdirectルールを書いても、zoneの方でも許可しないと動かなかった。

この辺、優先順が良く分からず。

ドキュメントもなかなか見つからず(´・ω・`)
とりあえずバックエンドを従来の iptables にして凌いでる。
(でも非推奨なんでしょうね、、、)


【2020/10/10 追記】
以下の公式ドキュメントに手掛かりがありそう。
firewalld.org

環境は以下の通り。これより前のCentOS 8.0-8.1では未確認。

$ cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)

$ rpm -qa | grep firewalld
firewalld-filesystem-0.8.0-4.el8.noarch
firewalld-0.8.0-4.el8.noarch