Chinaunix首页 | 论坛 | 博客
  • 博客访问: 610933
  • 博文数量: 244
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-27 09:53
个人简介

记录学习,记录成长

文章分类

全部博文(244)

我的朋友

分类: LINUX

2015-08-28 06:12:20

2.1  基于客户端的访问控制
postfix内置了多种反垃圾邮件的机制,其中就包括“客户端”发送邮件限制。客户端判别机制可以设定一系列客户信息的判别条件:
客户端和服务端建立连接阶段:开头通过smtpd_client_restrictions来限制只有谁才可以和服务端建立连接;
helo阶段:可通过smtpd_helo_restrictions来限制只有谁才可以发送helo指令;
mail from阶段:可通过smtpd_sender_restrictions来限制只有谁可以发送mail from指令;
rcpt to阶段:可通过smtpd_recipient_restrictions来限制只有谁才可以发送rcpt to指令;
data阶段:可通过smtpd_data_restrictions来限制只有谁才可以发送data;
上面的每一项参数分别用于检查SMTP会话过程中的特定阶段,即客户端提供相应信息的阶段,如当客户端发起连接请求时,postfix就可以根据配置文件中定义的smtpd_client_restrictions参数来判别此客户端IP的访问权限,但是在实际过程中,真正起到限制的是rcpt to阶段的设置,即使限制了某些主机不允许helo但是也还是可以发送helo指令的;
如果DATA命令之前的所有内容都被接受,客户端接着就可以开始传送邮件内容了。邮件内容通常由两部分组成,前半部分是标题(header),其可以由header_check过滤,后半部分是邮件正文(body),其可以由check_body过滤。这两项实现的是邮件“内容检查”。
postfix的默认配置如下:
smtpd_client_restrictions =
smtpd_data_restrictions =
smtpd_end_of_data_restrictions =
smtpd_etrn_restrictions =
smtpd_helo_restrictions =
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
smtpd_sender_restrictions =
这限制了只有mynetworks参数中定义的本地网络中的客户端才能通过postfix转发邮件,其它客户端则不被允许,从而关闭了开放式中继(open relay)的功能。
Postfix有多个内置的限制条件,如上面的permit_mynetworks和reject_unauth_destination,但管理员也可以使用访问表(access map)来自定义限制条件。自定义访问表的条件通常使用check_client_access, check_helo_access, check_sender_access, check_recipient_access进行,它们后面通常跟上type:mapname格式的访问表类型和名称。其中,check_sender_access和check_recipient_access用来检查客户端提供的邮件地址,因此,其访问表中可以使用完整的邮件地址,如admin@a.com也可以只使用域名,如a.com还可以只有用户名的部分,如lw@
示例:
例1:禁止192.168.85.132主机一个工作在192.168.85.128上的postfix的邮件服务发送邮件,访问表采用hash的格式;
编辑/etc/postfix/access文件作为客户端检查的配置文件,在其中添加定义
[root@www postfix]# vim access 
192.168.85.132  REJECT
然后通过postmap命令将此文件转换为hash格式:
[root@www postfix]# postmap access
[root@www postfix]# ls | grep access
access
access.db
接着编辑postfix配置文件main.cf添加
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
最后重启postfix服务测试:
[root@www postfix]# service postfix reload
Reloading postfix: [  OK  ]


这是禁止192.168.85.132这台主机不能发送邮件,下面是禁止用户发送;
例2: 限定向lby用户发送邮件
编辑客户端检查的配置文件:
/etc/postfix
[root@www postfix]# vim user_control
lby@    REJECT
然后将文件转换为hash格式:
[root@www postfix]# postmap user_control 
接着编辑main.cf文件添加:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/user_control, permit_mynetworks, reject_unauth_destination #注意顺序,顺序错误可能造成测试结果
重新加载postfix服务后测试:
[root@www postfix]# service postfix reload
Reloading postfix: [  OK  ]
[root@www postfix]# telnet 192.168.85.128 25
Trying 192.168.85.128...
Connected to 192.168.85.128.
Escape character is '^]'.
220 mail.a.com ESMTP Postfix
helo mail.a.com
250 mail.a.com
mail from:lw@a.com
250 2.1.0 Ok
rcpt to:lby@a.com
554 5.7.1 <lby@a.com>: Recipient address rejected: Access denied
rcpt to:lby@qq.com
554 5.7.1 <lby@qq.com>: Recipient address rejected: Access denied
rcpt to:lby@b.com
554 5.7.1 <lby@b.com>: Recipient address rejected: Access denied


例3:限定b.com这个域内的主机发送邮件
编辑/etc/postfix/access文件定义
[root@www postfix]# vim access 
b.com  REJECT  
将access文件重新转换为hash格式:
[root@www postfix]# postmap access
编辑/etc/postfix/main.cf文件,添加如下
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access
重新加载服务测试:
[root@www postfix]# service postfix reload
Reloading postfix: [  OK  ]
[root@www postfix]# telnet 192.168.85.128 25
Trying 192.168.85.128...
Connected to 192.168.85.128.
Escape character is '^]'.
220 mail.a.com ESMTP Postfix
helo mail.a.com
250 mail.a.com
mail from: anonymous@b.com
250 2.1.0 Ok
rcpt to: lw@a.com
554 5.7.1 <anonymous@b.com>: Sender address rejected: Access denied
补充:上述hash类的检查表access和user_control使用的格式为: pattern   action
(1)关于pattern:
其pattern通常有两类地址:邮件地址和主机名称/地址。
邮件地址的pattern格式:
user@domain   #用于匹配指定邮件地址;
domain.tld   #用于匹配以此域名作为邮件地址中的域名部分的所有邮件地址;
user@ #用于匹配以此作为邮件地址中的用户名部分的所有邮件地址;
主机名称/地址的pattern格式:
domain.tld   #用于匹配指定域及其子域内的所有主机;
.domain.tld   #用于匹配指定域的子域内的所有主机;
net.work.addr.ess或
net.work.addr或
net.work或
net         #用于匹配特定的IP地址或网络内的所有主机;
network/mask   #CIDR格式,匹配指定网络内的所有主机;
(2)关于action
接受类的动作:
OK   #接受其pattern匹配的邮件地址或主机名称/地址;
全部由数字组成的action   #隐式表示OK;
部分拒绝类的动作:
4xx text 
5xx text 
其中4xx类表示过一会儿重试;5xx类表示严重错误,将停止重试邮件发送;421和521对于postfix来说有特殊意义,尽量不要自定义这两个代码
REJECT optional text...   #拒绝;text为可选信息;
DEFER optional text...    #拒绝;text为可选信息;
阅读(1782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~