アウトバウンドの通信を不許可にするためfirewalldのdirectルールを設定したところポート設定を間違えてどうにもならなくなってしまった時の解決法。
基本は設定項目をコピペするのがオペレーションとして正しいと思いますが、雑に手でやったら困ったことになったので備忘録として結果を残します。
iptablesにもかかる内容かと思います。
削除できなくなったオペレーション
ポート設定を間違えて登録した際に、--reloadで失敗する。
$ firewall-cmd --reload
Error: COMMAND_FAILED: Direct: '/usr/sbin/iptables-restore -w -n' failed: iptables-restore v1.8.5 (nf_tables): invalid port/service `0-65535' specified
Error occurred at line: 2
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
確認したこと
ルール設定を確認しても、表示されない
$firewall-cmd --direct --get-all-rules
何も表示されない
$firewall-cmd --state
failed ←失敗したことは既にわかっている
ルール設定に表示されていないのでdirectルールの削除ができない
$firewall-cmd --direct --remove-rule ipv4 filter OUTPUT 1 -m state
Warning: NOT_ENABLED: rule '('-m', 'state')' is not in 'ipv4:filter:OUTPUT'
success
iptablesの設定を見ても更新されていない
$iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
解決策
設定ファイルを削除後、reload
$rm /etc/firewalld/direct.xml
$rm /etc/firewalld/direct.xml.old
$firewall-cmd --reload
設定できるようになった
$firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
$firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -m state --state NEW -j DROP
$firewall-cmd --reload
success
directルールを使用する時は便利だが、気をつける設定があるなと思いました。
firewall-cmdはまだまだ勉強中なので、ご意見ありましたらぜひコメントください。