我正在使用带有 iptables 后端的firewalld。我添加了用于限制 ssh 连接的“直接”规则:
sudo firewall-cmd --add-port=22/tcp
sudo firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 \
-p tcp --dport 22 \
-m state --state NEW \
-m recent --name ssh --set \
-m comment --comment "limit ssh connections per ip"
sudo firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 1 \
-p tcp --dport 22 \
-m state --state NEW \
-m recent --name ssh --update --seconds 61 --hitcount 4 --rttl \
-j REJECT --reject-with tcp-reset \
-m comment --comment "limit ssh connections per ip"
# ...similarly for ipv6
我还想记录拒绝和丢弃的情况,所以我运行
$ sudo firewall-cmd --set-log-denied all
这基本上是有效的 - 当我检查时,sudo journalctl --since today --identifier kernel
我看到了那些连接......但不包括那些被我的直接规则所拒绝的人。
在仓库中已经被证实正如预期的行为,并且我必须添加更多直接规则来记录我的直接规则:
您必须使用 iptables 日志扩展,例如 -j LOG。... 不幸的是,您需要两个直接规则,因为 iptables 不支持 -j LOG -j ACCEPT。
我怎么做?
答案1
搞清楚了。必须添加另一条规则,与 REJECT 或 DROP 规则相同,但跳转到“非终止”LOG 目标。
$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 \
-p tcp --dport 22 \
-m state --state NEW \
-m recent --name ssh --set \
-m comment --comment "limit ssh connections per ip"
$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 1 \
-p tcp --dport 22 \
-m state --state NEW \
-m recent --name ssh --update --seconds 61 --hitcount 4 --rttl \
-m limit --limit "5/min" \
-j LOG --log-prefix "[REJECT SSH BRUTE FORCE] " --log-level 6 \ # <----------
-m comment --comment "limit ssh connections per ip"
$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 2 \
-p tcp --dport 22 \
-m state --state NEW \
-m recent --name ssh --update --seconds 61 --hitcount 4 --rttl \
-j REJECT --reject-with tcp-reset \
-m comment --comment "limit ssh connections per ip"
# ...similarly for ipv6
要查看这些连接的日志:
# all rejected and dropped
$ sudo journalctl --grep 'kernel'
# or just just ssh brute force attempts
$ sudo journalctl --grep 'REJECT SSH BRUTE FORCE'