科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道教你搭建反垃圾邮件系统

教你搭建反垃圾邮件系统

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

原来qmail系统的邮箱一天起码要收十几份垃圾、病毒邮件,实在是比较烦,不是很喜欢qmail,特别是日志,让人不知所云,所以干脆考虑更换邮件系统。系统平台为Debian Woody 3.0

作者:51CTO.COM 2008年4月14日

关键字: 反垃圾邮件 系统 搭建

  • 评论
  • 分享微博
  • 分享邮件

Ò»¡¢ÓʼþϵͳµÄ°²×°

¡¡¡¡1¡¢Èí¼þ°ü°²×°

¡¡¡¡Postfix+Courier-IMAP+Cyrus-SASL+PAM_MySQL+MySQLÕâÖÖ°²×°·½Ê½¼òµ¥Ò×ÐУ¬ÔÚDebianϵݲװ¸ü¼Ó·½±ã£º

¡¡¡¡# apt-get install courier-pop postfix-mysql postfix-tls courier-authdaemon

¡¡¡¡courier-authmysql libpam-mysql libsasl7 libsasl-modules-plain courier-imap

¡¡¡¡Èç¹ûÄãµÄϵͳ±¾ÉíûÓÐmysql£¬ÄÇôÔÚÉÏÃæµÄÁбíÀﻹҪ¼ÓÉÏmysql-server¡£aptÔÚ°²×°¹ý³ÌÖлáÓмòµ¥µÄÌáʾ£¬ÒªÇóÌîÉÏϵͳµÄÓòÃûµÈÐÅÏ¢¡£

¡¡¡¡2¡¢postfixµÄÅäÖÃ

¡¡¡¡ÐÞ¸Ämain.cf£º

¡¡¡¡Ìí¼Ó£º

¡¡¡¡home_mailbox = Maildir/

¡¡¡¡¸æËßpostfixʹÓÃMaildir·½Ê½

¡¡¡¡mydestination = $myhostname, $transport_maps

¡¡¡¡¸æËßpostfix·¢ËÍ$myhostname(±¾»ú)ºÍ$transport_maps(transport±íÀïµÄÓòÃû)µÄÓʼþ¡£

¡¡¡¡alias_maps = mysql:/etc/postfix/mysql-aliases.cf

¡¡¡¡relocated_maps = mysql:/etc/postfix/mysql-relocated.cf

¡¡¡¡transport_maps = mysql:/etc/postfix/mysql-transport.cf

¡¡¡¡virtual_maps = mysql:/etc/postfix/mysql-virtual.cf

¡¡¡¡¸æËßpostfix´ÓÄÄÀïÕÒÕâЩ±í¡£

¡¡¡¡local_recipient_maps = $alias_maps $virtual_mailbox_maps unix:passwd.byname

¡¡¡¡postfix´«µÝ¸ø±¾µØÊÕ¼þÈ˵ļ¸ÖÖ·½·¨¡£

¡¡¡¡virtual_mailbox_base = /home/vmail

¡¡¡¡virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf

¡¡¡¡virtual_uid_maps = mysql:/etc/postfix/mysql-virtual-uid.cf

¡¡¡¡virtual_gid_maps = mysql:/etc/postfix/mysql-virtual-gid.cf

¡¡¡¡ÐéÄâÓû§µÄÐÅÏ¢¡£

¡¡¡¡broken_sasl_auth_clients = yes

¡¡¡¡smtpd_sasl_auth_enable = yes

¡¡¡¡smtpd_sasl_security_options = noanonymous

¡¡¡¡ÆôÓÃsasl£¬±ØÐëÑéÖ¤²ÅÄÜ·¢ÐÅ¡£

¡¡¡¡smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unknown_recipient_

¡¡¡¡domain,reject_non_fqdn_recipient,check_relay_domains

¡¡¡¡·¢ÐÅÏÞÖÆ¡£

¡¡¡¡»¹¿ÉÒÔ¼ÓÉÏһЩÆäËûµÄ²ÎÊý£º

