我有一个非常我的邮件服务器上安装了少量的 postfix。事实上,我是唯一一个从它那里收到邮件的人,尽管来自几个不同的域和邮箱。
仅昨天就有 811 条警告(52 个唯一主机/IP),遵循以下模式:
[...]warning: hostname <HOSTNAME> does not resolve to address <IP>: Name or service not known
查看主机名,它们似乎都与垃圾邮件有关。至少昨天是这样。
我的问题是,我有什么理由不应该向我的 fail2ban 添加一个正则表达式postfix.local
来禁止这些行中报告的 IP 地址?
期望所有客户端主机名都解析为正确的客户端 IP 地址是否公平?
答案1
几年后通过谷歌找到了这个,因为我想要同样的东西。这个错误似乎有点误导,这实际上是由于反向查找失败造成的;至少在我的情况下是这样的:
我看到一名黑客试图强行破解 postfix 登录名(可通过 看到tshark -Y smtp
),他们总是使用EHLO User
而不是标识主机名打开 SMTP 会话。此警告被发送到我的日志中,因为 postfix 发现PTR
从攻击者的源 IP 到指向另一个 IP 的主机名的反向 DNS 查找。因此,错误实际上是说正向查找与反向查找不匹配,并且消息中列出的主机名不是连接的客户端。
我创建了一个新监狱fail2ban
来处理这个问题,并通过丢弃所有来自他们的数据包来自动禁止任何此类攻击者。不幸的是,我发现开发者fail2ban
文档和网站没有什么帮助,但我设法通过查看现有示例(特别是内置的 postfix jail)来解决这个问题。
以下说明适用于 Debian 10,因此 YMMV。
首先我设置了过滤器/etc/fail2ban/filter.d/postfix-dns.conf
:
# Fail2Ban filter for postfix hostname resolution failures
[INCLUDES]
before = common.conf
[Definition]
_daemon = postfix(-\w+)?/(?:submission/|smtps/)?smtp[ds]
failregex = ^%(__prefix_line)swarning: hostname \S+ does not resolve to address <HOST>$
ignoreregex =
[Init]
journalmatch = _SYSTEMD_UNIT=postfix.service
并检查正则表达式是否正确:
fail2ban-regex -v 'Jul 8 18:35:32 coral postfix/smtpd[22514]: warning: hostname evil.attacker.com does not resolve to address 1.2.3.4' postfix-dns
该选项-v
显示fail2ban-regex
表达式提取了哪个 IP <HOST>
。
设置本地监狱需要创建/etc/fail2ban/jail.d/postfix-dns.conf
:
[postfix-dns]
logpath = %(postfix_log)s
backend = %(postfix_backend)s
enabled = true
要向上游提交此内容,必须将其放入/etc/fail2ban/jail.conf
除enabled = true
行之外,然后用户将
[postfix-dns]
enabled = true
以/etc/jail.d/postfix-dns.conf
启用监狱。
最后,我创建了/etc/fail2ban/jaild.d/bantime.conf
包含以下内容:
[DEFAULT]
bantime = 1day
因为默认的 10 分钟禁令时间对我来说太短了。