跑步:
- Ubuntu 18.04.4 LTS
- Fail2Ban v0.10.2
- ufw 0.36
- iptables v1.6.1
我已成功设置 fail2ban,以使用 ufw 根据 ssh 身份验证失败来阻止 ip。众所周知,ufw 只是 iptables 的前端。我已经从另一个 IP 地址进行了测试,确实被阻止了,并且根据我的 ssh 规则收到了拒绝数据包。所以我知道整个过程似乎正在运行。
我想做的(至少暂时,因为我熟悉所有 3 个组件)是:打开由于来自 fail2ban 的规则而导致的拒绝的日志记录我意识到最终这都只是噪音,但现在我希望能够看到规则发挥作用的积极确认。
UFW 正常记录到 /var/log/ufw.log。我看到很多类似这样的内容:
Feb 12 12:24:01 redis-test kernel: [14337092.381436] [UFW BLOCK] IN=eth0 OUT= MAC=1e:17....:08:00 SRC=123.456.789.10 DST=10.987.654.32 LEN=40 TOS=0x18 PREC=0x00 TTL=49 ID=59823 PROTO=TCP SPT=33169 DPT=23 WINDOW=2358 RES=0x00 SYN URGP=0
我不完全了解 iptables 日志记录在哪里以及它是否有独立于 ufw 的日志,但至少,ufw 的日志似乎包含了 iptables 在幕后所做的一切。
据我所知,默认情况下 ufw 不会记录预期的内容(被用户指定的规则阻止的内容)。来自文档:
ufw 支持按规则记录日志。默认情况下,当数据包与规则匹配时,不会执行任何记录。指定 log 将记录与规则匹配的所有新连接,而指定 log-all 将记录与规则匹配的所有数据包。例如,要允许并记录所有新的 ssh 连接,请使用:ufw allow log 22/tcp
因此,在我上面的示例中(来自 /var/log/ufw.log),我没有针对端口 23(telnet)的任何特定规则,因此它会被记录和阻止。但由于我确实有一条规则专门阻止我的“其他”测试 IP 用于 ssh,因此它不会被记录。
iptables -L 产生以下内容...
Chain INPUT (policy DROP)
target prot opt source destination
ufw-before-logging-input all -- anywhere anywhere
ufw-before-input all -- anywhere anywhere ****** points to below (B) ******
ufw-after-input all -- anywhere anywhere
ufw-after-logging-input all -- anywhere anywhere **** where first logging occurs ****
ufw-reject-input all -- anywhere anywhere
ufw-track-input all -- anywhere anywhere
Chain ufw-before-input (1 references) ****** (B) referenced from above ******
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ufw-logging-deny all -- anywhere anywhere ctstate INVALID
DROP all -- anywhere anywhere ctstate INVALID
ACCEPT icmp -- anywhere anywhere icmp destination-unreachable
ACCEPT icmp -- anywhere anywhere icmp time-exceeded
ACCEPT icmp -- anywhere anywhere icmp parameter-problem
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT udp -- anywhere anywhere udp spt:bootps dpt:bootpc
ufw-not-local all -- anywhere anywhere
ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp -- anywhere 239.255.255.250 udp dpt:1900
ufw-user-input all -- anywhere anywhere ****** this is where my rules from fail2ban are going ******
Chain ufw-user-input (1 references) ****** the IPs coming from fail2ban (any my allow SSH rule i added via UFW) ******
target prot opt source destination
REJECT all -- 555.55.55.555 anywhere reject-with icmp-port-unreachable
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
我看到的第一个日志记录实例是
Chain ufw-after-logging-input (1 references)
target prot opt source destination
LOG all -- anywhere anywhere limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "
但由于直到我的 fail2ban/ufw 规则拒绝连接后才会进行评估,因此没有记录任何内容。
所以我的问题是,我如何为 fail2ban IP 启用日志记录?此外,如果我将来启用新的 jail(例如针对 Web 抓取工具/漏洞扫描),是否有任何方法可以让我获得不同的日志消息,表明它来自 SSH 禁令或 WebScraper 禁令?
我试图弄清楚是否存在一个配置设置,其中默认的“CHAIN”ufw 将用户规则插入其中(想着如果我可以将它们放入 ufw-after-logging-input 的底部,那可能会有效),但我不知道这是否是最好的方法。我不太喜欢弄乱 UFW 如何与 iptables 交互的想法。
我从 ufw.conf 采取的操作如下:
actionban = [ -n "<application>" ] && app="app <application>"
ufw insert <insertpos> <blocktype> from <ip> to <destination> $app
actionunban = [ -n "<application>" ] && app="app <application>"
ufw delete <blocktype> from <ip> to <destination> $app
也许这就像在 ufw 插入语句中添加“log”一样简单?如果是这样,有没有办法可以指定自定义日志消息,以便区分监狱类型(ssh 与 web scraper)?
注意:日志记录设置为默认(低)。我暂时将其设置为高。我可以在日志中的 [UFW AUDIT] 记录中看到我的“测试”被阻止的 IP,但即便如此,它也没有提到它被拒绝,只是它看到了传入的尝试。因此更改日志记录级别不会做到这一点(而且对于生产来说太过多余)。
谢谢!
更新 2/12/2020 上午 9:46:
在 /etc/fail2ban/action.d/ufw.conf 中的 banaction 中添加“log”似乎可以满足我的要求。我的 iptables -L 现在看起来像......
Chain ufw-user-input (1 references)
target prot opt source destination
ufw-user-logging-input all -- 111.222.333.444 anywhere
REJECT all -- 111.222.333.444 anywhere reject-with icmp-port-unreachable
ufw-user-logging-input all -- 555.666.777.888 anywhere
REJECT all -- 555.666.777.888 anywhere reject-with icmp-port-unreachable
Chain ufw-user-logging-input (163 references)
target prot opt source destination
LOG all -- 111.222.333.444 anywhere ctstate NEW limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "
RETURN all -- 111.222.333.444 anywhere
LOG all -- 555.666.777.888 anywhere ctstate NEW limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "
RETURN all -- 555.666.777.888 anywhere
我有点担心每个 IP 都会添加额外的记录。每个 IP,它从
- 单曲“拒绝”
到
- 调用“ufw-user-logging-input”链
- 每个 IP 的日志
- 返回每个 IP
- 原始“ufw-user-input”中的“REJECT”
因此对于每个 IP,现在有 4 个步骤。我不确定这会产生多少开销,以及 10/100/1000 个 IP 的情况会变得多糟糕。 这看起来是不是很快就会出现问题?
此外,它仍然使用 /var/log/ufw.log 中的通用 [UFW BLOCK]。我希望它具体参考导致阻止的规则(ssh/http scraper/http malware bot/etc)。 有没有办法从 fail2ban -> ufw -> iptables 获取某种类型的参考? 看来 ufw 的插入语句中有一个“注释”组件,而 iptables 有“--log-prefix”。有什么办法可以将两者联系起来吗?
谢谢!