中小企業 Mail Server 實戰應用與觀念剖析(上)

作者:徐秉義(Albert Hsu)

本文上篇先從單機 Mail Server 收發郵件開始談起,進而提到使用客戶端收信相關的設定與調整,以及郵件安全相關的議題。

單機 Mail Server 收發郵件

先從最古早的單機電子郵件收發開始,主要是學習 mail 與 mutt 這兩個指令的常見使用方法與應用時機。

這裡使用的郵件帳號與 Linux 使用者帳號相同,密碼也是使用 Linux 系統的密碼,預設的使用者收信匣則是位於 /var/spool/mail/ 目錄下,每個帳號擁有與帳號名稱相同的檔案,例如帳號 foo 擁有 inbox(收信匣)檔案於 /var/spool/mail/foo。

溫馨提示:如果把 Mail Server 比喻成實際生活中的郵局,那麼 inbox 就像是放在郵局裡的郵政信箱。

使用 mail 指令來寄信

用 mail 指令來寄信是一個相當精簡的寄信方法,例如要寄信給這台電腦的 root 帳號,使用「mail root」即可,會出現『Subject:』(主旨)訊息,在此輸入主旨 Enter 後接著輸入內文,要結束輸入內文有兩個方法:一個是在新的一行開頭只輸入一個『 . 』;另一個方法是在新的一行開頭按下『Ctrl-d』都可以結束輸入內文(Cc:是問說副本有沒有要寄給誰,若沒有的話直接 Enter 即可)。

中小企業 Mail Server 實戰應用與觀念剖析(上)_职场

中小企業 Mail Server 實戰應用與觀念剖析(上)_剖析_02

溫馨提示:使用指令 mail 也可寄給外部郵件帳號,例如指令「mail foo@gmail.com」寄給 Gmail 的 foo 帳號,整體環境需配合對方才收的到,像是確認這台 Mail Server 能夠寄出去,且對方 Mail Server(例如:Google 的)『願意』收。

mail 指令收信

直接輸入「mail」指令就可以收信,在 & 符號模式下,輸入「?」有著簡單的說明:

中小企業 Mail Server 實戰應用與觀念剖析(上)_Mail_03

按鍵 Enter 用來讀取信件。

按鍵 h 列出信件標題,例如:h 200 列出 200 號附近的信件。

按鍵 d 刪除信件,除了一次刪除一封以外,還可以大量刪信,例如:d 12-18 刪除信件 12 到 18 封。

直接輸入『號碼』讀取此號碼信件,例如:123 讀取信件 123 號內文。

按鍵 q 離開 & 模式,已經讀取過的信件會改放在家目錄下的 mbox 檔案,尚未讀取的信件依舊存放在『/var/spool/mail/$USER』,$USER 指的是『使用者名稱』,例如:root 帳號對應 /var/spool/mail/root 檔案。

中小企業 Mail Server 實戰應用與觀念剖析(上)_职场_04

溫馨提示:若要重新讀取 mbox 信件的話,使用指令「mail -f mbox」即可。

在權限許可的情況下,可以利用 mail 搭配 -f 選項讀取其他帳號的信箱檔案,例如使用 root 執行指令「mail -f /var/spool/mail/foo」即可讀取 foo 帳號的信箱。

寄信時使用已經存在的檔案當作內文(搭配導向 < 符號)

剛才寄信輸入內文時,一行一行輸入是無法後悔的(意思是當您在輸入第三行的時候,無法倒退回去改第二行有錯誤的地方),要改善這個情況,建議先使用編輯器撰寫文字檔案,寫好後再使用導向符號(<)將此檔案當成郵件的內文(使用檔案代替鍵盤當作標準輸入)。

例如:指令「mail root < anaconda-ks.cfg」會將檔案 anaconda-ks.cfg 當成內文寄給 root,但信件主旨是空的;若要加上信件主旨,可使用 -s 選項,例:「mail -s "test mail" root < anaconda-ks.cfg」(郵件主旨是『test mail』)狀況顯示如下圖。

中小企業 Mail Server 實戰應用與觀念剖析(上)_剖析_05

將指令執行結果寄出通知信(搭配管線 | 符號)

遇到要將執行指令產生的結果,寄給某人做參考時,不需先行存檔再用上述方法寄送,可以直接利用管線 | 符號辦到;例:指令「pstree | mail -s "pstree command" root」會將 pstree 指令執行結果,交給 mail 當作內文寄給 root。

中小企業 Mail Server 實戰應用與觀念剖析(上)_Mail_06

請特別注意管線只處理標準輸出,不處理錯誤輸出,若是連錯誤輸出也要處理的話,可利用『2>&1』將錯誤輸出(代號2)重新導向到標準輸出(代號1)例:指令「pwdd | mail -s "pwdd command isn't exist" root」這封信件內文是空白的(螢幕上提示著『Null message body; hope that's ok』訊息),原因是沒有 pwdd 這個指令,產生的錯誤輸出是在螢幕上(也就是螢幕上顯示的『-bash: pwdd: command not found』訊息),而「pwdd 2>&1 | mail -s "pwdd command isn't exist" root」(加上了『2>&1』)信件變成有內文的,內文是 pwdd 指令的錯誤訊息。

中小企業 Mail Server 實戰應用與觀念剖析(上)_职场_07

指令寄信夾帶附加檔案(使用 mutt 的 -a 選項)

遇到命令模式寄信需要夾帶附加檔案,使用指令 mutt 會比 mail 來的方便,例如:指令「mutt -a anaconda-ks.cfg root」即夾帶 anaconda-ks.cfg 附加檔案;mutt 用起來會比 mail 人性化些,編輯內文預設是使用 vi(所以編輯完畢使用『ESC :wq』存檔離開)接著按下 y 寄出。

中小企業 Mail Server 實戰應用與觀念剖析(上)_剖析_08

mutt 有個 -x 選項使得 mutt 寄信類似 mail 模式(simulate the mailx send mode),應用在批次寄送信件相當方便;別小看這些指令寄信的方法,撰寫 shell scripts 搭配會員名單用來寄送會員信件或是自動寄送通知信是很方便的呢!

mutt 指令收信

直接輸入「mutt」指令就可以收信,在畫面上方有一行常用按鍵與其功能,例如按 q 離開、按 d 刪除信件等等,以及輸入「?」尋求使用說明:

中小企業 Mail Server 實戰應用與觀念剖析(上)_Server_09

mutt 類似 mail 亦支援 -f 選項指到某個郵件檔案(權限足夠即可讀取),例如指令「mutt -f /var/spool/mail/foo」讀取 foo 信件(foo 帳號需建立亦可寄一封測試信件給他)。

溫馨提示:mutt 支援 pop、imap、pops 與 imaps 等等通訊協定收信(功能類似一般的圖形介面郵件收發軟體)也是利用 -f 選項辦到,會在稍後架設好相關服務時介紹。

中小企業 Mail Server 實戰應用與觀念剖析(上)_剖析_10

收信相關 Client/Server 設定

現在的郵件使用者傾向使用 Web-Based 介面或圖形介面客戶端來收發電子郵件,使用圖形介面客戶端通常藉由 POP3 或 IMAP 通訊協定讀取 Server 上的信件,也因此 Server 要先開啟相關的服務才行,這個服務是『dovecot』。

溫馨提示:dovecot 照字面翻譯是『鴿舍』的意思,郵件可能與飛鴿傳書有關係吧!(應該是筆者想太多了~)

dovecot 基本操作與聆聽埠號

dovecot 預設沒安裝,使用指令「yum install -y dovecot」就可以裝好了(yum 在 RHEL5 要先設定正常才行喔!請參考筆者相關文件)。

使用指令「grep -Ew "pop3|imap|pop3s|imaps" /etc/services」觀察出底下這四個通訊協定使用的埠號(有 s 是加密的通訊方式,over SSL 之意)。

 

pop3 110/tcp POP version 3
imap 143/tcp Interim Mail Access Proto v2
imaps 993/tcp IMAP over SSL
pop3s 995/tcp POP-3 over SSL

在使用指令「/etc/init.d/dovecot restart」啟動的前後(首次停用的 FAILED 不影響設定),利用指令「netstat -na | grep -Ew "110|143|99[35]"」觀察 dovecot 預設就是聆聽這四個埠。

溫馨提示:亦可使用指令「netstat -nltp | grep -w dovecot」其中 netstat 的 l(小寫的 L)選項是顯示 LISTEN、t 是 tcp、p 是程式名稱,也就是因為改成顯示程式名稱所以後面 grep 的關鍵字變成『dovecot』。

使用指令「chkconfig dovecot on」設定下次開機自動啟動。

中小企業 Mail Server 實戰應用與觀念剖析(上)_职场_11

防火牆的設定要記得開那四個埠且為 tcp 通訊協定,使用指令「system-config-securitylevel」開啟防火牆設定畫面。

中小企業 Mail Server 實戰應用與觀念剖析(上)_Mail_12

客戶端測試連線(使用 mutt 指令)

在另一台電腦(也就是 Client 端)使用 mutt 測試方法如下:

指令「mutt -f pop://172.18.0.108/」接著輸入 Mail Server 的帳號密碼即可 POP3 方式收信,其中 172.18.0.108 是 Server 的 IP 位址,也可以使用主機名稱(需正確解析成 Server IP 位址)。

收信時不能用 root 收,需使用一般帳號,例如:使用 foo 帳號來登入收信並輸入正確的密碼,請注意使用者密碼要先在 Server 上設定完成(例如:在 Server 上使用指令「passwd foo」)。

除了 pop(這就是 POP3)通訊以外,mutt 亦支援 imap、pops 和 imaps 等等通訊方式,例:指令「mutt -f imaps://172.18.0.108/」使用 IMAP over SSL 方式收信。

溫馨提示:特別注意 mutt -f 使用『pop3、pop3s』(多了3)這兩個通訊會失敗,錯誤訊息『No such file or directory (errno = 2)』。

中小企業 Mail Server 實戰應用與觀念剖析(上)_休闲_13

如果懶得每次輸入帳號密碼的話,可以加在指令列中,以郵件帳號 foo、密碼 f 為例:

指令「mutt -f pop://foo@172.18.0.108/」指明收件帳號 foo。

指令「mutt -f pop://foo:f@172.18.0.108/」指明收件帳號 foo 且密碼為 f。

中小企業 Mail Server 實戰應用與觀念剖析(上)_剖析_14

溫馨提示:上述使用方法類似 http、ftp 擁有 URI(Uniform Resource Identifier)表示方式,例如:『ftp://username:password@hostname/』。

實際在使用 mutt 當作郵件客戶端的時候,通常 DNS 也都解析正確無誤,我們就會用『主機名稱』而不使用 IP 來連線,要小心以下所說的誤解:

例如指令「mutt -f pop://foo@mail.foo.com.tw/」其中『mail.foo.com.tw』會解析成郵件主機 IP 位址即可連線(正確的使用方法)。

而指令「mutt -f pop://foo@foo.com.tw/」很容易將『foo@foo.com.tw』誤解成 e-mail 帳號;實際上『foo.com.tw』同樣需解析出其 IP 位址才可以連線(例如 foo.com.tw 有個 A 紀錄指向郵件主機 IP),若是沒辦法解析就會導致連線失敗。

圖形介面客戶端 thunderbird 設定畫面介紹

在 GUI 客戶端郵件軟體 thunderbird 有關收信的設定畫面如下圖:

收信伺服器類型有 POP 或 IMAP 供我們二選一,下方輸入『收信伺服器』主機名稱或 IP 位址,實務上通常都用主機名稱居多,例如:mail.foo.com.tw。

中小企業 Mail Server 實戰應用與觀念剖析(上)_职场_15

收信使用者名稱則是輸入在下一個頁面(如下圖),例如:foo。

中小企業 Mail Server 實戰應用與觀念剖析(上)_剖析_16

圖形介面客戶端 evolution 設定畫面介紹

在功能更強大的 GUI 客戶端郵件軟體 evolution 有關收信設定畫面如下圖:

收信的伺服器類型支援 POP 與 IMAP 以及其他更多種類。

中小企業 Mail Server 實戰應用與觀念剖析(上)_Mail_17

下圖是選擇 IMAP 收信伺服器類型後,組態輸入收信伺服器主機名稱或 IP 位址,例如:mail.foo.com.tw;以及收信使用者名稱,例如:foo。

中小企業 Mail Server 實戰應用與觀念剖析(上)_剖析_18

客戶端 telnet 測試 POP3 服務

遇到使用 mutt 或圖形介面軟體測試並未得到該有的結果或是連線無法建立,建議使用 telnet 指令來測試 Server 端有無反應或是測試驗證是否成功。

例如使用指令「telnet 172.18.0.108 110」針對 Server IP 是 172.18.0.108 的 110 埠(POP3 預設使用 110 port)連線。

回應的如果是『No route to host』也許是被 Server 防火牆擋住,在 Server 上使用指令「system-config-securitylevel」設定開放即可(如同先前所介紹)。

回應的如果是『Connection refused』也許是 dovecot 服務尚未啟動,在 Server 上使用指令「/etc/init.d/dovecot restart」重新啟動即可。

正常的回應是『+OK Dovecot ready.』可輸入 POP3 指令「user foo」(使用帳號 foo)、「pass f」(筆者 foo 帳號,密碼是 f)測試登入,若登入成功使用指令「list」列出 Server 上的信件、「quit」指令是用於結束 POP3 連線。

中小企業 Mail Server 實戰應用與觀念剖析(上)_休闲_19

客戶端 telnet 測試 IMAP 服務

欲使用 telnet 測試 IMAP 連線與 POP3 相當類似,例如使用指令「telnet 172.18.0.108 imap」針對 Server IP 是 172.18.0.108 的 IMAP 埠(IMAP 預設使用 143 port)連線。

正常的回應是『* OK Dovecot ready.』可輸入 IMAP 指令「. login foo f」(使用帳號 foo、密碼 f)測試登入、「. logout」指令是用於結束 IMAP 連線。

溫馨提示:telnet 指令第二個參數用埠號(例:110)或是用通訊協定名稱(例:imap)皆可,名稱會被轉成埠號是因為在 /etc/services 裡面有定義『通訊協定名稱預設所使用的埠號』。

中小企業 Mail Server 實戰應用與觀念剖析(上)_Server_20

遇到 telnet 連線後卻無法斷線的窘境時(或者說是突然忘記如何下結束連線指令時)可使用「Ctrl-]」(Ctrl 按住之後按右邊的中括號)再輸入 quit 即可。

溫馨提示:telnet 指令執行後顯示訊息『Escape character is '^]'』其中 ^ 是 Ctrl 之意,合起來就是「Ctrl-]」。

中小企業 Mail Server 實戰應用與觀念剖析(上)_职场_21

郵件帳號建立與通訊安全

此時登入郵件伺服器所使用的帳號密碼同時也就是 Linux 系統的帳號密碼,這意味著使用此組帳號密碼不僅僅能夠收信,還可以 ssh 或 telnet 到主機上執行系統指令,為了防止郵件帳號使用 Linux 指令介面,強烈建議將介殼由原先『/bin/bash』改成『/sbin/nologin』。

溫馨提示:開放登入執行系統指令會使得主機安全受到很大的威脅。

使用 chsh 指令修改介殼

使用指令「chsh foo」即可修改 foo 帳號的介殼,接著輸入『/sbin/nologin』即可。

我們可試試更改介殼之後的差異,使用指令「ssh foo@172.18.0.108」登入雖然密碼正確認證成功,但卻無法執行系統指令,出現『This account is currently not available.』訊息並結束連線。

溫馨提示:上述修改以不影響原先的收信功能為原則。

中小企業 Mail Server 實戰應用與觀念剖析(上)_Mail_22

使用 vipw 指令修改介殼

「vipw」指令顧名思義是使用 vi 編輯 /etc/passwd 之意,系統預設值使用 /etc/passwd 當作使用者資訊,檔案內容有記載使用者用哪個介殼。

舉例來說:我們可以利用指令「finger foo」觀察使用者 foo 的介殼是哪個,介殼通常是 /bin/bash 不然就是 /sbin/nologin 其他種類的介殼就比較少用了。

若是使用指令「grep foo /etc/passwd」過濾出 foo 相關的那幾行,以底下的例子來說會發現『foo:x:500:500::/home/foo:/sbin/nologin』這一行,於是使用 vipw 就是改這行的最後一個欄位(欄位是以冒號 : 做為分隔符號)這欄位也就是定義使用者所用的介殼。

若是將 foo 的介殼改回 /bin/bash 又變得可以登入打指令囉!

中小企業 Mail Server 實戰應用與觀念剖析(上)_剖析_23

建立郵件帳號時順便設定介殼是 /sbin/nologin

我們可以利用 useradd 的 -s 選項指明使用者的介殼,例如指令「useradd -s /sbin/nologin foo2」建立帳號 foo2 且介殼是 /sbin/nologin。

中小企業 Mail Server 實戰應用與觀念剖析(上)_职场_24

POP3 與 IMAP 通訊時資安考量

預設的 POP3 與 IMAP 都是採用明碼傳輸,有心人士想要利用抓封包看內容來探取郵件帳號密碼還蠻容易的,底下是以軟體 wireshark 來抓取 POP3 封包的範例。

wireshark 預設沒安裝,使用指令「yum install -y wireshark」就可以裝好了。

使用指令「tshark -R 'tcp.port eq 110'」針對 TCP 埠號 110 的封包來觀察。

由下圖看到先前介紹的 POP3 指令「USER foo」、「PASS f」以及『+OK Logged in.』登入成功的訊息,這樣就『擷取』到別人的郵件帳號密碼囉!

溫馨提示:封包必須要被執行 tshark 這台主機取得才能分析。

中小企業 Mail Server 實戰應用與觀念剖析(上)_职场_25

這隻纜線(wire)鯊魚(shark)亦有 GUI 介面,使用指令「yum install -y wireshark-gnome」補裝套件之後,執行「wireshark」就會出現圖形介面如下。

中小企業 Mail Server 實戰應用與觀念剖析(上)_Server_26

溫馨提示:wireshark 前身即是 ethereal;另外還有個 tcpdump 也是指令模式下知名的(老字號的)封包擷取軟體。

介紹 wireshark 並不是為了要取得別人的帳號密碼,而是要建議收信時由原先明碼方式改用加密連線,這樣子會比較安全喔!