天天看點

搭建完整郵件系統(postfix+dovecot+clamAV+Spamassassin+amavisd-new)

============================

相關軟體:

1. 發送郵件 --- postfix

2. 身份認證 --- sasl2

3. 接收郵件 --- dovecot

4. 防病毒郵件 --- clamAV

5. 防垃圾郵件 --- spamassassin

6.控制病毒及垃圾郵件掃描程式 --- amavisd-new

============================

待完善的問題:

1. 群發郵件的權限設定

2. 使用者郵箱的配額限制

============================

完整郵件系統架構簡介

我們知道,一個完整的郵件系統應該包括以下幾個重要功能:

基本功能:      發送郵件、收取郵件

安全性功能:  收發郵件的身份認證、防病毒、防垃圾

完整的郵件系統架構流程圖如下:

搭建完整郵件系統(postfix+dovecot+clamAV+Spamassassin+amavisd-new)

相關軟體的安裝及配置

1. 安裝postfix,同時讓postfix支援mysql查詢

   # aptitude install postfix postfix-mysql

2. 檢視postfix是否支援外部資料庫mysql認證

   # postconf -m

      btree

      cidr

      environ

      hash

      internal 

      mysql

      nis

      proxy

      regexp

      sdbm

      static

      tcp

      unix

3. 檢視postfix支援的sasl認證類型

        # postconf -a

        cyrus

        dovecot

4. 安裝cyrus sasl認證

   # aptitude install sasl2-bin libsasl2-modules-sql

5. 修改/etc/default/saslauthd

   START=no  ====> START=yes

6. 重新開機saslauthd,并驗證saslauthd正常工作

   # /etc/init.d/saslauthd restart

   # testsaslauthd -u {username} -p {password}

   若出現如下結果,表示saslauthd已正常運作,并可進行認證服務,否則請檢查username和password并重試

   0: OK "Success."

   注:{username},{password}是登入linux系統的使用者名和密碼

7. postfix啟用sasl認證

   編輯/etc/postfix/main.cf,在最後添加如下内容:

   smtpd_sasl_auth_enable = yes

   broken_sasl_auth_clients = yes

   smtpd_sasl_security_options = noanonymous

8. 修改/etc/postfix/master.cf,禁止postfix啟用chroot

   smtp      inet  n       -       -       -       -       smtpd

   rewrite   unix  -       -       -       -       -       trivial-rewrite

   cleanup   unix  n       -      -       -       0       cleanup

   ==========>>>>>>

   smtp      inet  n       -       n       -       -       smtpd

   rewrite   unix  -       -       n       -       -       trivial-rewrite

   cleanup   unix  n       -       n       -       0       cleanup

    這樣設定的原因:如果不這麼設定,則在發送郵件時,總是報如下錯誤,且郵件無法發送成功:

    postfix/trivial-rewrite[10698]: warning: connect to mysql server localhost: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 

    postfix/trivial-rewrite[10698]: fatal: mysql:/etc/postfix/mysql_virtual_alias_maps.cf(0,lock|fold_fix): table lookup problem

    postfix/smtpd[10394]: warning: problem talking to service rewrite: Success

    postfix/master[10386]: warning: process /usr/lib/postfix/trivial-rewrite pid 10698 exit status 1

    postfix/smtpd[10697]: warning: problem talking to service rewrite: Connection reset by peer

    postfix/master[10386]: warning: /usr/lib/postfix/trivial-rewrite: bad command startup -- throttling

9. 安裝mysql并建立資料庫和表,同時插入資料

   # aptitude install mysql-client mysql-server

   # mysql -u root -p

     輸入密碼

   # sql> create database mail;

   # sql> create table mail.users( id in(8) primary key auto_increment, username varchar(50), password varchar(50), domain varchar(50), quota int(10), maildir varchar(200));

   # sql> insert into mail.users(username,password,domain,maildir,quota) values('test','test','tiddy.com','tiddy.com/test/',16000);

   # sql> commit;

10. 修改postfix通過sasl的認證方式(pam/shadow/sql/ldap),在/etc/postfix/sasl目錄下建立檔案smtpd.conf,内容如下:

pwcheck_method: auxprop

auxprop_plugin: sql

mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM

sql_engine: mysql

sql_hostnames: 127.0.0.1

sql_user: root

sql_passwd: tiddy

sql_database: mail

sql_select: SELECT password FROM users WHERE username = '%u'

11. 在postfix上安裝telnet并進行測試

   # aptitude install telnet

   # telnet localhost 25

     Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

220 mail.tiddy.com ESMTP Postfix (Debian/GNU)

auth login

334 VXNlcm5hbWU6

dGVzdA==

334 UGFzc3dvcmQ6

dGVzdA==

235 2.7.0 Authentication successful

mail from:<[email protected]>

250 2.1.0 Ok

rcpt to:<[email protected]>

250 2.1.5 Ok

data

354 End data with <CR><LF>.<CR><LF>

Subject: alskdjlasd

lasdjflasdf

.

250 2.0.0 Ok: queued as 4C1FB440E6

postfix sasl mysql認證成功

注意:上述紅色标記的文字表示經過BASE64編碼的使用者名(test)和密碼(test)

12. 安裝POP3軟體dovecot

    # aptitude install dovecot-pop3d

13. 建立虛拟使用者(以便該使用者有權限通路郵件存放目錄)

    # groupadd -g 5000 vmail

    # useradd -u 5000 -g 5000 vmail -d /var/vmail -m

14. 配置dovecot

    修改/etc/dovecot/dovecot.conf,主要修改如下部分

    1) 去掉注釋符号(#)

       base_dir = /var/run/dovecot

    2) dovecot所使用的協定

       protocols = pop3 pop3s

    3) dovecot所監聽的端口(*:監聽所有網絡端口)

       listen = *

    4) 打開明文密碼認證(采用pop3協定收取郵件時,采用明文密碼認證)

       disable_plaintext_auth = no

    5) 日志檔案

       log_path = /var/log/dovecot.log

    6) debug日志檔案

       info_log_path = /var/log/dovecot.info

    7) 每行日志輸出的字首

       log_timestamp = "%Y-%m-%d %H:%M:%S "

    8) 用戶端用pop3協定收取郵件時的伺服器收取路徑

       mail_location = maildir:/var/vmail/%d/%n/

    9) 是否開啟debug(測試階段使用,正式投入使用後,最好關閉)

       mail_debug = yes

   10) dovecot的pop3認證

       auth default {

            #認證方式

            mechanisms = plain login

            #認證過程中的密碼查詢方式(采用sql查詢)

            passdb sql {

                    # Path for SQL configuration file

                    args = /etc/dovecot/dovecot-sql.conf

            }

            #認證過程中的使用者查詢方式(采用sql查詢)

            userdb sql {

                    # Path for SQL configuration file

                    args = /etc/dovecot/dovecot-sql.conf

            }

            #監聽用戶端socket以便随時發現用戶端發起的使用者身份認證

            socket listen {

                    client {

                      path = /var/spool/postfix/private/auth

                      mode = 0660

                      user = postfix

                      group = postfix

                    }

            }

       }

15. 修改/etc/dovecot/dovecot-sql.conf

    1) 資料庫驅動

       driver = mysql

    2) 資料庫連接配接資訊

       connect = host=localhost dbname=mail user=root password=tiddy

    3) 資料庫密碼的加密方式(PLAIN:明文方式,不加密)

       default_pass_scheme = PLAIN

    4) 資料庫查詢語句

       password_query = SELECT username, domain, password FROM users WHERE username = '%n'

       user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM users WHERE username = '%n'

16. 重新修改/etc/postfix/main.cf(注意:有的内容已經存在或添加過,請務必不要重複添加)

######################## 基本配置 ##########################

myhostname = postfixsvr

alias_maps = hash:/etc/aliases

alias_database = hash:/etc/aliases

myorigin = tiddy.com

relayhost =

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

mailbox_size_limit = 0

recipient_delimiter = +

inet_interfaces = all

#我們使用虛拟網域virtual_mailbox_domains變量來決定哪些網域的郵件可以被投遞,此處注釋掉

#relay_domains = tiddy.com

#mydestination = tiddy.com

##################### 啟用SASL Auth ########################

# 設定 Postfix 使用 SASL 認證。

smtpd_sasl_auth_enable = yes

# 設定 SASL 支援非标準 E-mail Client 的認證動作。

broken_sasl_auth_clients = yes

# 不使用 ANONYMOUS 這個認證。

smtpd_sasl_security_options = noanonymous

# 對收件人,發件人的限制(允許授權認證使用者,本地網絡使用者<即mynetwork定義的網絡用戶端>,其他一律拒絕)

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject

# 用戶端限制(允許授權認證用戶端,本地網絡用戶端<即mynetwork定義的網絡用戶端>,其他一律拒絕)

smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject

# 認證類型

smtpd_sasl_type = dovecot

# sasl認證路徑(注意與dovecot配置檔案/etc/dovecot/dovecot.conf中的socket listen内容path末端保持一緻)

smtpd_sasl_path = private/auth

############################### 虛拟郵箱 #####################################

# 虛拟郵箱的根路徑

virtual_mailbox_base = /var/vmail

# 虛拟郵箱映射表

virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf

# 虛拟網域

virtual_mailbox_domains = tiddy.com

# 虛拟别名映射表(使用者郵箱别名,郵件群組都由該參數決定,群組也是别名的一種形式)

virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf

# 哪些使用者可以通路虛拟郵箱

virtual_uid_maps = static:5000

virtual_gid_maps = static:5000

########################### 郵件投遞程式 #################################

virtual_transport = virtual

########################## 郵箱容量限制################################

#每封信的最大大小(10M),postfix的預設值為10M,但這指的是郵件正文和

#編碼後附件的總和,經過base64編碼,附件的大小會增加35%左右,是以這裡設定郵件大小為14M

message_size_limit = 14336000

# 如果使用Courier maildir++ quotas,則使用yes,預設為no

virtual_maildir_extended = yes

virtual_create_maildirsize = yes

#預設郵箱大小限制

virtual_mailbox_limit = 16000000

#是否允許覆寫預設的郵箱大小設定。

virtual_mailbox_limit_override = yes

# no限制整個maildir,yes隻限制inbox,預設為no

virtual_mailbox_limit_inbox = no

#針對每個使用者的限制

virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

# 這個選項在未設定’virtual_maildir_limit_message_maps’時,如果使用者超出了限額的提示資訊

virtual_maildir_limit_message = Sorry, overquota

# yes的話使用5xx錯誤,no使用4xx錯誤,郵件還是會被放入隊列

virtual_overquota_bounce = yes

# 是否在計算限額時加上垃圾檔案夾,這個選項需要virtual_trash_name配合,預設為no

virtual_trash_count = no

# 設定垃圾檔案夾名稱,預設值為:.Trash

virtual_trash_name = “.Trash”

17. 建立相關檔案

    (1) 建立檔案/etc/postfix/mysql_virtual_mailbox_maps.cf,内容如下(下面内容其實是查詢資料庫,具體語句涵義不再贅述):

          user = root

          password = tiddy

          hosts = localhost

          dbname = mail

          table = users

          select_field = maildir

          where_field = username

     (2) 建立檔案/etc/postfix/mysql_virtual_alias_maps.cf,内容如下(下面内容其實是查詢資料庫,具體語句涵義不再贅述):

          user = root

          password = tiddy

          hosts = localhost

          dbname = mail

          table = alias

          select_field = goto

          where_field = address

18. 資料庫結構

       資料庫名稱:mail

       資料庫表users( id in(8) primary key auto_increment, username varchar(50), password varchar(50), domain varchar(50), quota int(10), maildir varchar(200))

       資料庫表alias( id int(8) primary key auto_increment, address varchar(100), goto varchar(5000), isgroup int(2))

    注意:

          (1) 表users中的字段maildir儲存的郵件存放路徑的最後一個字元'/'有無,決定了郵件的存放方式:有'/'表示以maildir方式存放,無'/'表示以mailbox方式存放

          (2) 表alias中的字段goto表示根據别名郵箱将郵件實際轉發的目标郵箱,如果是群組轉發,則goto字段可能儲存多個郵箱位址,這些郵箱位址以分号隔開

-----------------------------------------------------------------以上是基本郵件系統的安裝及配置---------------------------------------------------------------------------------

-----------------------------------------------------------------以下是對基本郵件系統的完善(包括殺毒和防垃圾郵件的處理)---------------------------------------------------------------------------------

1. 安裝防毒軟體(ClamAV)和防垃圾軟體(SpamAssassin)及其相關依賴包

     # apt-get install libnet-dns-perl pyzor razor arj bzip2 cabextract cpio file gzip lha nomarch pax rar unrar unzip zip

     # apt-get install amavisd-new spamassassin clamav-daemon

2. 修改使用者權限

     # usermod -a -G clamav amavis

     # usermod -a -G amavis clamav

3. 修改spamassassin配置檔案/etc/default/spamassassin

     ENABLED=0 ====> ENABLED=1

     CRON=0    ====> CRON=1

4.啟動spamassassin

    # /etc/init.d/spamassassin start

5. 修改amavis配置檔案/etc/amavis/conf.d/15-content_filter_mode

    去掉如下内容注釋(目的:check病毒和垃圾郵件)

    @bypass_virus_checks_maps = (

     \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

     @bypass_spam_checks_maps = (

     \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

6. 修改postfix配置檔案/etc/postfix/main.cf,注釋掉mydestination,并添加如下内容

    # 将postfix接收到的郵件傳遞給amavis程式進行掃描

    content_filter = smtp-amavis:[127.0.0.1]:10024

7. 編輯檔案/etc/postfix/master.cf,在檔案最後添加如下内容(注意:-o之前必須至少有兩個空格,表示跟前面一行在邏輯上是一行)

smtp-amavis     unix    -       -       -       -       2       smtp

        -o smtp_data_done_timeout=1200

        -o smtp_send_xforward_command=yes

        -o disable_dns_lookups=yes

        -o max_use=20

127.0.0.1:10025 inet    n       -       -       -       -       smtpd

        -o content_filter=

        -o local_recipient_maps=

        -o relay_recipient_maps=

        -o smtpd_restriction_classes=

        -o smtpd_delay_reject=no

        -o smtpd_client_restrictions=permit_mynetworks,reject

        -o smtpd_helo_restrictions=

        -o smtpd_sender_restrictions=

        -o smtpd_recipient_restrictions=permit_mynetworks,reject

        -o smtpd_data_restrictions=reject_unauth_pipelining

        -o smtpd_end_of_data_restrictions=

        -o mynetworks=127.0.0.0/8

        -o smtpd_error_sleep_time=0

        -o smtpd_soft_error_limit=1001

        -o smtpd_hard_error_limit=1000

        -o smtpd_client_connection_count_limit=0

        -o smtpd_client_connection_rate_limit=0

        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

8. 在檔案/etc/postfix/master.cf中的pickup行添加如下内容(注意:-o之前必須至少有兩個空格,表示跟前面一行在邏輯上是一行)

      -o content_filter=

      -o receive_override_options=no_header_body_checks

9. 重新開機postfix

    # /etc/init.d/postfix reload

10. amavis對相關郵件(病毒,垃圾郵件等)的處理方式,修改/etc/amavis/conf.d/20-debian_defaults

       關于如下參數的含義,詳情請參見我的另一篇文章《郵件系統之amavisd-new的簡介、安裝及配置》

    $final_spam_destiny = D_BOUNCE  ===> $final_spam_destiny = D_DISCARD

    $QUARANTINEDIR = "/data/virusmails";

11. 修改/etc/amavis/conf.d/05-node_id(若不修改成如下格式,在啟動郵件系統的一些軟體時,在/var/log/mail.log中總是報錯,且軟體無法正常啟動)

      $myhostname = "mail.tiddy.com";

12. 修改/etc/amavis/conf.d/50-user,添加如下内容(注意如下内容不能添加到最後面):

      #垃圾郵件和病毒郵件将被存放的目錄(該目錄spam-quarantine對應/etc/amavis/conf.d/20-debian_defaults檔案中的變量$QUARANTINEDIR )

      #這裡的設定表示垃圾及病毒郵件的儲存目錄為/data/virusmails

      $spam_quarantine_to = "spam-quarantine";

      $virus_quarantine_to = "spam-quarantine";

      #黑白名單設定

      @whitelist_sender_maps = read_hash("/etc/amavis/whitelist");

      @blacklist_sender_maps = read_hash("/etc/amavis/blacklist");

13. 在目錄/etc/amavis下建立檔案blacklist(黑名單)和whitelist(白名單)

       # touch /etc/amavis/whitelist

       # touch /etc/amavis/blacklist

14. 重新開機所有服務

       # /etc/init.d/clamav-daemon restart

       # /etc/init.d/clamav-freshclam restart 

       # /etc/init.d/spamassassin restart

       # /etc/init.d/amavis restart

       # /etc/init.d/postfix restart

       # /etc/init.d/dovecot restart

繼續閱讀