[TOC] ###### tags: `lsa` # Mail Server - 什麼是 mail server ? - 專門寄送、接收 email 的服務 - 你就可以寄信給世界各地的任何人 <!-- > 當你寄 email 的時候,它會經過一連串 server 才會到達最終目的地 --> - Email 的位址寫法 - `帳號@主機名稱` - 例如:`lin@gmail.com` ## 郵件傳輸過程中經過的節點與使用的 Protocol  ### 寄信 - MUA (Mail User Agent) - 郵件使用者代理人 - 功能 - 寄送、接收 mail server 的電子郵件 - 例如:Linux 的 Kmail - MTA (Mail Transfer Agent) - 郵件傳送代理人 - 使用 SMTP (port 25) 或是 SMTPs (port 465/port 587) - 功能 - 轉遞信件 - 如果信的目的地是本機上的使用者,那信就直接送到該使用者的 mailbox 下 - 如果信的目的地不是本機上的使用者,那就需要將信轉送給下一台 MTA :::info **MX (Mail eXchanger)** - DNS 上的一個記錄,用來解析 Email 中 `@` 後的主機名稱 - 當郵件傳送出去時,會先看這個 domain name 的 MX 紀錄是甚麼 - 找到 MX server 後,就將信傳送過去 - 假設寄信給 BT (`BlueT@BlueT.org`) -  -  -  <!-- 有很多台的話就依照優先權選一台,作為送信的目的,如果都沒有的話,就會用最原本的 BlueT.org 當作目的,如果還是沒有就回復失敗,給寄件人 --> ::: - MDA (Mail Delivery Agent) - 郵件遞送代理人 - 掛在 MTA 下的一個小**程式** - 功能 - 分析 MTA 收到這封信的 header 或內容等資料,決定這封郵件的去向 - 過濾垃圾信件 - 根據這封信件的 header,或是特定的信件內容來分析過濾 - 例如:AV 情色 - 自動回覆 - Mailbox - 電子信箱 - Linux 系統預設的信箱放在 `/var/spool/mail/使用者帳號` - Protocol - SMTP (Simple Mail Transfer Protocol) - port - 25:預設的 SMTP port 號 <!-- 但很多 ISP (Internet Service Provider 網際網路連線服務公司) 避免客戶發送垃圾電郵,很多 ISP 將客戶的 port 25 封鎖,現在 port 25 主要用作 server to server 傳送郵件 --> - 465:透過 SSL 加密 - 587:透過 TLS 加密 <!--最新的標準是使用 port 587--> - 用途:寄送電子郵件 #### 一般寄信法 ```s= telnet localhost 25 # 使用 localhost,25 port 進行連線 # 220 squidxoxo-VirtualBox ESMTP Postfix 代表成功連線 helo gmail.com # helo 跟他說個嗨 誰? gmail.com # 250 squid-VirtualBox mail from: {username} # 信件來自誰 @ 前面的名稱 rcpt to: {收件人 email} # 信件給誰 完整的 email 名稱 data # 信件內容 Subject: Title # 標題 content # 內容 # 兩個換行 + 一個 . 結束這回合 # 離開 quit ``` ### 寄信過程 :::success **情境** - 秋分要寄信給魷魚 - 寄信人:chofinn@gmail.com - 收信人:squid@yahoo.com.tw :::  - 步驟 0:寄件人取得 MTA 的使用權限,註冊一組可使用的帳號、密碼 - 步驟 1:寄件人透過 MUA 寫信,然後傳送至自己的 MTA 上 - 信件的主要資料 - 信件標頭:包括寄件者與收件者的 email 位址、信件的主旨等 - 信件內容:你要跟對方說明的內容 - 編寫完畢,按下傳送,這封信就會送至你的 MTA 伺服器上 - 注意:是你的 MTA 而不是對方的 MTA ! - 步驟 2-1:如果這封信的目的地是本機 MTA 使用者的帳號,MDA 就直接將這封信送到該使用者地 Mailbox - 步驟 2-2:如果這封信目的地為其他 MTA ,則開始 Relay - MTA 開始分析該封信是否具有合法的使用權限 - 有權限:MTA 將信寄給下一部 MTA 的 SMTP (port 25) - 步驟 3:收件方的 MTA 接收寄件方發出的信,並將信放到正確的使用者信箱中 - 收件方的 MTA 收到寄件方的信後,MDA 會將這封信送到魷魚的 Mailbox,等魷魚登入讀取、下載 <!-- :::info 這封信最後是停留在收件方 MTA 上,並不是在收件人 MUA 上! 所以 MUA 不必一直開著!要收信時再打開就可以 ::: --> ### 收信 - MRA (Mail Retrieval Agent) - 透過 POP3 或 IMAP 接收信件 <!-- - 包含在 mail server 中 --> - Protocol - POP3 (Post Office Protocol version 3) - port - 不安全:110 - 安全:995,透過 TLS/SSL 加密 - 從 mail server 下載所有郵件 - 郵件下載到電腦上後,mail server 就會將使用者 mailbox 內的資料刪除 - 已傳送的郵件不會存在 mail server 中,而是存在你的本機上 <!-- 所以只能使用同一台電腦來存取該郵件,如果用不同裝置存取電子郵件,你就看不到之前下載的信了~ --> - IMAP (Internet Message Access Protocol) - port - 不安全:143 - 安全:993,透過 TLS/SSL 加密 - 從 mail server 上讀取信件 - 讓你在任何地方、使用任何裝置,都能夠存取電子郵件 - 除非你點下載的按鈕,要不然不會自動下載信件 #### 一般收信法 ```s= # postfix 是透過 SMTP 的 MTA,沒有 POP3 及 IMAP,要另外安裝 dovecot 等 mail server telnet localhost 110 user {UserName} pass {明文寫的密碼} list # 列出收件匣內的信件,以編號顯示 retr [Num] # 選擇想要看的信件 ``` :::info - SMTP、POP3、IMAP 明文傳送 :point_right: 不安全 - 可能會因為 Man-in-the-middle 導致電子郵件內容改變 - 郵件偽造 <!-- 假裝自己是校長宣布現在開始放寒假--> - 病毒郵件 - 帳號密碼會被攔截 - 所以發展出加密的通訊協定 SMTPs、POP3s、IMAPs ::: ### 收信過程 :::success **情境** - 魷魚要收信 - 寄信人:chofinn@gmail.com - 收信人:squid@yahoo.com.tw :::  - 步驟 1:MUA 透過 POP3(port 110)/IMAP(port 143) 協定連接到 MRA, 並且輸入帳號與密碼來取得正確的認證與授權 - 步驟 2:MRA 確認使用者帳號、密碼沒有問題後,會前往該使用者的 Mailbox (`/var/spool/mail/使用者帳號`) 取得使用者的信件並傳送到使用者的 MUA 軟體上 ## Postfix - 為了比 sendmail 更好而開發的 - sendmail 缺點:效能不理想、不夠安全、設定檔 `sendmail.cf` 難以理解 - MTA、SMTP server/client - 運行在 Unix-like OS 上 - 第二常用的 mail server(第一名是 Exim) - Exim 自訂性高,可以根據需求進行複雜的設定 - Postfix 新手友善,容易配置 - 設計目標: - 兼容性 - 基本 100% 相容 sendmail 的檔案 - 穩定性 - 在 overload 的情況下仍可保證程式的可靠性。當沒有足夠的空間或記憶體時,postfix 會選擇直接放棄,而不是重試 - 靈活性 - 由多個 module 組成,可依照需求安裝需要的 module - `apt search postfix | grep postfix` - 安全性 ### 安裝 - `sudo apt install postfix` -  - `No configuration` - `Internet site` 透過 SMTP 進行寄信,可以收外面的信,也可以收 local 內使用者互相寄的信 - 一般公司或單位用 - `Internet with smarthost` 要寄到外面的信件會經由其他 mail server 來轉發 - 想要透過外部 server(google.com 之類的)來幫忙寄信 - `Satellite system` local 內及外面的信件都由其他 mail server 轉發 - 跨國公司常用,假設主機在美國,可以透過其他地方的 Satellite System 來寄送 - `Local only` 只有主機內使用者可以互相寄信 - 一般主機、家用電腦、測試用 - `sudo dpkg-reconfigure postfix` 看詳細設定檔(直接看 main.cf 也可以) - `System mail name` 寄信出去時要顯示的名稱 -  -  - 寄到 root 跟 postmaster 的信件會被轉寄到哪個使用者 -  - 寄到主機內的信件是這些 domain 的才會接收 -  - 這些位址可以直接寄信給這台 mail server - Local address extension character - 表示忽略**符號**後的內容 - 可用於內部信件分流 > ta+squidxoxo@lsa.kija => ta@lsa.kija > ta+s110213518@lsa.kija => ta@lsa.kija - `netstat -ntupl | grep :25` 有看到 TCP 在聽 25 的話,恭喜你 postfix 安裝成功了 :::warning Postfix 重要檔案/目錄 - `/etc/postfix/main.cf` 主要設定檔 - `myorigin=/etc/mailname` 希望用在 **@** 後面的名稱 - 配置 SMTP 的 domain name - `myhostname` email 中 **@** 後面的部分,主機名稱 - 安裝 postfix 這台主機的名稱 - `inet_interfaces` SMTP 要聽的 IP 位址。**all** 代表聽所有的網路介面。如果有重複設定項目時,會以最晚出現的設定值為準 - `mydestination` 在許多的主機名稱中,寫入這個設定值的名稱才能被作為 email 的主機名稱 - DNS 的設定裡有 MX 的話,指向的那台主機一定要寫在 mydestiantion 裡面 - `mynetworks` 設定可以用這個 server 做轉發的用戶 - `relayhost` 設定將所有寄出的信件給某台 server 做轉發 - `/etc/mailname` 系統預設的 server name - `/etc/aliases` 信箱的別名,可以設成群組,一次寄給很多人 - `/var/mail/{userName}` 收件匣 - `/var/spool/postfix` 寄件 Queue ::: ### 利用 telnet 寄信 #### 群組寄信法 - 新增 alias 紀錄 ```s= sudo vim /etc/aliases jobs: {user_name}, {完整 email 地址}, root ``` - renew aliases.db & reload postfix ```s= sudo postalias hash:/etc/aliases # postalias 用來更新 db 的指令 後面是要更新的 db sudo service postfix reload ``` ### mbox vs. Maildir - mbox 是個檔案,如果掛掉了,所有信件都沒了,因此轉為 Maildir (目錄),單一郵件檔毀損的話也沒關係 - 先看 /var/mail 裡面,自己的信件紀錄 - 新增一個要拿來放 Maildir 的資料夾 - mbox to maildir `sudo apt install mb2md` - [不會用就看 man](https://www.unix.com/man-page/debian/1/MB2MD/) - `sudo mb2md -s /var/mail/squidxoxo -d /var/mail/squidxoxo-dir/` - 可以下載一個指令 `tree` 看資料夾下的東西更方便 ## 參考連結 - [email history](https://phrasee.co/blog/a-brief-history-of-email/) - [前人筆記 - Mail Server 介紹](https://hackmd.io/52PTLHqTRl-lusp9z9dlDQ?view) - [鳥哥 - 郵件伺服器: Postfix](https://linux.vbird.org/linux_server/centos6/0380mail.php#whatmail_dns) - [前人筆記 - Mail Server 實作](https://hackmd.io/HfnUzUQjSqeXF-u8t_CiYA?view) - [鳥哥 - 設定郵件伺服器(Mail Server)](https://linux.vbird.org/linux_server/redhat6.1/linux_25mailsendmail.php) - [What Is an Email Server? Definition, How It Works, Why You Need One](https://www.axigen.com/articles/what-is-an-email-server_107.html) - [Simple Mail Transfer Protocol (SMTP)](https://www.geeksforgeeks.org/simple-mail-transfer-protocol-smtp/) - [What is the difference between SMTP and SMTPS?](https://www.agari.com/blog/smtps-how-to-secure-smtp-with-ssl-tls-which-port-to-use) - [Introduction to POP3 & IMAP ](https://www.knownhost.com/kb/introduction-to-pop3-imap/) - [何謂 Mail Exchanger (MX) ?](http://channel.synnex.com.tw/asp/fae_qaDetail.asp?from_prg=&topic=FAE&group=&parent=&classifyid=01534&seqno=17451)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up