¡¡¡¡disable_vrfy_command = yes

¡¡¡¡½«vrfy¹¦Äܹصô¡£

¡¡¡¡3¡¢ÓëMySQL½áºÏµÄÅäÖü°Êý¾Ý±í½á¹¹

¡¡¡¡×¢Ò⣺ÅäÖÃmysqlÏà¹Ø²¿·ÖҪд127.0.0.1¶ø²»ÒªÐ´localhost£¬Èç¹ûʹÓÃlocalhost£¬postfix»á³¢ÊÔsocketÁ¬½Ó¡£debianµÄpostfixʹÓÃsocketÁ¬½ÓºÃÏñÓÐÎÊÌâ¡£mysql²»ÄÜʹÓÃskip-networkingÑ¡ÏҪʹÓÃ--bind-address=127.0.0.1ÈÃËü¼àÌýÔÚ127.0.0.1¡£(·Ç³£¸ÐлMartin List-PetersenÖ¸µã)

¡¡¡¡»¹ÓÐҪעÒâµÄÊÇÈç¹ûÊÇ×Ô¼º±àÒëµÄmysql£¬½¨ÒéÔÚÆô¶¯µÄʱºò¼ÓÉÏ--socket=/var/run/mysqld/mysqld.sock²ÎÊý£¬ÒòΪpam-mysqlÓÖÐèҪʹÓÃÕâ¸ösocket¡£Èç¹ûÄãµÄapache+phpÊÇ×Ô¼º±àÒëµÄ»°£¬phpÓÖÐèÒªÖØбàÒ룬ÅäÖõÄʱºòÐèÒª¼ÓÉÏ--with-mysql-sock=/var/run/mysqld/mysqld.sock²ÎÊý¡£

¡¡¡¡ÊDz»ÊDZȽϷ³?Õâ²»¹ýÊǸö¿ªÊ¼¡£

¡¡¡¡MySQLµÄÊý¾Ý±í£º

¡¡¡¡CREATE TABLE alias (

¡¡¡¡id int(11) unsigned NOT NULL auto_increment,

¡¡¡¡alias varchar(128) NOT NULL default "",

¡¡¡¡destination varchar(128) NOT NULL default "",

¡¡¡¡PRIMARY KEY (id)

¡¡¡¡) TYPE=MyISAM;

¡¡¡¡CREATE TABLE relocated (

¡¡¡¡id int(11) unsigned NOT NULL auto_increment,

¡¡¡¡email varchar(128) NOT NULL default "",

¡¡¡¡destination varchar(128) NOT NULL default "",

¡¡¡¡PRIMARY KEY (id)

¡¡¡¡) TYPE=MyISAM;

¡¡¡¡CREATE TABLE transport (

¡¡¡¡id int(11) unsigned NOT NULL auto_increment,

¡¡¡¡domain varchar(128) NOT NULL default "",

¡¡¡¡destination varchar(128) NOT NULL default "",

¡¡¡¡PRIMARY KEY (id),

¡¡¡¡UNIQUE KEY domain (domain)

¡¡¡¡) TYPE=MyISAM;

¡¡¡¡CREATE TABLE users (

¡¡¡¡id int(11) unsigned NOT NULL auto_increment,

¡¡¡¡email varchar(128) NOT NULL default "",

¡¡¡¡clear varchar(128) NOT NULL default "",

¡¡¡¡name tinytext NOT NULL,

¡¡¡¡uid int(11) unsigned NOT NULL default "1011",

¡¡¡¡gid int(11) unsigned NOT NULL default "1011",

¡¡¡¡homedir tinytext NOT NULL,

¡¡¡¡maildir tinytext NOT NULL,

¡¡¡¡quota tinytext NOT NULL,

¡¡¡¡postfix enum("Y","N") NOT NULL default "Y",

¡¡¡¡PRIMARY KEY (id),

¡¡¡¡UNIQUE KEY email (email)

¡¡¡¡) TYPE=MyISAM;

