linux postfix部署郵箱服務


一. 郵箱部署前的知識

1. Mail Server與DNS關系

  • Mail Server 與MX和A的作用
    發送郵件的時候,目的地址使用“賬號@域名”的方式發送郵件,因此必須通過DNS解析出來@后邊的域名,然后才能投遞到對方的郵件服務器。
    MX 代表的是 Mail eXchanger, 當一封郵件要傳送出去時,郵件主機會先分析那封郵件的“目標域名的 DNS ”,先取得 MX 標志 (注意,MX 標志可能會有多部主機) 然后以最優先 MX 解析為目的將郵件發送出去,如果所有MX解析的目的接收郵件失敗,則嘗試使用A解析為目的發送郵件,所有都失敗才提示郵件退回。
  • Mail Server與DNS反解的作用
    當郵件服務器收到郵件的時候,首先會對源IP進行反解,如果反解解析不出來注冊域名,則列入垃圾郵件。

2. 郵件傳輸所需要的組件

  • MTA 即Mail Transfer Agent,是發送和轉遞郵件的服務器,發送和轉遞使用SMTP協議。
  • MRA 即Mail Retrieval Agent,是接收郵件的服務器,接收郵件使用的協議POP3或者IMAP。
  • MDA 即Mail Delivery Agent, MDA 是掛在 MTA 底下的一個小程序,分析由 MTA 所收到的信件表頭或內容等數據,過濾垃圾郵件,實現自動回復。
  • Mail Box 就是某個賬號專用的信件收受的文件,Linux 系統默認的信箱都是放在 /var/spool/mail/使用者賬號 中。
  • MUA 即Mail User Agent,你可以登錄到郵件服務器去直接發送郵件,也可以使用MUA去發送接收郵件,常見的MUA有Outlook、Foxmail等。

3. Relay 與認證機制的重要性

當你的 MTA 由於設定不良的關系導致具有 Open Relay 的狀況,加上你的 MTA 確實是連上因特網時, 由於因特網上面用 port scan 軟件的閑人太多,你的 MTA 具有 Open Relay 的功能這件事情, 將會在短時間內就被很多人察覺,此時那些不法的廣告信、色情垃圾信業者將會利用你的這部 Open Relay MTA 發送他們的廣告,所以應該關閉open relay功能,授權開放relay功能:

  • 規定某一個特定客戶端的 IP 或網段,例如規定內部 LAN 的 192.168.1.0/24 可使用 Relay;
  • 若客戶端的 IP 不固定時 (例如撥接取得的非固定 IP) 可以利用認證機制來處理。
  • 將 MUA 架設在 MTA 上面,例如 OpenWebMail 之類的 web 接口的 MUA 功能。

二. PostFix基礎設定MTA服務器

1. PostFix軟件結構介紹

  • /etc/postfix/main.cf
    這就是主要的 postfix 配置文件,幾乎所有的設定參數都是在這個檔案內規范的! 這個檔案預設就是一個完整的說明檔了,你可以參考這個檔案的內容就設定好屬於你的 postfix MTA ! 只要修改過這個檔案,記得要重新啟動 postfix !
  • /etc/postfix/master.cf 了解即可不需配置
    主要規定了 postfix 每個程序的運作參數,也是很重要的一個配置文件。不過這個檔案預設已經很 OK 了,通常不需要更改他。
  • /etc/postfix/access(利用 postmap 處理)
    可以設定開放 Relay 或拒絕聯機的來源或目標地址等信息的外部配置文件,不過這個檔案要生效還需要在 /etc/postfix/main.cf 啟動這個檔案的用途才行。且設定完畢后需要以 postmap 來處理成為數據庫檔案呢!
  • /etc/aliases(利用 postalias 或 newaliases 均可)
    做為郵件別名的用途,也可以作為郵件群組的設定!
  • /usr/sbin/postconf(查閱 postfix 的設定數據)
    這個指令可以列出目前你的 postfix 的詳細設定數據,包括系統默認值也會被列出來, 所以數據量相當的龐大!如果你在 main.cf 里面曾經修改過某些預設參數的話,想要僅列出非默認值的設定數據, 則可以使用『postconf -n』這個選項即可。
  • /usr/sbin/postfix (主要的 daemon 指令)
    [root@www ~]# postfix check <檢查 postfix 相關的檔案、權限等是否正確!
    [root@www ~]# postfix start <
    開始 postfix 的執行
    [root@www ~]# postfix stop <關閉 postfix
    [root@www ~]# postfix flush <
    強制將目前正在郵件隊列的郵件寄出!
    [root@www ~]# postfix reload <==重新讀入配置文件,也就是 /etc/postfix/main.cf
  • /usr/sbin/postalias
    設定別名數據庫的指令,因為 MTA 讀取數據庫格式的檔案效能較佳,所以我們都會將 ASCII 格式的檔案重建為數據庫。 在 postfix 當中,這個指令主要在轉換 /etc/aliases 成為 /etc/aliases.db 啰!用法為:
    [root@www ~]# postalias hash:/etc/aliases
    hash 為一種數據庫的格式,然后那個 /etc/aliases.db 就會自動被更新
  • /usr/sbin/postcat
    主要用在檢查放在 queue (隊列) 當中的信件內容。由於隊列當中的信件內容是給 MTA 看的, 所以格式並不是一般我們人類看的懂的文字數據。所以這個時候你得要用 postcat 才可以看出該信件的內容。 在 /var/spool/postfix 內有相當多的目錄,假設內有一個文件名為 /deferred/abcfile , 那你可以利用底下的方式來查詢該檔案的內容
    [root@www ~]# postcat /var/spool/postfix/deferred/abcfile
  • /usr/sbin/postmap
    這個指令的用法與 postalias 類似,不過他主要在轉換 access 這個檔案的數據庫
    [root@www ~]# postmap hash:/etc/postfix/access
  • /usr/sbin/postqueue
    類似 mailq 的輸出結果,例如你可以輸入『postqueue -p』看看就知道了。

2. PostFix主配置文件使用語法

  • 『 # 』符號是批注的意思;
  • 所有設定值以類似『變量』的設定方法來處理,例如 myhostname = www.centos.jet,請注意等號的兩邊要給予空格符, 且第一個字符不可以是空白,亦即『my..』要由行首寫起;
  • 可以使用『 $ 』來延伸使用變量設定,例如 myorigin = $myhostname,會等於 myorigin = www.centos.jet;
  • 如果該變量支持兩個以上的數據,則使用空格符來分隔,不過建議使用逗號加空格符『, 』來處理。 例如: mydestination = $myhostname, $mydomain, linux.centos.jet,意指 mydestination 支持三個數據內容之意。
  • 可使用多行來表示同一個設定值,只要在第一行最后有逗號,且第二行開頭為空格符, 即可將數據延伸到第二行繼續書寫 (所以剛剛第二點才說,開頭不能留白!);
  • 若重復設定某一項目,則以較晚出現的設定值為准!

3. 讓 Postfix 作為MTA的配置介紹

  • myhostname:設定主機名,需使用 FQDN 喔
    這個項目在於設定你的主機名,且這個設定值會被后續很多其他的參數所引用,所以必須要設定正確才行。 你應該要設定成為完整的主機名。在這個練習當中,應該設定為: myhostname = www.centos.jet 才對。 除了這個設定值之外,還有一個 mydomain 的設定項目,這個項目默認會取 $myhostname 第一個『.』之后的名稱。 舉例來說上頭設定完畢后,預設的 mydomain 就是 centos.jet !你也可以自行設定他。

  • myorigin :發信時所顯示的『發信源主機』項目
    這個項目在設定『郵件頭上面的 mail from 的那個地址』, 也就是代表本 MTA 傳出去的信件將以此設定值為准!如果你在本機寄信時忘記加上 Mail from 字樣的話, 那么就以此值為准了。默認這個項目以 $myhostname 為主的,例如: myorigin = $myhostname

  • inet_interfaces :設定 postfix 的監聽接口 (極重要)
    在預設的情況下你的 Postfix 只會監聽本機接口的 lo (127.0.0.1) 而已,如果你想要監聽整個 Internet 的話, 請開放成為對外的接口,或者是開放給全部的接口,常見的設定方法為: inet_interfaces = all 才對! 由於如果有重復設定項目時,會以最晚出現的設定值為准,所以最好只保留一組 inet_interfaces 的設定!

  • inet_protocols :設定 postfix 的監聽 IP 協議
    預設 CentOS 的 postfix 會去同時監聽 IPv4, IPv6 兩個版本的 IP,如果你的網絡環境里面僅有 IPv4 時,那可以直接指定 inet_protocols = ipv4 就會避免看到 :::1 之類的 IP 出現呦!

  • mydestination :設定『能夠收信的主機名』 (極重要)

    • 這個設定項目很重要!因為我們的主機有非常多的名字,那么對方填寫的 mail to 到底要寫哪個主機名字我們才能將該信件收下? 就是在這里規范的!也就是說,你的許多主機名當中,僅有寫入這個設定值的名稱才能作為 email 的主機地址。所以寫法為: mydestination = $myhostname,$mydomain
    • 如果你想要將此設定值移動到外部檔案,那可以使用類似底下的作法: mydestination = /etc/postfix/local-host-names ,然后在 local-host-names 里面將可收信的主機名寫入即可。一般來說,不建議你額外建立 local-host-names 這個檔案啦, 直接寫入 main.cf 即可說!特別留意的是,如果你的 DNS 里頭的設定有 MX 標志的話,那么請將 MX 指向的那個主機名一定要寫在這個 mydestination 內, 否則很容易出現錯誤訊息喔!一般來說,使用者最常發生錯誤的地方就在這個設定里頭呢!
  • mynetworks_style :設定『信任網段』的一項指標
    這個設定值在規定『與主機在同一個網段的可信任客戶端』的意思!保持默認,因為咱們可以從mynetworks設置。

  • mynetworks :規定信任的客戶端 (極重要)
    你的 MTA 能不能幫忙進行 Relay 與這個設定值最有關系!舉例來說,我要開放本機與內部網域的 IP 時,就可以這樣進行設定: mynetworks = 127.0.0.0/8, 192.168.100.0/24。如果你想要以 /etc/postfix/access 這個檔案來控制 relay 的用戶時,建議你將上述的數據改寫成這樣: mynetworks = 127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access 然后你只要再建立 access 之后重整成數據庫后,嘿嘿!就能夠設定 Relay 的用戶!

  • relay_domains :規范可以幫忙 relay 的下一部 MTA 主機地址

    • 相對於 mynetworks 是針對『信任的客戶端』而設定的,這個 relay_domains 則可以視為『針對下游 MTA 服務器』而設定的。舉例來說,如果你這部主機是 www.niki.centos.jet 的 MX 主機時, 那你就得要在 relay_domains 設定針對整個 niki.centos.jet 這個領域的目標信件進行轉遞才行。 在預設的情況下,這個設定值是 $mydestination 。
    • 你必需要注意的『Postfix 預設並不會轉遞 MX 主機的信件』,意思就是說:如果你有兩部主機,一部是上游的 MTAup ,一部是下游的 MTAdown ,而 MTAdown 規范的 MX 主機是 MTAup,由於 DNS 的 MX 設定值與信件傳遞方向,我們知道任何想要寄給 MTAdown 主機的信件, 都會先經過 MTAup 來轉遞才行!此時如果那部 MTAup 沒有開啟幫 MTAdown 進行 relay 的權限時, 那么任何傳給 MTAdown 的信件將『全部都被 MTAup 所退回』!從此 MTAdown 就無法收到任何信件了。
    • 上一段的說明請您特別再想一想,因為如果你在大公司服務而且你的公司上、下游均有 mail server 時, 並且也有設定 MX 的狀況下,嘿嘿!這個 relay_domains 就很重要啦!上游的 MTA 主機必需要啟動這個設定。 一般來說除非你是某部 MTA 主機的 MX 源頭,否則這個設定項目可以忽略不設定他。 而如果你想要幫你的客戶端轉遞信件到某部特定的 MTA 主機時,這個設定項目也是可以設定的。 默認請您保留默認值即可。
  • alias_maps :設定郵件別名
    就是設定郵件別名的設定項目,只要指定到正確的檔案去即可,這個設定值可以保留默認值。

  • message_size_limit
    message_size_limit = 40000000 #設置單份郵件40MB

  • mailbox_size_limit
    mailbox_size_limit = 1000000000 #設置單用戶占用郵箱1GB

4. MTA收到一份信的動作

5. 作為MTA配置過程舉例

#配置前請確保iptables規則配置妥當,selinux已經關閉,如果是centos7,firewall也要關閉。
iptables -A INPUT -p TCP -i $EXTIF --dport  25  --sport 1024:65534 -j ACCEPT

[root@www ~]# vim /etc/postfix/main.cf
myhostname = www.centos.jet 
myorigin = $myhostname 
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname,$mydomain
mynetworks = 127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access
relay_domains = $mydestination
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/  #設置用戶郵箱目錄
# 其他的設定值就先保留默認值即可!

# 生成別名數據庫文件
[root@www ~]# postmap hash:/etc/postfix/access
[root@www ~]# postalias hash:/etc/aliases
# 檢查配置文件的語法是否有錯誤
[root@www ~]# /etc/init.d/postfix check   <==沒有信息輸出,表示沒有問題。

# 啟動與觀察 port number
[root@www ~]# /etc/init.d/postfix restart

假設要增加MTA的過濾機制

[root@www ~]# vim /etc/postfix/access
10.1.30.50		OK
.edu.com			OK
av.com			REJECT
192.168.2.  		REJECT
# OK 表示可接受,而 REJECT 則表示拒絕。

[root@www ~]# postmap hash:/etc/postfix/access
[root@www ~]# ls -l /etc/postfix/access*
#不必重新啟動 postfix,只要重新生成數據庫文件即可生效。

關於別名的配置(root權限配置)

#作用是將發給這些系統賬號的郵件發一份給root。
[root@www ~]# vim /etc/aliases
mailer-daemon:  postmaster
postmaster:     root
bin:            root
daemon:         root
#左邊是系統賬號,也是別名設置位置,右邊是root賬號,也是實際接收郵件的賬號。
#假如你的 MTA 內有一個實際的賬號名稱為 dmtsai ,這個使用者還想要使用 dermintsai 這個名稱來收他的信件, 那么你可以這樣做:
[root@www ~]# vim /etc/aliases
dermintsai:     dmtsai
# 左邊是你額外所設定的,右邊則是實際接收這封信的賬號!

[root@www ~]# postalias hash:/etc/aliases
# 信件會傳給 root 與 dmtsai 這兩個賬號!
[root@www ~]# vim /etc/aliases
root:		root,dmtsai  
[root@www ~]# postalias hash:/etc/aliases
#創建郵件組
[root@www ~]# vim /etc/aliases
student2011:	std001,std002,std003,std004...
[root@www ~]# postalias hash:/etc/aliases
#郵件別名除了填寫自己主機上面的實體用戶之外,其實你可以填寫外部主機的 email !
# 例如你要將本機的 dermintsai 那個不存在的用戶的信件除了傳給 dmtsai 之外,還要外傳到 dmtsai@mail.niki.centos.jet 時,可以這樣做:
[root@www ~]# vim /etc/aliases
dermintasi:	dmtsai,dmtsai@mail.niki.centos.jet
[root@www ~]# postalias hash:/etc/aliases

個人化的郵件轉遞(普通用戶): ~/.forward

#普通用戶將自己的郵件同時收一份到jet和dmtsai@mail.niki.centos.jet下。
[dmtsai@www ~]$ vim .forward
# 注意!我現在的身份現在是 dmtsai 這個一般身份,而且在他的家目錄下!
dmtsai
jet
dmtsai@mail.niki.centos.jet
[dmtsai@www ~]$ chmod 644 .forward
#該檔案所在用戶家目錄權限,其 group、other 不可以有寫入權限。
#.forward 檔案權限,其 group、other 不可以有寫入權限。

6. MTA的維護命令

[root@www ~]# postqueue -p   #查看MTA郵件隊列
[root@www ~]# cd /var/spool/postfix/maildrop 
[root@www maildrop]# postcat 5CFBB21DB  <==這個檔名就是 Queue ID
[root@www ~]# /etc/init.d/postfix restart
[root@www ~]# postfix flush

三. PostFix MRA服務器設定

1. 未加密的MRA設定

[root@www ~]# yum install dovecot
[root@www ~]# vim /etc/dovecot/dovecot.conf
# 找到底下這一行,大約是在第 25 行左右的地方,復制新增一行內容如下:
#protocols = imap pop3 lmtp
protocols = imap pop3
[root@www ~]# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = no   <==將第 6 行改成這樣!
[root@www ~]# /etc/init.d/dovecot start
[root@www ~]# chkconfig dovecot on
[root@www ~]# netstat -tlnp | grep dovecot
Proto Recv-Q Send-Q Local Address   Foreign Address   State    PID/Program name
tcp        0      0 :::110          :::*              LISTEN   14343/dovecot
tcp        0      0 :::143          :::*              LISTEN   14343/dovecot

2. 加密的MRA設定

# 1. 建立憑證:到系統提供的 /etc/pki/tls/certs/ 目錄下建立所需要的 pem 憑證檔:
[root@www ~]# cd /etc/pki/tls/certs/
[root@www certs]# make jet.pem
....(前面省略)....
Country Name (2 letter code) [XX]:CH
State or Province Name (full name) []:China
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:test
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your server's hostname) []:mail.centos.jet
Email Address []:wang_zengyi@126.com

# 2. 因為擔心 SELinux 的問題,所以請關閉selinux,並配置iptables規則
iptables -A INPUT -p TCP -i $EXTIF --dport 993  --sport 1024:65534 -j ACCEPT
iptables -A INPUT -p TCP -i $EXTIF --dport 995  --sport 1024:65534 -j ACCEPT

# 3. 開始處理 dovecot.conf,只要 pop3s, imaps 不要明碼傳輸的咯!
[root@www certs]# cp -a jet.pem /etc/pki/dovecot/jet.pem
[root@www certs]# vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes  
[root@www certs]# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = required                                
ssl_cert = </etc/pki/dovecot/jet.pem 
ssl_key =  </etc/pki/dovecot/jet.pem

[root@www certs]# vim /etc/dovecot/conf.d/10-master.conf
  inet_listener imap {
    port = 0   
  }
  inet_listener pop3 {
    port = 0  
  }

# 4. 處理額外的 mail_location 設定值!很重要!否則網絡收信會失敗:
[root@www certs]# vim /etc/dovecot/conf.d/10-mail.conf
#mail_location = mbox:~/mail:INBOX=/var/mail/%u 
mail_location = maildir:~/Maildir

# 5. 重新啟動 dovecot 並且觀察 port 的變化:
[root@www certs]# /etc/init.d/dovecot restart
[root@www certs]# netstat -tlnp | grep dovecot
Proto Recv-Q Send-Q Local Address  Foreign Address   State    PID/Program name
tcp        0      0 :::993         :::*              LISTEN   14527/dovecot
tcp        0      0 :::995         :::*              LISTEN   14527/dovecot


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM