Fail2Ban -> UFW -> IPTables (如何记录阻止)

Fail2Ban -> UFW -> IPTables (如何记录阻止)

跑步:

  • 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,它从

  1. 单曲“拒绝”

  1. 调用“ufw-user-logging-input”链
  2. 每个 IP 的日志
  3. 返回每个 IP
  4. 原始“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”。有什么办法可以将两者联系起来吗?

谢谢!

相关内容