Mail Server 征服指南 (三) 第二章:基礎建設篇——DNS、SSL 與資料庫

因為我們在同一台 EC2 上同時運行 Web 與 Mail 服務,這章的重點在於讓兩者和平共處。

1. DNS 設定 (A 與 MX)

請確保您的 DNS 紀錄包含以下兩者,並指向同一個 EC2 IP

類型名稱用途
A@ (mydomain.com)YourIP給網站用 (Web)
AmailYour IP給郵件主機用 (Hostname)
MX@mail.mydomain.com指定郵件由 mail 子網域負責

2. 設定系統 Hostname

我們將系統名稱設為 mail,以利 Postfix 識別。

sudo hostnamectl set-hostname mail.mydomain.com

編輯 /etc/hosts,在 127.0.0.1 localhost 下一行加入:


127.0.0.1 mail.mydomain.com mail

系統的hostname對於Mail server很重要,這會在後面設定Postfix的時候解釋,現在請直接照著設定。這個設定並不會影響任何其他正在運作的服務(如Nginx/Apache、DNS 等等),請安心修改。

3. 透過免費的Let’s Encrypt申請 SSL 憑證 (Webroot 模式)

因為您的 Nginx/Apache 正在佔用 Port 80,我們使用 Webroot 模式。這會請求 Web Server 幫忙驗證,而不需要暫停網站服務。

假設您的 Web Server 根目錄在 /var/www/html (請根據實際情況調整):

# 安裝 certbot
sudo apt update
sudo apt install certbot -y

# 申請憑證 (注意:這裡是申請 mail 子網域的證書)

sudo certbot certonly --webroot -w /var/www/html -d mail.mydomain.com

注意:如果您的網站已經有 SSL 了(例如 www.mydomain.com),這次申請是為了給 Mail Server 用的,所以我們特地申請 mail.mydomain.com。這兩個證書是分開的,互不影響。

如果申請成功,你會看到 Congratulations! 的訊息,並且憑證會存放在:

  • 公鑰 (Certificate): /etc/letsencrypt/live/mail.mydomain.com/fullchain.pem
  • 私鑰 (Private Key): /etc/letsencrypt/live/mail.mydomain.com/privkey.pem

記下這兩個路徑,我們在設定 Postfix 和 Dovecot 時會頻繁用到它們。

4. 安裝與初始化 MariaDB

最後,我們來建立儲存帳號密碼的資料庫。

安裝 MariaDB:

sudo apt install mariadb-server -y
sudo systemctl start mariadb
sudo systemctl enable mariadb

執行安全設定(設定 root 密碼):


sudo mysql_secure_installation

5. 建立郵件資料庫結構

我們不使用 Linux 系統帳號,而是用資料庫來管理「虛擬使用者」。 登入 SQL:

sudo mysql -u root -p

請依序輸入以下 SQL 指令(記得將 password 換成你自訂的強密碼):

-- 1. 建立資料庫
CREATE DATABASE mailserver;

-- 2. 建立郵件系統專用使用者 (mailuser)
CREATE USER 'mailserver'@'127.0.0.1' IDENTIFIED BY 'passwordyouchoose';

-- 3. 賦予查詢權限 (只給 SELECT,安全性更高)
GRANT SELECT ON mailserver.* TO 'mailserver'@'localhost';
FLUSH PRIVILEGES;

-- 4. 進入資料庫
USE servermail;

-- 5. 建立網域表 (Virtual Domains)
CREATE TABLE `virtual_domains` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 6. 建立使用者表 (Virtual Users)
CREATE TABLE `virtual_users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `password` varchar(150) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 7. 建立別名表 (Virtual Aliases)
CREATE TABLE `virtual_aliases` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `source` varchar(100) NOT NULL,
  `destination` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

為了方便之後測試,我們先寫入一筆假資料(請換成你的網域):

-- 假設你的網域是 mydomain.com,密碼暫時用明碼 '123456'
INSERT INTO virtual_domains (id, name) VALUES (1, 'mydomain.com');
INSERT INTO virtual_users (id, domain_id, password, email) VALUES (1, 1,'123456','user@example.com');

輸入 exit 離開。


這樣一來,我們的基礎建設 (Infrastructure) 就全部完成了! 我們現在有了:

  • 正確的地址 (DNS & Hostname)
  • 安全的加密憑證 (SSL)
  • 儲存使用者的倉庫 (MariaDB)

第一章:架構規劃與環境準備

第二章:基礎建設篇——DNS、SSL 與資料庫

第三章:郵差的武裝——安裝 Postfix 並連接資料庫

第四章:安裝與設定 Dovecot (最後一塊拼圖)。

第五章:驗收時刻——全流程測試

第六章:設定 AWS SES Relay (讓信件使命必達)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料