¡¡¡¡CREATE TABLE virtual (

¡¡¡¡id int(11) unsigned NOT NULL auto_increment,

¡¡¡¡email varchar(128) NOT NULL default "",

¡¡¡¡destination varchar(128) NOT NULL default "",

¡¡¡¡PRIMARY KEY (id)

¡¡¡¡) TYPE=MyISAM;

¡¡¡¡/etc/postfixĿ¼Ï¸÷mysqlÅäÖÃÎļþ£º

¡¡¡¡mysql-aliases.cf

¡¡¡¡user = mysql-postfix-user

¡¡¡¡password = mysql-postfix-pass

¡¡¡¡dbname = postfix

¡¡¡¡table = alias

¡¡¡¡select_field = destination

¡¡¡¡where_field = alias

¡¡¡¡hosts = 127.0.0.1

¡¡¡¡mysql-relocated.cf

¡¡¡¡user = mysql-postfix-user

¡¡¡¡password = mysql-postfix-pass

¡¡¡¡dbname = postfix

¡¡¡¡table = relocated

¡¡¡¡select_field = destination

¡¡¡¡where_field = email

¡¡¡¡hosts = 127.0.0.1

¡¡¡¡mysql-transport.cf

¡¡¡¡user = mysql-postfix-user

¡¡¡¡password = mysql-postfix-pass

¡¡¡¡dbname = postfix

¡¡¡¡table = transport

¡¡¡¡select_field = destination

¡¡¡¡where_field = domain

¡¡¡¡hosts = 127.0.0.1

¡¡¡¡TLSÖ§³Ö

¡¡¡¡Í¨¹ýÐÞ¸Ä/usr/lib/ssl/misc/CA.pll½Å±¾ÊµÏÖ£¬ÒÔÏÂÐ޸ĺóCA1.plºÍδÐÞ¸ÄCA.plÖ®¼äµÄ¶Ô±È£º

¡¡¡¡*** CA.pl

¡¡¡¡--- CA1.pl

¡¡¡¡***************

¡¡¡¡*** 59,69 ****

