邮件服务器部署


邮件服务器部署 作者:pary email:pary@mysfony.com Blog:blog.mysfony.com Linux 上邮件服务器部署 Postfix yum install postfix.x86_64 useradd -s /sbin/nologin -d /home/noreply test paswd test passwd test 默认 127.0.0.1:25 service postfix start 需要修改 vi /etc/postfix/main.cf inet_interfaces = all 邮件服务器需要启动 saslauthd postfix service saslauthd start service postfix start 已经存在的帐户先删除 /var/mail/xxxx userdel xxxx /home/mail/xxx 安装 postfix vi /etc/aliases while read line; do user=`echo $line |awk '{ print $1 }'`; passwd=`echo $line |awk '{ print $2 }'`; useradd -d /home/mail/$user -s /sbin/nologin $user;echo $passwd|passwd --stdin $user; done 帐号验证成功了 [root@rhel5 ~]# chkconfig saslauthd on 设置 postfix 启用 SMTP 认证 [root@rhel5 Server]# vi /etc/postfix/main.cf wq!保存 此外,由于当 postfix 要使用 SMTP 认证时,会读取/usr/lib/sasl2/smtpd.conf 文件的内容以确定所采用的认证方式,所以 必须保证/usr/lib/sasl2/smtpd.conf 文件的内容是: pwcheck_method: saslauthd 安装设定 dovecot(imap、pop3): 1、确认 dovecot 是否有安装: [root@rhel5 ~]# rpm -qa|grep dovecot dovecot-1.0-1.2.rc15.el5 2、设定用 pop3 来收取信件: #vi /etc/dovecot.conf protocols = pop3 # imap imaps pop3 pop3s 支持的功能 3、启动并测试: #service dovecot start # telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK dovecot ready. user 账号 +OK pass 密码 +OK Logged in. [root@rhel5 ~]# chkconfig dovecot on 到这里 postfix、Cyrus SASL、dovecot 就可以正常工作了。 让 postfix 支持 MailScanner、spamassassin、f-prot A、安装 F-PROT (F-PROT Antivirus for Linux) 从 http://files.f-prot.com/files/linux-x86/fp-linux-ws.rpm 下载 f-prot [root@rhel5 ~]# rpm -ivh fp-linux-ws.rpm B、安装 MailScanner 下载 http://www.mailscanner.info/file ... 4.60.8-1.rpm.tar.gz 版本.rpm.tar.gz (这里可能会少些 perl 的套件,出现错误讯息!请照着错误讯息要的 rpm 装完即可!) # tar zxvf MailScanner-4.60.8-1.rpm.tar.gz # cd MailScanner-4.60.8-1 # ./install.sh C、安装 spamassassin 1、确认 spamassassin 是否有安装: # rpm -qa |grep spam 如没有安装就安装该包 [root@rhel5 Server]# rpm -ivh spamassassin-3.1.7-4.el5.i386.rpm 2 建立 Mailscanner 支持 spamassassin 所需的目录: # mkdir /var/spool/MailScanner/spamassassin # chmod 700 /var/spool/MailScanner/spamassassin # chown postfix.postfix /var/spool/MailScanner/spamassassin 3、修改 spamassassin 的设定档 local.cf 可到站点 http://www.yrex.com/spam/spamconfig.php 自动生成 local.cf 的内容。 # vi /etc/mail/spamassassin/local.cf # How many hits before a message is considered spam. required_hits 5.0 # Whether to change the subject of suspected spam rewrite_subject 1 # Text to prepend to subject if rewrite_subject is used subject_tag *****SPAM***** # Encapsulate spam in an attachment report_safe 1 # Use terse version of the spam report use_terse_report 0 # Enable the Bayes system use_bayes 1 # Enable Bayes auto-learning auto_learn 1 # Enable or disable network checks skip_rbl_checks 1 use_razor2 0 use_dcc 0 use_pyzor 0 # Mail using languages used in these country codes will not be marked # as being possibly spam in a foreign language. ok_languages all # Mail using locales used in these country codes will not be marked # as being possibly spam in a foreign language. ok_locales all 4、启动 spamassassin # service spamassassin start MailScanner 设定 1 修改 MailScanner.conf # vi /etc/MailScanner/MailScanner.conf Run As User = postfix Run As Group = postfix Incoming Queue Dir = /var/spool/postfix/hold Outgoing Queue Dir = /var/spool/postfix/incoming MTA = postfix Virus Scanners = f-prot Always Include SpamAssassin Report = yes Use SpamAssassin = yes Required SpamAssassin Score = 4 SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin SpamAssassin Install Prefix = /usr/bin SpamAssassin Local Rules Dir = /etc/MailScanner 2、修改 postfix 支持 mailscanner # vi /etc/postfix/main.cf 变更以下的值 header_checks = regexp:/etc/postfix/header_checks # vi /etc/postfix/header_checks /^Received:/ HOLD 注意, 在 / 之前不可以有空白! 3、变更目录权限 # chown postfix.postfix /var/spool/MailScanner/incoming # chown postfix.postfix /var/spool/MailScanner/quarantine 停止 postfix 执行、启动 MailScanner # service postfix stop # chkconfig postfix off # service MailScanner start 设定 MailScanner,当 MTA = postfix 时,会自己启动 postfix,如有设定启动 postfix 的请先将它停掉 4、定期更新病毒定义文件 # crontab -e 0 4 * * * /usr/local/f-prot/tools/check-updates.pl 并将原本在/etc/cron.hourly/update_virus_scanners 删除掉 测试 SpamAssassin 发一封邮件带如下内容,接收后,标题应该带有标记: XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X 这样,我们就已经搭建起一个基本的邮件系统 如何提高邮件发送率,如何让邮件不变为垃圾邮件 签署 PTR SPF DKIM 如何正确设置邮件 MX SPF 和 PTR 记录? 1.MX 记录 邮件的 MX 记录最好是指向机器 A 记录,尽量不要直接指向 IP 地址(不符合规范)。 1.1 添加 A 记录 mail.example.com 192.168.1.100 1.2 添加 MX 记录 example.com mail.example.com 1.3 测试 MX 记录 # host exmple.com example.com mail is handled by 10 mail.example.com. #nslookup mail.example.com Name:mail.example.com Address:192.168.1.100 2.SPF 记录 SPF 是指 Sender Policy Framework,是为了防范垃圾邮件而提出来的一种 DNS 记录类型,SPF 是一种 TXT 类型的记录。 SPF 记录的本质,就是向收件人宣告:本域名的邮件从清单上所列 IP 发出的都是合法邮件,并非冒充的垃圾邮件。设置 好 SPF 是正确设置邮件发送的域名记录和 STMP 的非常重要的一步。 例如: SPF 记录指向 A 主机记录 example.com. 3600 IN TXT "v=spf1 mx mx:mail.example.com ~all" SPF 记录指向 IP 地址 example.com. 3600 IN TXT "v=spf1 ip4:192.168.1.100 ~all" 2.1 如何查看 SPF Windows 下进入 DOS 模式后用以下命令: nslookup -type=txt 域名 Unix 操作系统下用: # dig -t txt 域名 2.2 SPF 的简单说明如下: v=spf1 表示 spf1 的版本 IP4 代表 IPv4 进行验证(IP6 代表用 IPv6 进行验证), 注意 “ip4:” 和“IP”之间是没有空格的 ~all 代表结束 2.3 SPF 记录例释 我们看这条 SPF: yourdomain.com "v=spf1 a mx mx:mail.jefflei.com ip4:242.96.88.88 ~all" 这条 SPF 记录具体的说明了允许发送 @yourdomain.com 的 IP 地址是:a (这个 a 是指 yourdomain.com 解析出来的 IP 地址,若没有配置应取消) mx (yourdomain.com 对应的 mx,即 mail.yourdomain.com 的 A 记录所对应的 ip) mx:mail.jefflei.com (如果没有配置过 mail.jefflei.com 这条 MX 记录也应取消) ip4:242.96.88.88 (直接就是 202.152.186.85 这个 IP 地址) 其他还有些语法如下: - Fail, 表示没有其他任何匹配发生 ~ 代表软失败,通常用于测试中 ? 代表忽略 如果外发的 ip 不止一个,那么必须要包含多个 v=spf1 ip4:242.96.88.88 ip4:242.96.88.87 ~all 2.4 测试 SPF 设置结果 设置好 DNS 中的 SPF 记录后,发送邮件给自己的 gmail,然后查看邮件的源文件,应该能看到类似的邮件头,其中有 pass 表示设置成功。 Received-SPF: pass (google.com: domain of test@jefflei.com designates 242.96.88.87 as permitted sender) client-ip=242.96.88.87; 需要注意的是,服务器的 IP 若有更改,需要同时修改 SPF!!! 2.5 利用 SPF 记录防止垃圾邮件 在 Unix 下可以安装配置 SpamAssassin 之类的插件来防止垃圾邮件和钓鱼邮件(Phishing) (正确设置邮件 PTR 和 MX 记录重要性) 【事件描述】:前一段时间,有人反映给我的雅虎邮箱发邮件,邮件被退回。 【事件原因】:目前许多邮件服务器如 sina.com,hotmail.com,yahoo.com.cn,等等都采用 了垃圾邮件识别阻拦技术+IP 反向解析验证技术以更好的阻拦垃圾邮件。 【事件分析】: ①.A 记录:解析域名到 IP(域名→IP 的过程);在域名服务商那里做; ②.PTR 记录:解析 IP 到域名(DNS 的反向解析、rDNS、IP 反向解析),DNS 服务器里有两个 区域,即“正向查找区域”和“反向查找区域”,反向查找区域即是这里所说的 IP 反向解析,它 的作用就是通过查询 IP 地址的 PTR 记录来得到该 IP 地址指向的域名。(IP→域名的过程) PTR 记录也就是反向解析需要到 ISP 提供商那里做。原因非常简单,因为 IP 是由 ISP 服务商 提供的,比如中国电信或者中国网通来管理的。所以你需要找你的 ISP 提供商,也就是 IP 地址的提供单位。 【简介分析】:如何设置企业邮件服务器的 MX 记录 正确设置 MX(Mail Exchanger)邮件交换记录是企业电子邮件服务稳定运行的基本条件,我们 经常发现很多企业电子邮箱管理员因为设置了不符合规范的 MX 记录,导 致重要的外部邮件 退回或者丢失。我们先看一个常见的样例: yourdomain.com MX preference = 10, mail exchanger = 221.57.37.160 将 MX 记录设置直接对应 IP 地址,这是不符合 RFC 标准的设置,根据 RFC 的 smtp 协议设置 标准,邮件交换记录 MX 应该指向一条 A 记录,而不是直接对应 IP 地址。 上面的样例,邮箱管理员应该增加一条 A 记录,如 mail.yourdomain.com internet address = 221.57.37.160 然后再将 MX 记录指向这条 A 记录: yourdomain.com MX preference = 10, mail exchanger = mail.yourdomain.com 请检查您的企业邮件服务器的 MX 记录是否设置规范,但 是否这样的设置就万事无忧了呢? 回答是否定的。虽然上述 yourdomain.com 设置符合 RFC 标准,通常情况外部邮件能够正常 到达服务器,但 依然不是我们推荐的设置方法,因 为这种设置缺乏网络和邮件服务器的冗余, 一旦遇到网络瞬断或者邮件服务器暂时不可用,那么外部邮件依然可能退回或者丢失。我们 先来看几个样例: IBM 公司 雅虎 上面的域名有个共性,都是设置多条 MX 记录,对应了多条 IP 和邮件服务器,邮件服务器具 备了网络和服务器冗余,这样才能稳定接受外部邮件。我们建议企业邮件服务器至少需要 3 / 3 条 MX 记录,考虑到国内的南北电信互联互通问题,跨电信、网通双 IP 最佳。如果您的邮件 服务器采用电信、网通双 IP 接入(或者多台邮件服务器) mail1.yourdomain.com internet address = 电信 IP 地址 mail2.yourdomain.com internet address = 网通 IP 地址 【正确举例】:以 mail.csst.com 为例 正向解析 反向解析: DKIM 认证 dkim-filter 安装源 下载地址 wget http://download.fedora.redhat.com/pub/epel/5/i386/dkim-milter-2.8.3-8.el5.i386.rpm 上面的链接有时候是失效的 wget http://www.mysfony.com/m/dkim-milter-2.8.3-8.el5.i386.rpm 安装 rpm -ivh dkim-milter-2.8.3-4.el5.i386.rpm rpm -ql 包名查看相关信息 默认安装路径如下 /etc/mail/dkim-milter /etc/mail/dkim-milter/dkim-filter.conf 主配置文件 /etc/mail/dkim-milter/keys /etc/mail/dkim-milter/keys/keylist /etc/rc.d/init.d/dkim-milter /etc/sysconfig/dkim-milter /usr/sbin/dkim-filter /usr/sbin/dkim-genkey /usr/sbin/dkim-testkey /usr/sbin/dkim-testssp /usr/share/doc/dkim-milter-2.8.3 /usr/share/doc/dkim-milter-2.8.3/FEATURES /usr/share/doc/dkim-milter-2.8.3/INSTALL /usr/share/doc/dkim-milter-2.8.3/KNOWNBUGS /usr/share/doc/dkim-milter-2.8.3/LICENSE /usr/share/doc/dkim-milter-2.8.3/README /usr/share/doc/dkim-milter-2.8.3/RELEASE_NOTES /usr/share/man/man5/dkim-filter.conf.5.gz /usr/share/man/man8/dkim-filter.8.gz /usr/share/man/man8/dkim-genkey.8.gz /usr/share/man/man8/dkim-stats.8.gz /usr/share/man/man8/dkim-testkey.8.gz /usr/share/man/man8/dkim-testssp.8.gz /var/run/dkim-milter /var/run/dkim-milter/dkim-milter.sock 现在我们的安装已经完成了,这里我们要使用到的 有 生成密钥的脚本 /usr/sbin/dkim-genkey -r -d mysfony.com /usr/sbin/dkim-genkey -r -d mysfony.com -bash: ./dkim-milter.sock: Permission denied ll total 1024 -rw------- 1 root root 887 Jul 13 12:47 default.private -rw------- 1 root root 308 Jul 13 12:47 default.txt 配置 dkim-filter 有两种方案 然后把这个 default.txt 的内容组织一下放到 DNS 上,增加一条 domain=default._domainkey.mail.banping.com 的 txt 记录, 内容类似这样: v=DKIM1;p=MIGfMA0GCSqGSIb898L9LKJ7dDFGNADCBiQKBgQCU1iD47S+n92ZeXKL444Kg7VzkczqN5xZnx6px1C+/ hImMNoQvF3X6HXLG1+OzO7s8Odf3lhpqgGWq+atFKT3YUZUY3vAL983LIKJIWo+988QIB5iw1cotBretF0TFWVdf4weNy PrC1Qtvm8kQswIDAQAB" ; 把私钥放到想要的位置: mv default.private /etc/postfix/key/default.private ---------------------------------------------------------------------------------- 现在我们对 dkim 配置 ,有两种方法。 第一种是配置 keylist vi /etc/mail/dkim-milter/keys/keylist *@mail.rtmail.cn:mail.rtmail.cn:/etc/mail/dkim-milter/keys/default 第二种不动这个文件 把私钥位置配置在 dkim-filter.conf 文件中,由 KeyFile 参数指定: 因为此文件 注释太多不便于管理 难找故对此经行备份和去重 cp /etc/mail/dkim-milter/dkim-filter.conf /etc/mail/dkim-milter/dkim-filter.conf.bak cd /etc/mail/dkim-milter cat dkim-filter.conf.bak | grep -v ^$ | grep -v ^# | sudo tee dkim-filter.conf cat main.cf.fzz | grep -v ^$ | grep -v ^# | sudo tee main.cf 现在 dkim-filter.conf 很干净了 vim /etc/mail/dkim-milter/dkim-filter.conf 2 4 5 6 7 8 AutoRestart yes #签名域 Domain mysfony.com #Selector 为签名头 Selector xiami Socket inet:20118@localhost Syslog Yes X-Header Yes KeyFile /etc/mail/dkim-milter/keys/default 出于安全考虑的话也可隐藏域名信息 #AutoRestart yes #AutoRestartRate 10/1h #AlwaysAddARHeader yes #Domain mx11.mysfony.com Domain mysfony.com #KeyFile /etc/postfix/key/privatedkim KeyFile /etc/postfix/key/default.private #Selector default Selector xiami Socket inet:20118@localhost Syslog Yes UMask 002 X-Header Yes Background yes SyslogSuccess Yes On-NoSignature accept 至此 DKIM 配置完成,再修改 postfix 中的配置,在发信的时候启用加密功能: vi /etc/postfix/main.cn smtpd_milters = inet:localhost:20118 non_smtpd_milters = inet:localhost:20118 milter_protocol = 2 milter_default_action = accept service dkim-milter start service postfix reload //相关信息验证 http://tools.bevhost.com/cgi-bin/dnslookup http://tools.bevhost.com/spf/ 也可以发送信息验证: check-auth@verifier.port25.com 将返回是邮件的相关信息 Main.cf 优化 /etc/postfix/main.cf 配置 优化 queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix mail_owner = postfix myhostname = mx11.mysfony.com mydomain = mysfony.com myorigin = $mydomain #虚拟域名发送 masquerade_domains = $mydomain #域名化 masquerade_classes = envelope_recipient,envelope_sender,header_sender,header_recipient inet_interfaces = all #mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost, mail.$mydomain mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost, mail.$mydomain #mydestination = $mydomain # 当客户端试图寄信给不存在的本地域用户时,postfix 用于拒绝客户端的 smtpd unknown_local_recipient_reject_code = 550 # 客户端试图寄信给不存在域的虚拟域别名时,返回的响应码. unknown_virtual_alias_reject_code = 553 ## 由于 reject_unknown_client 而拒绝客户端时的响应码. unknown_client_reject_code = 450 #因为访问列表条件限制而拒收邮件时候,返回客服端 access_map_reject_code = 554 #dns 特殊方式的收信来影响邮件路径 allow_percent_hack = no mynetworks = 127.0.0.1 relay_domains = $mydestination alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases #发送参数调整 #关闭邮件通知 biff = no disable_dns_lookups = no #最大进程数 default_process_limit = 100 #初始化并发连接数目 initial_destination_concurrency = 5 #同一目标主机的最大并发连接数目 default_destination_concurrency_limit = 20 default_recipient_limit = 20000 #避免外界使用 vrfy 命令探测邮件地址的有效性. disable_vrfy_command = no # 当 postfix 执行投递时,最多可以尝试几次取得邮箱文件的单独锁定. deliver_lock_attempts = 20 #无法将退信通知寄达原寄信人时,系统就会产生"双退信通知",并将此通知寄到 double_bounce_sender = double-bounce #限制 LMTP client 完成一次 TCP 联机最长可以等待的时间.设为"0",表示取消超时. lmtp_connect_timeout = 0 # 限定 LMTP client 在送出 LMTP DATA 命令后,LMTP SERVER 至少要在多少时间内响 lmtp_data_init_timeout = 120s 除 queue manager 之外的 postfix 服务器进程,等待信服无情求的限制时间上限. max_idle = 100s # 在每次无法投递出邮件时, queue manager 便会将下次递送的时间延后,延长后的 # 时间不超过此参数设定 maximal_backoff_time = 4000s # 每隔多久扫描一次等待队列,重新投递邮件.计时单位 queue_run_delay = 300s debug_peer_level = 1 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin xxgdb $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.3.3/samples readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain= '' #查询 mx domains 记录 smtpd_recipient_restrictions = reject_non_fqdn_recipient, reject_unknown_recipient_domain,permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination #smtpd_recipient_restrictions =permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination broken_sasl_auth_clients = yes smtpd_client_restrictions = permit_sasl_authenticated smtpd_sasl_security_options = noanonymous smtpd_milters = inet:localhost:20118 non_smtpd_milters = inet:localhost:20118 milter_protocol = 2 milter_default_action = accept smtp_helo_required = yes smtp_always_send_ehlo = yes smtp_cname_overrides_servername = no smtp_connect_timeout = 30s smtp_connection_cache_destinations = smtp_connection_cache_on_demand = yes smtp_connection_cache_time_limit = 2s smtp_connection_reuse_time_limit = 300s smtp_data_done_timeout = 600s smtp_data_init_timeout = 120s ~ 接下来我们要对邮件发送做一个优化 我们知道,不同的邮件服务商都有一个限制 比如说网易邮箱 一小时内 超过了 3000 你就有可能进黑名单了 一天超过了 10W 那么恭喜你中奖了 面对这个问题我们怎么处理呢,在 sendmail 重有一个 limit 可以控制那么 psotfix 中呢? 恭喜你答对了,postfix 也有这么个机制调用 Milter-limit 下面我们来安装 milter-limit Milter-limit 安装 要几个包的支持 sendmail,db,libsnert 2.安装 安装sendmail.8.14.2 tar -zxf sendmail.8.14.2.tar.gz cd sendmail-8.14.2 cd libmilter/ ./Build -c ./Build install 安装db4.5 tar -zxf db-4.5.20.tar.gz cd db-4.5.20 cd build_unix ../dist/configure make & make install 安装libsnert tar -zxf milter-limit-0.14.tar.gz tar -zxf libsnert-1.71.6.tar.gz cd com/snert/src/lib ./configure & make && make install 注以下是./configure运行完成后的结果,如果有不同,请解决依赖的问题特别是DB LibSnert/1.71.6 Copyright 1996, 2009 by Anthony Howe. All rights reserved. Platform............: FreeBSD gcc Berkeley DB.........: 4.5 -ldb-4.5 POSIX Threads.......: yes yes SQLite3.............: yes Sendmail libmilter..: yes Semaphore API.......: SYSTEMV_API Shared Memory API...: SYSTEMV_API CFLAGS..............: -I/usr/local/include/db45 -I/usr/home/feishu/limit/org/sqlite/include -D_THREAD_SAFE -pthread -D_REENTRANT -O2 -Wall -I${top_srcdir}/../../include LDFLAGS.............: -L/usr/local/lib/db45 -L/usr/home/feishu/limit/org/sqlite/lib -pthread -L${top_srcdir}/../../lib LIBS................: 这样的话,那么恭喜你,可以编译了 make build make install 安装milter-limit cd ../milter-limit ./configure --enable-run-user=postfix --enable-run-group=mail --enable-debug make build make install 配置postfix echo "smtpd_milters = unix:/var/run/milter/milter-limit.socket" >> /usr/local/etc/postfix/main.cf 启动相关服务 /usr/local/etc/rc.d/postfix restart /usr/local/etc/rc.d/milter-limit.sh restart 常见问题 /libexec/ld-elf.so.1: Shared object "libdb-4.5.so" not found, required by "milter-limit" /libexec/ld-elf.so.1: Shared object "libdb-4.5.so" not found, required by "milter-limit 解决方案 ln -s /usr/local/BerkeleyDB.4.5/lib/libdb-4.5.so /usr/local/lib/libdb-4.5.so warning: connect to Milter service unix:/var/run/milter/milter-limit.socket: Permission denied milter-socket=unix:/var/spool/postfix/var/run/milter/milter-limit.socket makemap hash /etc/mail/access.db
还剩16页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

bing8692

贡献于2012-04-24

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf