拒否ログ出力
デフォルトでは拒否ログは出力されません。
(ゾーンによらず)全体で設定するには、--set-log-denied オプションで有効にします。
firewall-cmd --set-log-denied all
iptables -nvL で確認すると、log-level 4 (warning) ですので、syslog の facility.level = kern.warning に記録されます。
/var/log/messages に出力されます。
また、ゾーンごとに設定するには、rich rule を使います。
ただし、許可ルールチェイン(IN_public_allow)よりも先にログチェイン(IN_public_log)が評価されるので、許可した場合でもログが記録されます。
(例: TCP 80)
firewall-cmd --zone=public --add-rich-rule='rule port port=80 protocol=tcp log prefix
ログ出力先の変更
以下の通り、firewalldでドロップされるログは「prefix "FINAL_REJECT:」がプレフィックスとして付与され/var/log/messagesに出力されます。
[root@server zones]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
INPUT_direct all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
LOG all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID LOG flags 0 level 4 prefix "STATE_INVALID_DROP: "
DROP all -- 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
LOG all -- 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix "FINAL_REJECT: "
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
そのままだとmessagesのログに大量に出力され、ほかのログが埋もれるのでログを別に分けるのがお奨めです。
rsyslogでprefixの文字列をフィルタして、出力先を変えれることで分けられます。
例)
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
:msg, contains, "FINAL_REJECT" -/var/log/firewalld.log
& stop
設定例では、/var/log/firewalld.logに出力しています。
ちなみに、「-/var/log/firewalld.log」先頭に「ハイフン(-)」を付けることで非同期での書き込みを指定しています。
こうすることでサーバへの負荷は劇的に下がります。
反面、サーバが停止した直前のログを取り損ねる場合があリます。
そのため、サーバの停止に関わるようなログを取得している場合は注意が必要です。
「& stop」ログに2重書き込み防止用です。直前のフィルタにマッチしたログを破棄させます。