CentOS 8/Redhat EL 8のfirewalldでftpのpassive接続を動的に許可するには

日付 2020.01.09
タイトル CentOS 8/Redhat EL 8のfirewalldでftpのpassive接続を動的に許可するには
本文
CentOS 8インストールのデフォルト状態で

firewall-cmd --add-service=ftp [--permanent]
(あるいは --add-rich-rule、--direct --add-rule)

を行ってもコネクショントラッキングが行われないため、FTPをpassiveモードで接続すると一覧表示の段階で停止してしまいます。

ftp側の設定を
/etc/vsftpd/vsftpd.conf
-----
pasv_min_port=xxxx
pasv_max_port=yyyy
-----
などとして、
-----
firewall-cmd --add-rich-rule="rule ipv4 port protocol=tcp port=xxxx-yyyy [... 他IPアドレス制限など] accept"
-----
のようにfirewalldで予めxxxx-yyyyの穴を開けておく方法もありますがこれだと不用意にポートを開ける必要が有りあまりよろしくないため、予め穴を空けない方法があるのか模索しました。

結果、起動直後の状態が
-----
cat /proc/sys/net/netfilter/nf_contrack_helper
0
-----
の場合、 以下のようにするとコネクショントラッキングが有効になるようでした。

firewall-cmd --set-automatic-helpers=yes
(または
/etc/firewalld/firewalld.conf
-----
AutomaticHelper = yes
-----
への変更でも同じ)

蛇足ですが、lsmodでnf_conntrack_ftpは読み込まれていてもautomatic-helper = systemがトラッキングモードにスイッチされないのは、おそらくfirewall-cmdで追加されるエントリが

nft list ruleset
-----
.....
table inet firewalld
.....
chain filter_IN_public_allow
tcp dport ftp ct state new,untracked accept
-----
のようにuntrackedになってるから?helperは必要なし、と判断されているためかもしれません。(直接 nft add rule inet firewalld filter_IN_public_allow tcp dport 21 ct state new accept でuntrackedにならないエントリを追加すると、トラッキングをするようになるので、おそらくそうではないかという個人的な推測です)

お役に立てば。