1. 程式人生 > >運維筆記21 (郵件伺服器的搭建)

運維筆記21 (郵件伺服器的搭建)

概述:

雖然即時通訊工具諸如qq,微信之類的工具已經是大家和朋友溝通的首選了,但是在一些情況下,我們一定會使用到電子郵件這個東西,基本上國內大一點的網際網路公司都有電子郵件的服務,我們使用電子郵件的時候感覺非常便利,只用編輯標題,發件人,內容之後點擊發送,郵件就被送到了目的地,但其實這發郵件的過程中有一些很有意思的原理。下面我用圖片來描述一下使用者[email protected]發郵件給[email protected]的過程。


這個圖上面出現了幾個名詞,分別是,MUA,MDA,MTA,box(mailbox),MUA(Mail User Agent)就是郵件的客戶端,諸如網易的閃電郵,Mozilla的雷鳥等。MTA(Mail Transfer Agent)是郵件中轉站的意思,比如我們登陸網易的閃電郵客戶端,給一個使用qq郵箱的朋友發郵件,郵件傳輸的過程就是,先從我們的閃電郵客戶端本地傳送到網易的MTA,接下來網易的MTA轉發給騰訊的MTA,騰訊的MTA再把郵件送給qq郵箱的使用者,MTA上執行的軟體是smtp協議的實現,比如老牌的有sendmail,但現在大家長使用的是postfix,我們在後面會詳細介紹postfix的配置。MDA(Mail Delivery Agent)是分析所受到的郵件表頭或內容等資料,來決定郵件的去向,根據他的功能,他可以對垃圾郵件進行過濾。box(Mailbox)顧名思義,就是儲存客戶郵件的一般在/var/spool/mail/使用者賬號下。

1.postfix的簡單配置

就算大家沒有搭建過郵件伺服器,也一定聽說了,搭建郵件伺服器,需要DNS的支援,我簡略的說下原因。郵箱的地址大家一定見過,就是形如[email protected]這樣的,@前面的是使用者名稱字或者賬號,後面的則是郵件伺服器的域名,有了域名就需要解析成為ip地址,這下大家明白了吧,至於反向DNS對郵件伺服器的作用,大家只要記住是可以防範垃圾郵件的就可以。

[[email protected] ~]# hostnamectl | sed -n '1p' ; ifconfig | grep inet |sed -n '1p'
   Static hostname: mail.yan.com
        inet 172.25.254.203  netmask 255.255.255.0  broadcast 172.25.254.255
[[email protected] ~]# hostnamectl | sed -n '1p' ; ifconfig | grep inet |sed -n '1p'
   Static hostname: mail.momo.com
        inet 172.25.254.103  netmask 255.255.255.0  broadcast 172.25.254.255

這是我的作為MTA的兩臺主機,並且已經把各自域的MX記錄填寫好。

接下來介紹postfix的配置,咱們先看yan.com這臺的

 75 myhostname = mail.yan.com
 83 mydomain = yan.com
 99 myorigin = $mydomain
113 inet_interfaces = all
119 inet_protocols = all
164 mydestination = $myhostname, $mydomain, localhost

第一個引數myhostname和mydomain相當於變數的宣告,後面會有很多選項用到這兩個變數。myorigin(我的源頭)按照自面理解,就是源端地址的意思,也就是從這裡發出的郵件,源端地址都是[email protected]$mydomain。inet_interfaces

就是你監聽的埠,預設情況他只監聽lo也就是本地迴環介面,也就是隻能收到自己給自己發的郵件,如果想收到別人發給你的,需要改成all。inet_protocols是監聽的協議,有ipv4和ipv6我們選擇全部監聽。最後這個mydestination非常重要,是我們接收名字為什麼樣子的郵件,按照我這裡的寫法,我只會接收[email protected] [email protected] [email protected]的郵件。

上面修改的檔案是/etc/postfix/main.cf檔案,只要兩臺主機都修改了這幾個選項我們就可以進行郵件的傳送和接收了,來讓我們測試下