¡¡¡¡} elsif (/^-newcert$/) {

¡¡¡¡# create a certificate

¡¡¡¡! system ("$REQ -new -x509 -keyout newreq.pem -out newreq.pem $DAYS");

¡¡¡¡$RET=$?;

¡¡¡¡print "Certificate (and private key) is in newreq.pem "

¡¡¡¡} elsif (/^-newreq$/) {

¡¡¡¡# create a certificate request

¡¡¡¡! system ("$REQ -new -keyout newreq.pem -out newreq.pem $DAYS");

¡¡¡¡$RET=$?;

¡¡¡¡print "Request (and private key) is in newreq.pem ";

¡¡¡¡} elsif (/^-newca$/) {

¡¡¡¡--- 59,69 ----

¡¡¡¡} elsif (/^-newcert$/) {

¡¡¡¡# create a certificate

¡¡¡¡! system ("$REQ -new -x509 -nodes -keyout newreq.pem -out newreq.pem $DAYS");

¡¡¡¡$RET=$?;

¡¡¡¡print "Certificate (and private key) is in newreq.pem "

¡¡¡¡} elsif (/^-newreq$/) {

¡¡¡¡# create a certificate request

¡¡¡¡! system ("$REQ -new -nodes -keyout newreq.pem -out newreq.pem $DAYS");

¡¡¡¡$RET=$?;

¡¡¡¡print "Request (and private key) is in newreq.pem ";

¡¡¡¡} elsif (/^-newca$/) {

¡¡¡¡ÏÖÔھͿÉÒÔʹÓÃÐ޸ĵÄCA1.plÀ´Ç©·¢Ö¤Ê飺

¡¡¡¡# cd /usr/local/ssl/misc

¡¡¡¡# ./CA1.pl -newca

¡¡¡¡# ./CA1.pl -newreq

¡¡¡¡# ./CA1.pl -sign

¡¡¡¡# cp demoCA/cacert.pem /etc/postfix/CAcert.pem

¡¡¡¡# cp newcert.pem /etc/postfix/cert.pem

¡¡¡¡# cp newreq.pem /etc/postfix/key.pem

¡¡¡¡ÐÞ¸Ämain.cf£¬Ìí¼Ó£º

¡¡¡¡smtpd_tls_cert_file = /etc/postfix/cert.pem

¡¡¡¡smtpd_tls_key_file = /etc/postfix/privkey.pem

¡¡¡¡smtpd_use_tls = yes

¡¡¡¡tls_random_source = dev:/dev/urandom

¡¡¡¡tls_daemon_random_source = dev:/dev/urandom

¡¡¡¡ÖØÆðpostfixºó¾Í¿ÉÒÔ¿´µ½250-STARTTLS

¡¡¡¡ºÜ¶àÓʼþ¿Í»§¶Ë¶ÔTLSµÄÖ§³Ö²¢²»ÊǷdz£ºÃ£¬½¨ÒéʹÓÃstunnelÀ´ÊµÏÖÏàÓ¦µÄsmtpºÍpop3¼ÓÃÜ¡£

¡¡¡¡# apt-get install stunnel

¡¡¡¡Ö¤Ê飺

¡¡¡¡# openssl req -new -x509 -days 365 -nodes -config /etc/ssl/openssl.cnf -out stunnel.pem -keyout stunnel.pem

¡¡¡¡# openssl gendh 512 >>stunnel.pem

¡¡¡¡·þÎñ¶Ë£º

¡¡¡¡# stunnel -d 60025 -r 25 -s nobody -g nogroup

¡¡¡¡# stunnel -d 60110 -r 110 -s nobody -g nogroup

¡¡¡¡Èç¹ûʹÓÃ-n pop3µÈ²ÎÊý¾ÍÖ»ÄÜÓÃÓʼþ¿Í»§¶ËÊÕÐÅ¡£

¡¡¡¡¿Í»§¶Ë£º

¡¡¡¡½¨Ò»¸östunnel.confÎļþ£º

¡¡¡¡client = yes

¡¡¡¡[pop3]

¡¡¡¡accept = 127.0.0.1:110

¡¡¡¡connect = 192.168.7.144:60110

¡¡¡¡[smtp]

¡¡¡¡accept = 127.0.0.1:25

¡¡¡¡connect = 192.168.7.144:60025

¡¡¡¡È»ºóÆô¶¯stunnel.exe£¬ÔÚÓʼþ¿Í»§¶ËµÄsmtpºÍpop3µÄ·þÎñÆ÷¶¼Ìî127.0.0.1¾Í¿ÉÒÔÁË£¬ÕâÑù´ÓÄãµ½Óʼþ·þÎñÆ÷¶ËµÄÊý¾Ý´«Êä¾ÍÈÃstunnel¸øÄã¼ÓÃÜÁË¡£

¡¡¡¡4¡¢²âÊÔÓû§

¡¡¡¡# mkdir -p /home/vmail/test.org/san/

¡¡¡¡# chown -R nobody.nogroup /home/vmail

¡¡¡¡# chmod -R 700 /home/vmail

¡¡¡¡mysql> use postfix

¡¡¡¡mysql> insert into transport set domain="test.org", destination="

¡¡¡¡virtual:";

¡¡¡¡mysql> insert into users set email="san@test.org",clear="test",name="",uid="65534",gid="65534",

¡¡¡¡homedir="home/vmail",maildir="test.org/san/";

¡¡¡¡È»ºó¾Í¿ÉÒÔʹÓÿͻ§¶ËÊÕ·¢Óʼþ£¬¼ÇµÃÓû§ÃûÊÇemailµØÖ·¡£

¡¡¡¡mysql-virtual.cf

¡¡¡¡user = mysql-postfix-user

¡¡¡¡password = mysql-postfix-pass

¡¡¡¡dbname = postfix

¡¡¡¡table = virtual

¡¡¡¡select_field = destination

¡¡¡¡where_field = email

¡¡¡¡hosts = 127.0.0.1

¡¡¡¡mysql-virtual-maps.cf

¡¡¡¡user = mysql-postfix-user

¡¡¡¡password = mysql-postfix-pass

¡¡¡¡dbname = postfix

¡¡¡¡table = users

¡¡¡¡select_field = maildir

¡¡¡¡where_field = email

¡¡¡¡additional_conditions = and postfix = "y"

¡¡¡¡hosts = 127.0.0.1

¡¡¡¡mysql-virtual-uid.cf

¡¡¡¡user = mysql-postfix-user

¡¡¡¡password = mysql-postfix-pass

¡¡¡¡dbname = postfix

¡¡¡¡table = users

¡¡¡¡select_field = uid

¡¡¡¡where_field = email

¡¡¡¡additional_conditions = and postfix = "y"

¡¡¡¡hosts = 127.0.0.1

¡¡¡¡mysql-virtual-gid.cf

¡¡¡¡user = mysql-postfix-user

¡¡¡¡password = mysql-postfix-pass

¡¡¡¡dbname = postfix

¡¡¡¡table = users

¡¡¡¡select_field = gid

¡¡¡¡where_field = email

¡¡¡¡additional_conditions = and postfix = "y"

¡¡¡¡hosts = 127.0.0.1

¡¡¡¡ÐÞ¸ÄCourierÏà¹ØÉèÖã¬/etc/courier/imapd:

¡¡¡¡AUTHMODULES="authdaemon"

¡¡¡¡IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT

¡¡¡¡THREAD=REFERENCES SORT AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE"

¡¡¡¡ÐÞ¸Ä/etc/courier/pop3d

¡¡¡¡AUTHMODULES="authdaemon"

¡¡¡¡POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"

¡¡¡¡ÐÞ¸Ä/etc/courier/authdaemonrc

¡¡¡¡authmodulelist="authmysql authpam"

¡¡¡¡Ê¹ÓÃmysqlÑéÖ¤ºÍpamÑéÖ¤¡£

¡¡¡¡ÐÞ¸Ä/etc/courier/authmysqlrc

¡¡¡¡MYSQL_SERVER 127.0.0.1

¡¡¡¡MYSQL_USERNAME mysql-postfix-user

¡¡¡¡MYSQL_PASSWORD mysql-postfix-pass

¡¡¡¡#MYSQL_SOCKET /var/run/mysql/mysql.sock

¡¡¡¡MYSQL_PORT 0

¡¡¡¡MYSQL_OPT 0

¡¡¡¡MYSQL_DATABASE postfix

¡¡¡¡MYSQL_USER_TABLE users

¡¡¡¡MYSQL_LOGIN_FIELD email

¡¡¡¡MYSQL_CLEAR_PWFIELD clear

¡¡¡¡MYSQL_UID_FIELD uid

¡¡¡¡MYSQL_GID_FIELD gid

¡¡¡¡MYSQL_HOME_FIELD homedir

¡¡¡¡MYSQL_MAILDIR_FIELD maildir

¡¡¡¡SASL library

¡¡¡¡´´½¨/etc/postfix/sasl/smtpd.conf£º

¡¡¡¡pwcheck_method: PAM

¡¡¡¡PAM-MySQL

¡¡¡¡´´½¨/etc/pam.d/smtp£º

¡¡¡¡auth optional pam_mysql.so host=localhost db=postfix user=

¡¡¡¡mysql-postfix-user passwd=mysql-postfix-pass table=users

¡¡¡¡usercolumn=email passwdcolumn=clear crypt=n

¡¡¡¡account required pam_mysql.so host=localhost db=postfix user=mysql-postfix-user passwd=mysql-postfix-pass usercolumn=email passwdcolumn=clear crypt=n

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章