kn007的个人博客
♥ You are here: Home > 软件与网络 > VPS > [Postfix进阶]利用Fail2ban防止爆破和攻击

[Postfix进阶]利用Fail2ban防止爆破和攻击

by | 51 Comments

提醒:本文最后更新于 2631 天前,文中所描述的信息可能已发生改变,请仔细核实。


分享一个Fail2ban过滤器,它可以对那些针对Postfix的恶意扫描及攻击,进行自动加入黑名单。

据我分析邮件日志,主要是有一些恶意访客和安全软件,尝试relay测试,看看能不能利用你的服务器发送邮件;还有就是端口扫描,经常有一些超时连接。

针对此,我对那些无法通过认证的,尝试连接后无动作超时的,还有一些故意浪费资源(helo之后无动作),做了策略。24小时内同IP,2次任意匹配规则,一周内无法访问服务器。

使用很简单,编辑/etc/fail2ban/jail.conf,添加如下配置:

[postfix-ddos]
enabled  = true
filter   = postfix-ddos
action   = iptables-allports[name=MAIL, protocol=all]
logpath  = /var/log/maillog
maxretry = 2
findtime = 86400
bantime  = 604800

然后在/etc/fail2ban/filter.d中,创建一个文件,命名为postfix-ddos.conf,添加如下内容:

# Fail2Ban filter for Postfix DDOS attacks
#

[INCLUDES]

before = common.conf

[Definition]

_daemon = postfix/(submission/)?smtp(d|s)

failregex = ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 450 4\.7\.1 Client host rejected: cannot find your hostname, (\[\S*\]); from=<\S*> to=<\S+> proto=ESMTP helo=<\S*>$
            ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 450 4\.7\.1 : Helo command rejected: Host not found; from=<> to=<> proto=ESMTP helo= *$
            ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 454 4\.7\.1 Service unavailable; Client host \[\S+\] blocked using .* from=<\S*> to=<\S+> proto=ESMTP helo=<\S*>$
            ^%(__prefix_line)sNOQUEUE: reject: VRFY from \S+\[<HOST>\]: 550 5\.1\.1 .*$
            ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 504 5\.5\.2 .*$
            ^%(__prefix_line)sNOQUEUE: reject: RCPT from \S+\[<HOST>\]: 554 5\.7\.1 .*$
            ^%(__prefix_line)simproper command pipelining after \S+ from [^[]*\[<HOST>\]:?$
            ^%(__prefix_line)slost connection after \S+ from [^[]*\[<HOST>\]:?$
            ^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL ((?i)LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/:]*={0,2})?\s*$
            ^%(__prefix_line)sstatistics: max connection rate \S+ for \(smtp:<HOST>\):?$

ignoreregex = lost connection after .* from unknown\[unknown\]$
              authentication failed: Connection lost to authentication server$
              statistics: max connection rate .* for \(smtp:unknown\).*$

[Init]

journalmatch = _SYSTEMD_UNIT=postfix.service


# Author: kn007

重启Fail2ban即可生效。需要注意的是确保你的Postfix日志写入位置是/var/log/maillog

同时,我在Github也建立了一个repo:kn007/fail2ban-filters。这个repo后续会分享我自用的一些fail2ban过滤器,也欢迎大家进行PR完善它。

值得一提的是,目前Wordpress评论回复通知邮件提醒同时包含text/plain与text/html两个版本,这使得HTML版本的邮件也能获得满分。并且全新的邮件风格,具有不错的兼容性(响应式)。

更多Postfix相关文章,详见《进阶的Postfix小结》。

转载请注明转自:kn007的个人博客的《[Postfix进阶]利用Fail2ban防止爆破和攻击

donate
有所帮助?

Comments

51 Comments立即评论
  1. LV1回复

    大神,能更新下脚本针对下面这种连接的阻止不?先谢过了!
    Jul 31 11:42:10 mail postfix/smtpd[2687]: connect from unknown[80.82.78.85]
    Jul 31 11:42:10 mail postfix/smtpd[2687]: warning: connect to Milter service inet:8891: Connection refused
    Jul 31 11:42:10 mail postfix/smtpd[2687]: disconnect from unknown[80.82.78.85]
    ;-)

    1. MOD回复

      @Trier: 你这个不构成错误,你这个主要问题是没有防火墙。
      8891本身是不对外的,你对外导致这种情况出现。

      你这里面唯一一句可以作为参考的语句(warning: connect to Milter service inet:8891: Connection refused),没有ip地址可以ban。所以建议你完善防火墙规则。

      这种是最基本的东西。

  2. LV1回复

    8891端口是opendkim用的,本身没有暴露在外网;
    80.82.78.85这个地址在网上比较臭名昭著,它是通过我的25端口进来的。
    这样说来估计是因为我改了域名之后opendkim工作异常了。
    我再瞧瞧,多谢啦!

    1. MOD回复

      @Trier: 你自己telnet 你的ip 8891试试。
      进不来就不会这样报错的。

    2. LV1回复

      @kn007: 我从外网试过telnet 8891端口不通的。
      另外检查了下8891端口在我改完域名之后就没起来,之前能功能的原因是我在socket的8891后@localhost。
      现在改了hostname,立马就起不来了。改成@127.0.0.1 opendkim又能工作正常了。

      80.82.78.85这个host一直在乱ping端口,ping完后立即断开,看来我要直接将它加入黑名单。

    3. MOD回复

      @Trier: 嗯,我理解。但你想想,外部访问25,怎么会调用到dkim呢?
      dkim是发信才需要签发,外部访问进来,内部属于收信,不可能触发dkim签发啊。
      所以你这个错误,跟这个没直接关系。除非你允许任意人用你邮箱发邮件。

    4. LV1回复

      @kn007: 这个日志确实应该和opendkim没关系。这个是第三方不停尝试使用我的smtpd发邮件,我通过tcpdump看出来,它尝试使用auth login来登陆,被我的服务器回复503错误后结束会话。
      我的smtpd的日志都开到3了,但在maillog中竟然没有这样的error,不知道日志级别应该设置成怎样的?

    5. MOD回复

      @Trier: 我只用默认等级,我有严格的防火墙规则

  3. LV5回复

    :!: 伸手党来请教一下评论回复邮件通知怎么包含text/plain与text/html两个版本呢?网上找了个教程,折腾不出来:https://wordpress.stackexchange.com/questions/187982/what-is-the-correct-way-to-send-multipart-email-in-wordpress

    1. MOD回复

      @老杨: 晚点整理后再说吧,也不是很复杂

    2. LV5回复

      @kn007: 好,先谢了。我用这个勉强实现了:https://gist.github.com/davidnknight/3150361,不过得分只有7.2分。然后测试的时候手贱,打开了一下你那个邮件退订链接,居然不用确认。。。 :!: :!:

    3. MOD回复

      @老杨: 退订本来就是不允许还要确定的。。。规范来的。。。
      看了下gist,我最开始也是用类似的,后面用wordpress自带的,不用这么麻烦

    4. MOD回复

      @老杨: 7.2扣了啥?

    5. LV5回复

      @kn007: -2.749 TVD_SPACE_RATIO_MINFP TVD_SPACE_RATIO_MINFP 这个,应该是我的邮件通知模板空段落太多了?那个方法确实有点麻烦,等你分享哈。退订了怎么重新订阅?

    6. MOD回复

      @老杨: 联系博主订阅。。 :arrow:
      说白表达一种不是你想订就订想退就退的态度。。 :oops:

    7. MOD回复

      @老杨: 重新订阅了。

    8. MOD回复

      @老杨: gist这个还真暴力,直接去掉html表情作为html版本,也不怕有歧义,真是为了双版本而双版本。

    9. LV5回复

      @kn007: strip_tags 很暴力,就是为了骗机器…… :???:

  4. 回复

    你好博主,如果在邮件日志中一直出现以下信息,请问要添加什么规则在fail2ban里可以阻止这些连接请求?
    Jul 2 09:04:58 mailsend postfix/smtpd[20429]: lost connection after RCPT from unknown[185.222.211.14]
    Jul 2 09:04:58 mailsend postfix/smtpd[20429]: disconnect from unknown[185.222.211.14] ehlo=1 mail=1 rcpt=0/13 commands=2/15
    Jul 2 09:04:58 mailsend postfix/smtpd[20429]: connect from unknown[141.98.10.32]
    Jul 2 09:04:58 mailsend postfix/smtpd[20429]: lost connection after AUTH from unknown[141.98.10.32]
    Jul 2 09:04:58 mailsend postfix/smtpd[20429]: disconnect from unknown[141.98.10.32] ehlo=1 auth=0/1 commands=1/2
    Jul 2 09:04:58 mailsend postfix/smtpd[20429]: connect from unknown[45.13.39.24]
    Jul 2 09:04:58 mailsend postfix/smtpd[20429]: disconnect from unknown[45.13.39.24] ehlo=1 auth=0/1 rset=1 quit=1 commands=3/4
    Jul 2 09:04:58 mailsend postfix/smtpd[20429]: connect from unknown[185.137.111.123]
    Jul 2 09:05:01 mailsend postfix/smtpd[20429]: disconnect from unknown[185.137.111.123] ehlo=1 auth=0/1 rset=1 quit=1 commands=3/4
    Jul 2 09:05:06 mailsend postfix/smtpd[20429]: connect from unknown[185.137.111.188]

    1. MOD回复

      @DLLL: 参考 https://github.com/kn007/fail2ban-filters/blob/master/filter.d/postfix-ddos.conf

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif