利用 Postfix 抵挡垃圾信

参考文件

SPAM 一直以来是邮件管理人员心中的痛,就算设定了再强的过泸规则,SPAM 还是有办法如洪水般的涌进来。当然,大部份的 SPAM 都是不遵守网路规则的。以下,有一些小小方法来抵挡“基本”的来源。

  • header_checks & body_checks

这应该是最常用的过泸方法,但是随著网路上乱丢垃圾的人手段越来越高明,会逼得我们只好一条一条的去新增规则,当然,在常见的 SPAM 下,使用 header_checks 及 body_checks 还是有很大的作用。

要使用 header_checks 或 body_checks 请在 main.cf 加上去就可以了。如果在指定的档上是不存在的,则请手动建立。

header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
  • 拒绝动态 IP 所发出来的信件

在 2004 年开始,台湾各大 ISP 已把动态 IP 的反解改成 dynamic.*.net.tw,因此,对於此资讯,我们可以设定出一套规则,记录在 access 里,把来自动态 IP 的信都挡掉。

要使用这个机制,在 main.cf 加一笔设定既可。

smtpd_client_restrictions =
     check_client_access hash:/etc/postfix/access

而 access 的内容为:

dynamic.apol.com.tw REJECT We can't allow dynamic IP to relay!
dynamic.giga.net.tw REJECT We can't allow dynamic IP to relay!
dynamic.hinet.net REJECT We can't allow dynamic IP to relay!
dynamic.seed.net.tw REJECT We can't allow dynamic IP to relay!
dynamic.tfn.net.tw REJECT We can't allow dynamic IP to relay!
dynamic.ttn.net REJECT We can't allow dynamic IP to relay!
dynamic.lsc.net.tw REJECT We can't allow dynamic IP to relay!

设定好之后, 要记得使用 postmap 产生 access.db 档, 然后再重新载入 postfix, 这样才会生效.

# postmap hash:/etc/postfix/access
# postfix reload
  • 丢弃找不到 DNS 里 MX / A 记录的 hostname

这个机制是查寻寄件者的主机位址,再使用这个位置去做 DNS 查寻,一般在 SPAM 新手会随意造一个主机名称以企图蒙骗过关,对於这种手法实只要使用一个设定既可。

要使用这种机制,在 main.cf 加上一笔:

smtpd_sender_restrictions = reject_unknown_sender_domain

随著科技的进步,可能到处撒垃圾的 SPAM 发送者已知道我们可以从 DNS 去做查寻工作,因为就随意去申请一个 domain name,如此就可以通过 reject_unknown_sender_domain 的检查了。

接下来,既然使用 DNS 的正向查寻 OK,那么我们就来检查一下反解的动作,一般良好的 DNS 管理者,应该要把 DNS 正、反解都设定好,做个遵守规范管理员,然而 SPAM 发送者确经常不设定好,以致於在反查的时候会找不到连线主机的 IP 反解。我们可以利用这一点来过泸这种手法。

  • 不允许对方的连线 IP 没有反解

这种过滤方法不是参考寄件者的主机名称,而是利用 Client 连过来时的 IP 位置。

在 main.cf 加上一笔:

smtpd_sender_restrictions = reject_unknown_client

当然,这种方式非常的有效,但也“超乎你所想像”的有效,为什么这么说呢?一些合法的信件、也许不是垃圾信,会因为查不到 DNS 的 PTR 记录而被挡到外面。像这种“例外的案子”就必需把他们加入到 mynetworks 这个项目里以便收到他的“例外信件”。

因此,您的 mynetworks 必需加一个段落,以 11.22.33.44 来说,我们就必需使用如下方法:

mynetworks = 11.22.33.44, 192.168.3.0/24, 127.0.0.0/8

再把他加到 smtpd_sender_restrictions 里,配合 reject_unknown_client 一起使用。

smtpd_sender_restrictions =
     permit_mynetworks
     reject_unknown_client

因为 permit 的项目如果验证通过,就会离开整个 smtpd_sender_restrictions 的规则,所以当使用者从 11.22.33.44 连上来的时候,就会被视为合合的来源,而不会被 reject_unknown_client 所过滤。

DNS & Mail

在防堵别人的 mail 之前,一定要把自家的设定都弄得很完善才行,如此才可以跟对方说“那是你的问题”尤其是在 DNS 方面。

DNS 里必需指定最少一个 MX record 到你正解设定,如:

abc.com.             IN MX      10      mail.abc.com
mail.abc.com.     IN A                   11.22.33.44

这样,才算遵守规则。在反解方面,也必需设定完全。

44          IN PTR          mail.abc.com.

做测试

查 MX record

# host -t mx abc.com
abc.com mail is handled by 10 mail.abc.com.

查 mail.abc.com 正解

# host mail.abc.com
mail.abc.com has address 11.22.33.44

查反解

#host 11.22.33.44
44.33.22.11.in-addr.arpa domain name pointer mail.abc.com.

以上,如果在手工测试 OK 之后都有结果,那么就可以确定你的 DNS 致少是好的。

很多机关已把垃圾信的过滤规则定得相当严仅,比如出现三个惊叹号 (!!!) 就马上退信,当然在一般的做法上是不用如此的严格,选出适用的条件既可。

 

Index