[[email protected] postfix]# mail [email protected]
Subject: hello
test
.
EOT
在yan.com主機下給momo.com的root使用者傳送郵件

檢視傳送郵件佇列

[[email protected] postfix]# mailq
Mail queue is empty
傳送佇列已經空了,說明郵件傳送出去了。

檢視momo.com主機收到郵件了嗎

>U  5 root                  Thu Dec  8 03:32  22/704   "hello"
& 5
Message  5:
From [email protected]  Thu Dec  8 03:32:37 2016
Return-Path: <[email protected]>
X-Original-To: [email protected]
Delivered-To: [email protected]
Date: Thu, 08 Dec 2016 03:32:37 -0500
To: [email protected]
Subject: hello
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: [email protected] (root)
Status: RO

test
這就是momo.com收到的郵件內容。

接下來切換第三臺主機

[[email protected] ~]# hostname
foundation3.ilt.example.com
通過telnet遠端登陸到yan.com上向momo.com傳送郵件。
[[email protected] ~]# telnet 172.25.254.103 25
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>
hello
.
250 2.0.0 Ok: queued as A60AE2462A8
這樣郵件就傳送過去了。

檢視一下momo.com上有沒有收到郵件

& 6  
Message  6:
From [email protected]  Thu Dec  8 03:49:38 2016
Return-Path: <[email protected]>
X-Original-To: [email protected]
Delivered-To: [email protected]
Status: R

hello
確實收到了。

2.postfix的詳細配置
2.1)限制發件人ip

需要編輯/etc/postfix下的access檔案

在最後一行新增

477 172.25.254.3    REJECT
將access變成postfix可以讀的格式。
[[email protected] postfix]# ls
access     canonical  header_checks  master.cf  transport
access.db  generic    main.cf        relocated  virtual
這個access.db就是postfix可以讀的格式

接下來告知主配置檔案,要載入這個access檔案

[[email protected] postfix]# postconf -d
這個命令可以顯示main.cf的所有選項,通過這我們過濾下需要的選項
[[email protected] postfix]# postconf -e "smtpd_client_restrictions = check_client_access hash:/etc/postfix/access"
通過這個命令可以給main.cf檔案新增選項。

重啟postfix

在第三臺主機上遠端登陸yan.com並且選擇傳送郵件給momo.com

mail from:[email protected]
250 2.1.0 Ok
rcpt to:[email protected]
554 5.7.1 <unknown[172.25.254.3]>: Client host rejected: Access denied

傳送失敗,因為第三臺主機的ip被限制了。

2.2)限制客戶端使用者

首先編輯sender檔案(如果沒有自行建立,其實也不一定是這個名字)內容如下:

[[email protected] postfix]# cat sender
[email protected] REJECT
[[email protected] postfix]# postmap sender
加密sender檔案

向main.cf新增限制接收者的選項

[[email protected] postfix]# postconf -e "smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender"
從第三臺主機遠端登陸yan.com,並以[email protected]為傳送者,[email protected]為接收者

mail from:[email protected]
250 2.1.0 Ok
rcpt to:[email protected]
554 5.7.1 <[email protected]>: Sender address rejected: Access denied

發現以momo.com的root使用者為傳送者身份無法傳送

2.3)限制收信人
還是先新增引數

[[email protected] postfix]# postconf -e "smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/dest"

dest檔案編輯同上一步的sender檔案
mail from:[email protected]
250 2.1.0 Ok
rcpt to:[email protected]
554 5.7.1 <[email protected]>: Recipient address rejected: Access denied
[email protected]傳送郵件發現無法傳送

3.郵件接收伺服器

剛才一直介紹的是郵件傳送伺服器postfix,一個完整的郵件伺服器體系,不止需要傳送郵件,還需要接收郵件,傳送郵件使用的是smtp協議埠號25;接收郵件所使用的協議有pop3,imap等使用的埠號分別是110,143。而實現這一協議的軟體我們使用dovecot(豆腐塊)。但是這兩個協議都是明文傳輸,隨著人們越來越重視網路安全,出現了這兩個協議的安全版本,埠號分別是995,993。
首先下載軟體

