Postfix SMTP Server 郵件服務(Linux主機伺服器架設技術)
Postfix SMTP Server 郵件服務(Linux主機伺服器架設技術)
郵件服務簡單講,包含了寄件與收件兩部份。
但,實務上要考慮的點不只這樣,寄信(SMTP)的確較單純,但收信又得分成:主機收下(SMTP),送至客戶端(POP3 or IMAP)兩步驟來處理。
A Mail Client 要寄信給 B Mail Client ,解釋如下:
1. A Mail Client 向 A Mail Server 發出寄信需求
2. A Mail Server 的 SMTP Server 接到請求,依 e-mail address 找到對方 SMTP Server(B Mail Server)
3. B Mail Server 會先依 DNS 的 MX 記錄,把信送至過濾,再由 Spamfilter 送回
4. B Mail Server 接到 Spamfilter 送回的信,仍會再檢查 e-mail address ,是否有此 user ,若有接下信件
5. B Mail Server 把接下的信件暫存至 /var/mail/user 內
6. B Mail Client 要取信,必須透過 POP3 Server 到 /var/mail/user 取信
Postfix SMTP Server
SMTP Server全名叫:【Simple Mail Transfer Protocal】Server,它的主要工作有兩個:「MTA(mail transfer agent): 寄信出去」、「MDA(mail delivery agent): 把別人寄來的信暫時儲存至 /var/mail/username 」。因此,雖然一般人稱呼 SMTP 為「寄信伺服器」,但身為網管人員不可以這樣看待,切不可忘記其仍有【MDA】功能。
至於收發信件的人員(Mail Client),它們的身份為定位為 MUA; Mail User Agent,它是由 user 端與 POP3 Server結合而成,並不在本文 SMTP 的探討範圍內。
基本設定
* 通訊埠:TCP 25
* 主設定檔:/etc/postfix/main.cf
* Linux 安裝完畢,南縣必修改處,紅字為新增/修改處
# 以下是定義什麼樣的收件者郵件格式Postfix會把它收下來
# 若您希望: 帳號@dc1es.tnc.edu.tw 也能收到信, 那麼您可以改用以下設定:
mydestination = $myhostname, $mydomain, mail.$mydomain
#
# 目前的設定是只收下: 帳號@dns.dc1es.tnc.edu.tw 這種格式的信件
# mydestination = $myhostname
:
:
# 因應 IPv6 而新增的設定
inet_protocols = ipv4, ipv6
# [ ] 內填貴校 spamfilter 主機之 IPv4 Address
relayhost = [163.26.182.249]
* 註:RedHat 系列的 Sendmail relayhost 設定
修改 /etc/mail/sendmail.cf ,把 DS 改為 DSspamfilter.dc1es.tnc.edu.tw
郵件過濾器之設定
郵件過濾器已配發,安裝在網路機櫃附近。它具有以下幾個特點:
1. 可塔配多台郵件伺服器
2. 使用者可以自行取回/寄出誤判信
3. 各校網管可以自行登入設定管理
4. 以 DNS MX 方式,在信件尚未被 postfix 收取前,就轉至過濾器,成功通過的信件才會回寄的郵件伺服器
修改 DNS 記錄
由於本過濾器採用 dns 轉信(mx)機制才達成過濾的目的,因為在 DNS 主機上必須加上以下設定
$TTL 86400
@ IN SOA dns.dc1es.tnc.edu.tw. admin.dns.dc1es.tnc.edu.tw. (
2006030801 ; 每修改一次, 數字就要加 1
86400 ; refresh
1800 ; retry
1728000 ; expire
1200 ; Negative Caching
)
IN NS dns.dc1es.tnc.edu.tw.
dns IN A 163.26.182.1
; 把 user@dc1es.tnc.edu.tw 的信先轉往 spamfilter.dc1es.tnc.edu.tw
@ IN MX 0 sapmfilter.dc1es.tnc.edu.tw.
@ IN MX 10 mail.dc1es.tnc.edu.tw.
; 把 user@dns.dc1es.tnc.edu.tw 的信先轉往 spamfilter.dc1es.tnc.edu.tw
dns.dc1es.tnc.edu.tw. IN MX 0 sapmfilter.dc1es.tnc.edu.tw.
dns.dc1es.tnc.edu.tw. IN MX 10 dns.dc1es.tnc.edu.tw.
; 網域名稱 dc1es.tnc.edu.tw 也要賦予一組 IPv4 位址
dc1es.tnc.edu.tw. IN A 163.26.182.1
修改防火牆設定
關於 Mail 主機的 Port 25 討論如下
* 就寄信而言
Mail Client 端(Outlook / Webmail)必須連至 Mail 主機之 SMTP 25 埠才可發信。
* 就收信而言
1. 若沒有 spamfilter 機制,SMTP 必須全開 port 25,以接收全球其他 Mail Server 的來信,不可加設防火牆規則列進行阻擋。
2. 但 spamfilter 設了 DNS MX 機制後,信件封包之收件者若是以 mail@hostname 呈現,比如 yh@mail.tnc.edu.tw 。那麼信件在到達 Mail Server 前,就已經被 DNS Server 轉至 spamfilter 主機過濾。過濾完成的信件,再經由 spamfilter 送回 Mail 主機之 SMTP Server。簡言之,其實在此機制下, Mail Server 的 port 25 只讓 spamfilter 過就可收到信件。
3. 問題是,很多垃圾郵件發信機,是直接以 IP 位址串到 port 25,寄給使用者(非正常手段)。
* 綜合論之
只要的 Mail Server 把 Port 25 封起來,只讓可能寄信的 IP Range 及 spamfilter 通過,那麼就可以阻擋那些繞過 spamfilter 機制的垃圾信。
Linux 上的做法如下:
* 修改 /etc/rc.local
#在IPv6 的規則列與網芳規則列之間加上 port 25 的規則
## 防止 spam mail server 直接交寄信包給本 mail server
# 允許本機可直接交寄
$IPTABLES -A INPUT -p TCP -s 127.0.0.0/8 –dport 25 -j ACCEPT
# 允許163.26.0.0 整個 B Class 可直接交寄
$IPTABLES -A INPUT -p TCP -s 163.26.0.0/16 –dport 25 -j ACCEPT
# 教網中心辦公室
$IPTABLES -A INPUT -p TCP -s 203.68.102.0/24 –dport 25 -j ACCEPT
# 允許教育部可直接交寄
$IPTABLES -A INPUT -p TCP -s 140.111.2.0/24 –dport 25 -j ACCEPT
$IPTABLES -A INPUT -p TCP -s 140.111.8.0/24 –dport 25 -j ACCEPT
$IPTABLES -A INPUT -p TCP -s 140.111.34.0/24 –dport 25 -j ACCEPT
# 允許成大區網可直接交寄
$IPTABLES -A INPUT -p TCP -s 140.116.2.0/24 –dport 25 -j ACCEPT
# 拒絕 非本校 IP 網段交寄信包
$IPTABLES -A INPUT -p TCP -s ! 163.26.182.0/24 –dport 25 -j DROP
/sbin/ip6tables -F
/sbin/ip6tables -A INPUT -p tcp –dport 21 -j DROP
* 套用新規則列root@dns:~# service rc.local start
轉信機制
多人給一人 aliases
裡,因為行政業務需要,通常同一人可能要收多組的郵件,比如:網管必建的帳號就有 admin, abuse, security 這三組,再加上原本自已慣用的帳號,共四組。那麼,我們如何在伺服器上稍作修改,便通通由 admin 寄出。
* 設定檔: /etc/aliases
* 編輯 /etc/aliases,把 root, abuse, security, yh 的信件皆轉給 admin 這個帳號
root@dns:~# vi /etc/aliases
mailer-daemon: postmaster
webmaster: root
clamav: root
root: admin
abuse: admin
security: admin
yh: admin
* 下指令:【newaliases】
root@dns:~# newaliases
* 註1:abuse, security, yh 等帳號必須建立。
* 註2:經過 newaliases 之後,寄給上述之信件,皆會直接轉給 amdin,不會在 /var/mail/abuse, security, yh 留下任何資料。
一人給多人
本功能可允許某一帳號收完信件,立即轉給相關人仕。例如:兩個內部帳號 admin ,manager 再加一個外部帳號 tnuser@tn.edu.tw 都需要接到 service 帳號的信件。在 linux 底下,與上面的做法類以,只要修改 /etc/aliases 便可以達成此一目的。
依上例,詳列做法如下:
* 編輯 /etc/aliases
root@dns:~# vi /etc/aliases
service: admin, manager, tnuser@tn.edu.tw
* 執行 newaliases
root@dns:~# newaliases
架第二台Mail Server注意事項
若有架第二台 Mail Server 需求,要考慮以下幾件事情,第一:至少要設妥 DNS 正解及 MX 記錄,第二:也要加入南縣配發給各校的 spamfilter 控管。假設大成國小有一台 mail2.dc1es.tnc.edu.tw –> 163.26.182.8 為例子,分述設定過程如下:
新裝機注意事項
* 使用 Linux 新裝的 mail2,在設定管理密碼(Linux-csetup-utf8)時,基本參數示例如下
◎.主機名稱: mail2
◎.網域名稱: dc1es.tnc.edu.tw
◎.IP 位置: 163.26.182.8
◎.不擔任 DNS Server
* /etc/postfix/main.cf 修改注意
◎.mydestination 不動,就是 hostname 而已
◎.要把 Spamfilter 的寄信過濾加上
mydestination = $myhostname
# [ ] 填入 spamfilter 的 IPv4 Address
relayhost = [163.26.182.249]
修改 DNS 正解檔及防火牆設定檔
* 在適當位置加上,下列之 DNS 記錄
root@dns:~# vi /etc/bind/db.dc1es.tnc.edu.tw
mail2.dc1es.tnc.edu.tw. IN MX 10 spamfilter.dc1es.tnc.edu.tw.
mail2.dc1es.tnc.edu.tw. IN MX 20 mail2.dc1es.tnc.edu.tw.
mail2 IN A 163.26.182.8
* Linux修改 /etc/rc.local 方法與前文一樣,請參考前面。
加入 Spamfilter 過濾
當初 Spamfilter 裝機時,已針對使用中的 Mail Server 處理過,現在我們只要把新增的 Mail Server 通知它,使它能處理新郵件主機的信件。由於各校手上已有該機器的操作手冊,所以在此,筆者僅提示一下執行順序。若對此步驟仍有疑慮,不知該如何處理,也可以請教網中心系統連線組代勞。
1. Mail Server 主機上建立 syncact 帳號:root@dns:~# adduser syncact
2. 用瀏覽器連線至 spamfilter : https://spamfilter.dc1es.tnc.edu.tw:50000
3. 在管理介面點「郵件伺服器管理」(最左上角)
* 郵件網域: mail2.dc1es.tnc.edu.tw
* 郵件伺服器 IP 位址/主機名稱: 163.26.182.8
* 點選【建立】
4. 在管理介面點「人員管理」
* 左側「UNIX帳號同步」
* UNIX 帳號主機設定
主機名稱:mail2.dc1es.tnc.edu.tw
IP:163.26.182.8
Port:22
UNIX登入帳號:syncact
UNIX登入密碼:●●●●●●●
郵件網域:mail2.dc1es.tnc.edu.tw
* 點選【新增】
實用工具指令
* Postfix 啟動/關閉/重新啟動
root@dns:~# service postfix start|stop|restart
* /etc/postfix/main.cf 設定檔語法檢查
root@dns:~# postfix check
* 郵件佇列查詢(還有多少信待寄?)
root@dns:~# postqueue -p
* 刪除所有在佇列中的信件
root@dns:~# postsuper -d ALL
* 依 postqueue -p 所列的 QUEUE_IP 檢視其中某封信件之內容
root@dns:~# postcat -q QUEUE_ID
Amavis-new過濾與防毒
因為南縣各校已建置專用的郵件過濾主機,因此 Linux 預設已拿掉 Amavis+Clamav+SpamAssassin 的過濾功能。不過,如果您安裝 Linux 的網路環境沒有獨立的郵件過濾器,還是得把它安裝起來。
注意:
1. 非台南縣各校不可加 /etc/rc.local 內的 port 25 過濾
2. 非台南縣各校,DNS 不需 MX 至 spamfilter
3. 啟動 amavis 後,郵件在主機內的運作為
postfix 25 -> Amavis+Clamav+SpamAssassin 10024 -> postfix 10025 -> 寄出 .or. 送至/var/mail
Linux sqz系列之安裝
* 由於 clamav 在 debian 6.0(squeeze) 以後,已直接進入 debian 的 update 資料庫,所以請先確認 sources.list 有下列來源庫
deb ftp://free.nchc.org.tw/debian/ squeeze-updates main non-free contrib
* root@dns:~# apt-get update
* root@dns:~# apt-get install amavisd-new spamassassin clamav clamav-daemon clamav-docs libclamunrar6 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop lha arj unrar zo◎.unzip cabextract
Linux e系列(Debian Lenny)之安裝
* 修改套件庫,加入由 clamav 組織維護的 debian 套件
root@dns:~# vi /etc/apt/sources.list
deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
* root@dns:~# apt-get update
* root@dns:~# apt-get install amavisd-new spamassassin clamav clamav-daemon clamav-docs libclamunrar6 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop lha arj unrar zo◎.unzip cabextract
安裝後續共通設定部分
* 安裝至 clamav 時,會詢問資料更新方式,建議使用 cron 方式(預設是 daemon)
Virus database update method:
daemon
ifup.d
cron
manual
<確定>
………
Local database mirror site:
db.local.clamav.net
<確定>
HTTP proxy information (空白就好)
<確定>
Shold clamd notify after updates
<是>
* root@dns:~# vi /etc/amavis/conf.d/15-content_filter_mode (取消兩個 bypass 註解,如下所示)
use strict;
# You can modify this file t◎.re-enable SPAM checking through spamassassin
# and t◎.re-enable antivirus checking.
#
# Default antivirus checking mode
# Uncomment the tw◎.lines below t◎.enable it back
#
@bypass_virus_checks_maps = (
%bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);
#
# Default SPAM checking mode
# Uncomment the tw◎.lines below t◎.enable it back
#
@bypass_spam_checks_maps = (
%bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);
1; # insure a defined return
* root@dns:~# vi /etc/amavis/conf.d/20-debian_defaults (修改規則列, 紅字為建議修改項目)
$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt = 3.0; # add spam inf◎.headers if at, or above that level
$sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 10; # 認定可以刪除的垃圾信件
$sa_dsn_cutoff_level = 12; # spam level beyond which a DSN is not sent
……
$final_virus_destiny = D_DISCARD; # (data not lost, see virus quarantine)
$final_banned_destiny = D_BOUNCE; # D_REJECT when front-end MTA
$final_spam_destiny = D_PASS; # 如果評分超過 sa_kill_level_deflt, 暫時通過以免誤判,但經過一段時間的手動學習並穩定後,要改成 discard
$final_bad_header_destiny = D_DISCARD; # False-positive prone (for spam)
* root@dns:~# adduser clamav amavis
* root@dns:~# service clamav-daemon restart
* root@dns:~# service amavis restart
* root@dns:~# vi /etc/postfix/main.cf (在檔尾新增下面兩行)
content_filter = amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings
* root@dns:~# vi /etc/postfix/master.cf(在檔尾新增下面這幾行)
amavis unix – – – – 2 smtp
-◎.smtp_data_done_timeout=1200
-◎.smtp_send_xforward_command=yes
127.0.0.1:10025 inet n – – – – smtpd
-◎.content_filter=
-◎.local_recipient_maps=
-◎.relay_recipient_maps=
-◎.smtpd_restriction_classes=
-◎.smtpd_client_restrictions=
-◎.smtpd_helo_restrictions=
-◎.smtpd_sender_restrictions=
-◎.smtpd_recipient_restrictions=permit_mynetworks,reject
-◎.mynetworks=127.0.0.0/8
-◎.strict_rfc821_envelopes=yes
-◎.receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-◎.smtpd_bind_address=127.0.0.1
* root@dns:~# service postfix restart
* root@dns:~# netstat -nltp
Active Internet connections (only servers)
Prot◎.Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN 1748/amavisd (maste
tcp 0 0 127.0.0.1:10025 0.0.0.0:* LISTEN 839/master
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 4400/mysqld
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 653/xinetd
tcp 0 0 220.130.230.76:53 0.0.0.0:* LISTEN 30549/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 30549/named
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 4579/vsftpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4561/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 839/master
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 30549/named
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN 20233/pptpd
tcp6 0 0 :::80 :::* LISTEN 29064/apache2
tcp6 0 0 :::22 :::* LISTEN 4561/sshd
tcp6 0 0 ::1:953 :::* LISTEN 30549/named
tcp6 0 0 :::443 :::* LISTEN 29064/apache2
過濾信誤判之學習
1. 先把整封信儲存為郵件檔, 副檔名為 eml
2. 變成垃圾信
root@dns:~# sa-learn –spam *.eml
3. 變成正常信
root@dns:~# sa-learn –ham *.eml
啟動 postfix 寄信認證機制(Lenny)
前言
本文只適用 Linux e (lenny) ,若您是安裝其他系統,做法應該有所差異,請另找文件參考。
* 時機
若您的郵件主機沒有垃圾郵件過濾器幫忙,而且使用者可能來自任何 IP Address ,有使用獨立的 Mail Client 程式 (如 Outlook, LiveMail, Thunderbird…etc) 寄信的需求。
* Linux e2預設
1. 為避免 OpenRelay 只限 $mynetwork 內所設的網段才可以寄信
2. 合法區段內的電腦寄信不必輸入密碼認證
3. 南縣各校可能會在 /etc/rc.local 設定 port 25 的阻擋規則列
* 基於上述之預設值,要達成此需求的做法概要
1. 打開 Postfix 寄信只限網內或 localhost 限制
2. 限來自郵件主機之 hostname 或 domain 的寄件者始得以 relay
3. 加裝 Postfix 寄信使用者密碼認證制度
4. 南縣各校必須解除 rc.local 內 port 25 的 iptables 規則列(註:此舉在沒有加裝 amavis 的情況下會導致垃圾信大增)
開始設定
* 安裝 cyrus sasl 套件
root@dns:~# apt-get update
root@dns:~# apt-get install libsasl2-2 libsasl2-modules sasl2-bin
———- 正在設定 sasl2-bin ————
……
Backup file name for /etc/sasldb2: /var/backups/sasldb2.bak → 「確定」
* 修改 /etc/default/saslauthd
root@dns:~# vi /etc/default/saslauthd
START=yes
* 啟動saslauthd服務
◎.剛設定完畢,重新啟動
root@dns:~# service saslauthd restart
◎.預設開機啟動服務
root@dns:~# ntsysv → 找到 saslauthd,打勾
* 修改 /etc/postfix/main.cf
root@dns:~# vi /etc/postfix/main.cf 確認以下設定值與本文一致
……
# 允許本機(WebMail),可以不必經由認證
mynetworks = 127.0.0.0/8
……
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_relay_domains
* 修改 /etc/postfix/sasl/smtpd.conf
root@dns:~# vi /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
* 重新啟動 Postfix
root@dns:~# service postfix restart
Outlook express(LiveMail client) 設定方式
設定妥帳號資訊後,再點選「工具」/「帳戶」,繼續依下面圖示說明進行設定。
Outlook smtp auth 1.png
Outlook smtp auth 2.png
POP3 Server
Linux 上推薦的 POP3 Server 有兩套,一套是 Qpopper ,另一套是 Dovecot,這兩套只要二選一即可。其中 Qpopper 的設定較簡單,適合純 POP3 使用,Dovecot 的設定較難,功能較多,若您同時需要 pop3 及 IMAP 這兩個功能,那麼才建議使用 Dovecot。
Qpopper
Qpopper 是 Linux 預載的 POP3 Server ,也建議若無非安裝 IMAP Server 不可的理由,繼續使用它就好。
基本操作
* 預設它是透過 Xinetd 管理,因此本服務的啟動管理,事實上是要對 xinetd 處理
* 重新啟動
root@dns:~# service xinetd restart
* 永遠停止
1. 在 ntsysv 內停掉 pop3 項目(前面不加 *)
2. root@dns:~# service xinetd restart
* 恢復啟動
1. 在 ntsysv 內勾選 pop3 項目
2. root@dns:~# service xinetd restart
南縣 IPv6 設定
為支援南縣各校 IPv6 設備,Linux 上的 Qpopper 必須修改 /etc/xinetd.d/pop3 ,以支援 IPv6 的 pop3 服務。
* 修改設定檔
root@dns:~# vi /etc/xinetd.d/pop3 (紅字為新增部分)
service pop-3
{
disable = no
flags = IPv6
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/in.qpopper
server_args = -f /etc/qpopper.conf
}
* 重新啟動 qpopper
root@dns:~# service xinetd restart
Linux e2 及 sqz 要加做 qpopper bug 修正
* 注意:若您的 Linux sqz 安裝後立即執行 dist-upgrade 完成整體性更新,此動作不必再做
* 以下內容取自 http://Linux-linux.com/phpBB2/viewtopic.php?t=2907
* 編輯 /etc/pam.d/qpopper 這個檔案,把原 auth 及 account 這二列用 # 註解掉,加入 @include common-auth 即可,修改後的內容如下
#%PAM-1.0
#auth required pam_unix_auth.s◎.shadow
#account required pam_unix_acct.so
@include common-auth
Dovecot
若真的有換成 Dovecot 的必要,請下列方式操作
* 安裝 dovecot 的 pop3 套件
1. root@dns:~# apt-get update
2. root@dns:~# apt-get install dovecot-pop3d
注意:經本動作 qpopper 會被移除
* 修改 dovecot 設定,以符合 IPv6 設備(它是獨立執行的網路服務程式, 不經 xinetd 幫忙)
root@dns:~# vi /etc/dovecot/dovecot.conf (紅字為新增/修改部分)
protocols = pop3
listen = [::]
disable_plaintext_auth = no
* 重新啟動 dovecot
root@dns:~# service dovecot restart
突然無法收發信件可能原因
若郵件系統已經使用一段時間,但某天開始突然無法收發信件,可能原因列表如下
* Clamav 是否沒升級?
◎.說明:要常注意 http://Linux.tnc.edu.tw 上的重要通知,若有更新可用時請立即處理
◎.現象:下「postqueue -p」指令時,會有大量待寄信件
◎.處理:
1. root@dns:~# postsuper -d ALL
2. root@dns:~# service postfix stop
3. 依公告升級 clamav
4. root@dns:~# service postfix start
* 郵件過濾器 Spamfilter 問題?
◎.郵件過濾器因故停機? 可 PING 一下該主機是否存活,再用瀏覽器試著連線看看
◎.新增帳號,忘了到 spamfilter 做「UNIX同步帳號」
* 硬碟空間已滿?
◎.下「postqueue -p」指令,檢查硬碟容量
◎.若有設 Quota ,要去檢查該使用者的限額是否已快滿
* 硬碟故障?
◎.重開機時,是否一直自動執行 fsck ?