[[email protected] postfix]# yum install dovecot
編輯配置檔案/etc/dovecot/dovecot.conf
 24 protocols = imap pop3 lmtp
 49 disable_plaintext_auth=no
兩個選項分別為可以使用的郵件接收協議和開啟明文傳輸(使用明文傳輸是為了伺服器的配置方便)。
編輯郵件儲存位置。
/etc/dovecot/conf.d/10-mail.conf
mail_location = mbox:~/mail:INBOX=/var/mail/%u
重啟豆腐塊服務,讓我們來測試一下。
測試的話當然要有工具了,我們的工具就是一個郵件客戶端,我們先使用mutt這個字元介面的管理工具。後面會介紹圖形的客戶端。
[[email protected] ~]# mutt -f imap://[email protected]
用於和yan.com上的郵件伺服器連線
但是發現出現了Permission deny錯誤
在服務端檢視/var/log/maillog的日誌
Dec  8 06:38:49 mail dovecot: imap-login: Login: user=<dov>, method=PLAIN, rip=172.25.254.3, lip=172.25.254.203, mpid=9736, TLS, session=<Fxa+FCRDAgCsGf4D>
Dec  8 06:38:49 mail dovecot: imap(dov): Error: chown(/home/dov/mail/.imap, group=12(mail)) failed: Operation not permitted (egid=1001(dov), group based on /var/mail/dov - see http://wiki2.dovecot.org/Errors/ChgrpNoPerm)
Dec  8 06:38:51 mail dovecot: imap(dov): Disconnected: Logged out in=70 out=862
發現是dov的許可權無法讀取/home/dov/mail/.imap
我們先進入/home/dov/mail

[[email protected] mail]# ls -a
.  ..
原來就根本沒有.imap這個目錄,這就需要我們建立了,並在這個下面建立一個INBOX檔案,而且注意屬組,屬主都要是dov。


這樣就可以遠端使用郵箱了,而且這個郵件就是剛才發給dov的。
但是我們發現每個使用者如果都需要這個郵箱功能,那麼是不是每個使用者的家目錄都要上面新建立的檔案呢?如何新增呢?只要在/etc/skel檔案中新增好後,以後建立的使用者都會有上述的檔案了

4.postfix+mysql郵箱的虛擬使用者
我們郵件的使用者不應該是真機上的一個真實使用者,而應該只是資料庫中的一行資料,所以我們使用mysql和postfix搭配,建立虛擬使用者。
首先安裝好mariadb,之後建立好使用者資料庫

+---------------+----------+---------+----------------------------+
| username      | password | domain  | maildir                    |
+---------------+----------+---------+----------------------------+
| [email protected] | 123      | yan.org | /home/vmail/yan.org/admin/ |
+---------------+----------+---------+----------------------------+
並且給admin使用者授權查詢,建立,更新授權。

接下來修改配置postfix的配置檔案

virtual_mailbox_base = /home/vmail
virtual_uid_maps=static:666
virtual_gid_maps=static:666
virtual_alias_maps=mysql:/etc/postfix/mysql-alias.cf
virtual_mailbox_domains=mysql:/etc/postfix/mysql-domains.cf
virtual_mailbox_maps=mysql:/etc/postfix/mysql-mailboxs.cf
第一行代表郵箱的基檔案目錄,所以其實上面資料庫中的maildir可以改成/yan.org/admin/
第二,三行代表虛擬使用者在主機中的真實使用者的uid和gid。
最後三行分別是資料庫查詢檔案
根據username查詢username
根據domain查domain
根據username查maildir
相應的檔案寫法:

[[email protected] postfix]# cat mysql-alias.cf 
hosts=localhost
user=admin
password=123
dbname=email
table=mailuser
select_field=username
where_field=username
mysql-alias.cf
[[email protected] postfix]# cat mysql-domains.cf 
hosts=localhost
user=admin
password=123
dbname=email
table=mailuser
select_field=domain
where_field=domain
mysql-domains.cf
[[email protected] postfix]# cat mysql-mailboxs.cf
hosts=localhost
user=admin
password=123
dbname=email
table=mailuser
select_field=maildir
where_field=username
mysql-mailboxs.cf
之後向[email protected]傳送郵件,就可以在目錄中查詢到信的內容了,在傳送之前也可以使用postmap -q 查詢一下這些資料庫查詢檔案,看結果是否正確。
postmap -q "yan.org" mysql:/etc/postfix/mysql-domains.cf -q
yan.org
[[email protected] mail]# postmap -q "[email protected]" mysql:/etc/postfix/mysql-mailboxs.cf 
/home/vmail/yan.org/admin/
[[email protected] mail]# postmap -q "[email protected]" mysql:/etc/postfix/mysql-alias.cf
[email protected]
由於一開始的配置問題我們的mail傳送佇列積攢了好多傳送失敗的郵件,我們可以選擇從新發送,也可以選擇刪除
[[email protected] mail]# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
3B84C26BFD9      409 Thu Dec  8 08:07:31  [email protected]
                                                           (user lookup error)
                                         /home/vmail/yan.org/admin/@yan.com

4310C2462A9      405 Thu Dec  8 08:13:57  [email protected]
                                                           (user lookup error)
                                         /home/vmail/yan.org/admin/@yan.com

4692F26BFAF      409 Thu Dec  8 08:10:44  [email protected]
                                                           (user lookup error)
                                         /home/vmail/yan.org/admin/@yan.com
。。。省略

使用postsuper -d 郵件序列號可以刪除郵件

[[email protected] mail]# postsuper -d 13DC924747C
postsuper: 13DC924747C: removed
postsuper: Deleted: 1 message

使用postqueue -f 可以重新發送
但是現在卻只能在檔案中看一看郵件,可不可以用客戶端看呢?當然不可以,因為我們只是把傳送郵件,也就是smtp部分弄好了,但是收郵件部分還不可以。

5.dovecot+mysql

編輯

[[email protected] conf.d]# vim /etc/dovecot/conf.d/10-auth.conf 
#!include auth-sql.conf.ext
將這一行前面的註釋去掉

根據auth-sql.conf.ext的內容

# Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
  args = /etc/dovecot/dovecot-sql.conf.ext

我們去例子檔案中找一個dovecot-sql.conf.ext檔案複製到/etc/dovecot下
對這個dovecot-sql.conf.ext檔案進行修改

32 driver = mysql
70 connect = host=localhost dbname=email user=admin password=123
76 default_pass_scheme = PLAIN
105 password_query = \
106   SELECT username, domain, password \
107   FROM mailuser WHERE username = '%u' AND domain = '%d'
125 user_query = \
126  SELECT maildir,666 AS uid ,666 AS gid  \
127   FROM mailuser WHERE username = '%u'

接下來對conf.d/10-mail.conf修改
369 mail_location = maildir:/home/vmail/%d/%n
168 first_valid_uid = 666
175 first_valid_gid = 666

這時候重啟dovecot服務發現日誌中有一行很奇怪
Dec  8 09:29:42 mail dovecot: auth: Fatal: Unknown database driver 'mysql'
郵件竟然不知道有mysql,這時我們才知道我們少下載了一個外掛。
yum install dovecot-mysql.x86_64


現在可以使用telnet來驗證我們是否成功將dovecot和mysql聯合在了一起

+OK Dovecot ready.
user [email protected]
-ERR [AUTH] Plaintext authentication disallowed on non-secure (SSL/TLS) connections.
quit

出現了這樣一行,分析日誌後發現原因是在dovecot的主配置檔案中沒有開放對ip。
 48 login_trusted_networks = 0.0.0.0/0
就是這樣的一行。新增過後我們再來測試
+OK [XCLIENT] Dovecot ready.
user [email protected]
+OK
pass 123
+OK Logged in.
list
+OK 2 messages:
1 495
2 270
.

可以看到登陸成功,而且有兩封郵件。

6.使用雷鳥客戶端






相關推薦

筆記21 郵件伺服器搭建

概述: 雖然即時通訊工具諸如qq,微信之類的工具已經是大家和朋友溝通的首選了,但是在一些情況下,我們一定會使用到電子郵件這個東西,基本上國內大一點的網際網路公司都有電子郵件的服務,我們使用電子郵件的時候感覺非常便利,只用編輯標題,發件人,內容之後點擊發送,郵件就被送到了目的

筆記33 haproxy的配置,pacemaker高可用+haproxy

概述:之前的部落格中提到的一種負載均衡方式是lvs,lvs的配置簡單,減少了認為出錯的概率,而且軟體處在tcp/ip協議棧的第四層,可以對各種web應用服務,但是因為本身不支援正則表示式處理,不能做動靜分離。那麼今天的haproxy的優勢就體現出來了,能夠支援虛

筆記4使用者資訊涉及到的檔案,使用者管理命令,使用者許可權的下放,更新:關於useradd -b -d -m -k的一些理解和使用

概述:        理解多使用者,知道涉及使用者資訊的都有哪些檔案,使用者的管理命令,使用者許可權的下放。 1.什麼是使用者?        從日常生活中想的話,我們每個人都是當過使用者,去銀行你有個賬戶,對於銀行你就是個使用者,你的資訊被銀行記錄在資料庫(可以是任何介質

筆記41 zabbix3.2監控搭建(rhel6.5+nginx0.7+mysql5.7+php5.6+rpm安裝的zabbix3.2帶詳細排錯過程)

系統拓撲: zabbix伺服器環境: 系統版本:Red Hat Enterprise Linux Server release 6.5 (Santiago) nginx版本: nginx-0.7.69 mysql版本:mysql Ver 14.14

免費公開課-零基礎小白如何開始自己的Python之路王進老師

amp 趨勢 公開 開發 視頻 選擇 lock .com 系列 講師主頁:http://edu.51cto.com/lecturer/7787419.html【王進老師】微軟認證金牌講師,資深微軟技術專家,微軟售前顧問。長達七年的微軟授課經驗和項目經驗,在課程中融入豐富的企

俠客行杭州站沙龍回顧 | 雲時代下的管理實踐附乾貨下載

我們處在一個鉅變的時代,在雲端計算、大資料和物聯網等新技術、新理念不斷更新的大背景下,企業同時面臨著數字化和“網際網路+”轉型的雙重挑戰,企業對於“穩態IT”和“敏態IT”都提出了強烈的需求,如何推進雙態環境下的技術演進變成全行業共同面臨的難題。 在這樣一個“時空交錯”中,優雲軟體推出了一個名為

內網穿透ngrok伺服器搭建

轉載:https://blog.csdn.net/zhangguo5/article/details/77848658?utm_source=5ibc.net&utm_medium=referral 簡單來說內網穿透的目的是:讓外網能訪問你本地的應用,例如在外網開啟你本地http://1

日常管理技巧檢視負載 W

今天針對Linux系統管理做一個專題的記錄,以後會用的機率也是很大的,只要掌握必備的基礎知識,做初級系統管理員是不成問題的。 作為一個運維工程師、系統管理員,如果對自己的系統不瞭解的話,那怎麼排查問題呢?如果出現問題的話,肯定要查一下是什麼問題,哪裡的問題,系統的資源的耗費情況如何檢視。

一分鐘實現內網穿透ngrok伺服器搭建

簡單來說內網穿透的目的是:讓外網能訪問你本地的應用,例如在外網開啟你本地http://127.0.0.1指向的Web站點。 最近公司的花生殼到期了,要續費,發現價格一直在漲,都是5年以上的老使用者,旗艦版都沒有實現內網完全穿透,打算自己動手替換這個服務,中間走

Android視訊直播的實現包括伺服器搭建

http://blog.csdn.net/huaxun66/article/details/53427771 最近一段時間,視訊直播可謂大火。在視訊直播領域,有不同的商家提供各種的商業解決方案,包括軟硬體裝置,攝像機,編碼器,流媒體伺服器等。本文要講解的是如

Linux自動化之Cobbler自定義倉庫

之間 成對 aliyun 需要 fig kick emc pos var Cobbler?定義倉庫Cobbler會將指定的repo倉庫裏的.rpm包下載到本地,通過Cobbler安裝的系統會在本地生成對應的.repo文件,裏面的地址內容指向Cobbler的IP地址 實現該

筆記40 Linux系統監控之CactiCacti搭建,自動抓取cacti統計圖片指令碼

概述:監控系統在一個系統中十分重要,它會將很多重要的資訊,諸如記憶體資訊,cpu資訊,硬碟資訊集合在一起顯示出來,當系統出現問題的時候我們能及時定位並修復錯誤。今天介紹的監控系統是一款輕量級的監控系統Cacti,並附有python編寫的cacti統計圖片採集指令

Python自動化筆記:使用smtplib模組傳送電子郵件

執行環境:Python3.6,Windwos10 RS1,Pycharm 參考書籍—《Python自動化運維--技術與最佳實踐》劉天斯著 模組介紹 我們在監測系統狀態傳送警報資

Linux筆記網絡基礎知識

使用 可靠 height image inter 電話線 ppp協議 網址 esp 網絡基礎知識 一、基本概念 1.ARPANET & TCP/IP:以“軟件”技術將網絡硬件整合,使得不同的計算機或者數據可以通過這個軟件達成數據溝通(TCP/IP技術也被稱為Inte

DNS概述---筆記補充版

DNS概述---運維筆記(補充版)一·DNS概述 把域名翻譯成IP地址的軟件稱為域名系統,即DNS。它是一種管理名字的方法。 (1)域名系統(Domain Name System縮寫DNS,Domain Name被譯為域名)是因特網的一項核心服務,它作為可以將域名和IP地址相互映射的一個分布式數據庫,能夠使人

部署DHCP服務---筆記補充版

部署DHCP服務---運維筆記一?DHCP概述 (1)了解DHCP服務:Dynamic Host Configuration Protoco動態主機配置協議是由Internet工作任務小組設計開發的,專門用於為TCP/IP參數的協議。l(1) 使用DHCP的好處:① 減少管理員的工作量② 避免輸入錯誤

redis開發與筆記3

1、客戶端 通訊協議是建立在TCP協議之上的。Redis制定了RESP(REdis Serialization Protocol, Redis序列化協議) 實現客戶端與服務端的正常互動 (1)客戶端API。client .. 命令 client list。列出與Re

redis開發與筆記1

1、Redis特性與優點 速度快。redis所有資料都存放於記憶體;是用C語言實現,更加貼近硬體;使用了單執行緒架構,避免了多執行緒競爭問題。Redis使用了單執行緒架構和IO多路複用模型(epoll作為多路複用技術的實現,非阻塞IO)來實現。每次客戶端的請求都會經過傳送命

伺服器及配置2

埠並不是獨立存在的,它依附於正在執行的程序。某個程序開啟,那麼它對應的埠就開啟了,程序關閉,則該埠也就關閉了。下次若某個程序再次開啟,則相應的埠也再次開啟。而不要純粹的理解為關閉掉某個埠,不過可以禁用某個埠。同時在伺服器運維過程中,修改常用的一些服務的預設埠,

LINUX下郵件伺服器搭建SENDMAIL1.0

小編就喜歡直接寫步驟,相關概念以後完善的時候再寫。OK,就直接開始sendmail郵件伺服器的搭建。第一步還是看sendmail服務裝了沒有,執行下圖命令如果沒有安裝,還是用介面化的點點點吧,這種方式小編比較喜歡(這裡省去掛載光碟步驟,小編在以前也說過步驟)如果沒有安裝,就直