在云服务器端口25受限环境下部署Mailcow邮件服务器

背景与挑战

在现代云计算环境中,主流云服务提供商(如GCP、AWS)为了防止垃圾邮件传播,普遍禁用了虚拟机实例的端口25出站流量。这给自建邮件服务器带来了巨大挑战。本文记录了在这种受限环境下,通过日本ConoHa.jp服务器作为SMTP中继,成功部署Mailcow邮件服务器的完整过程。

系统架构设计

graph TB
    subgraph "外部网络"
        Client[用户客户端
IMAP/SMTP] ExtMail[外部邮件服务
Gmail/Outlook] Internet[互联网] end subgraph "ConoHa 中继服务器 (10.8.0.34)" ConoHA[Ubuntu Server
Postfix + iptables] VPN1[OpenVPN Client] end subgraph "Mailcow 服务器 (10.8.0.33)" Mailcow[Mailcow Docker
Postfix + Dovecot] VPN2[OpenVPN Client] end subgraph "VPN 隧道网络 (10.8.0.0/24)" VPNTunnel[加密隧道] end %% 连接关系 Client -->|IMAP/SMTP 连接| ConoHA ConoHA <-->|VPN 隧道| VPNTunnel VPNTunnel <-->|VPN 隧道| VPN2 VPN1 -.-> VPNTunnel VPN2 -.-> Mailcow ConoHA -->|端口转发| Internet Internet <-->|SMTP| ExtMail %% 数据流标注 Client -.->|1\. 用户连接
端口: 993,143,587,465| ConoHA ConoHA -.->|2\. 入站邮件转发
端口: 25| Mailcow Mailcow -.->|3\. 出站邮件中继
relayhost: 10.8.0.34:25| ConoHA ConoHA -.->|4\. 外网发送
端口: 25| ExtMail style Client fill:#e1f5fe style ExtMail fill:#e8f5e8 style ConoHA fill:#fff3e0 style Mailcow fill:#f3e5f5 style VPNTunnel fill:#e0f2f1

数据流向说明:

  1. 入站邮件: 外网 → ConoHa(iptables DNAT) → VPN → Mailcow
  2. 出站邮件: Mailcow → VPN → ConoHa(Postfix relay) → 外网
  3. 用户连接: 客户端 → ConoHa(端口转发) → VPN → Mailcow

核心组件

  • 主服务器 (10.8.0.33): Mailcow Docker化邮件服务器,运行在macOS
  • 中继服务器 (10.8.0.34): ConoHa.jp Ubuntu服务器,负责端口25流量转发
  • VPN网络: OpenVPN连接两台服务器,提供安全的内网通信

部署步骤

1. ConoHa中继服务器配置

1.1 安装OpenVPN 3客户端

1
2
3
4
5
6
7
# 添加OpenVPN官方源
sudo mkdir -p /etc/apt/keyrings && curl -fsSL https://packages.openvpn.net/packages-repo.gpg | sudo tee /etc/apt/keyrings/openvpn.asc

DISTRO=$(lsb_release -c | awk '{print $2}')
echo "deb [signed-by=/etc/apt/keyrings/openvpn.asc] https://packages.openvpn.net/openvpn3/debian $DISTRO main" | sudo tee /etc/apt/sources.list.d/openvpn-packages.list

sudo apt update && sudo apt install openvpn3

1.2 配置VPN连接

1
2
3
4
5
6
# 导入VPN配置文件
openvpn3 config-import --config free-smtp-server.ovpn --name dtype --persistent
openvpn3 config-acl --show --lock-down true --grant root --config dtype

# 设置开机自启
sudo systemctl enable --now openvpn3-session@dtype.service

1.3 配置网络转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 启用IP转发
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 配置入站邮件服务端口转发
sudo iptables -t nat -A PREROUTING -p tcp --dport 993 -j DNAT --to-destination 10.8.0.33:993 # IMAPS
sudo iptables -t nat -A PREROUTING -p tcp --dport 143 -j DNAT --to-destination 10.8.0.33:143 # IMAP
sudo iptables -t nat -A PREROUTING -p tcp --dport 587 -j DNAT --to-destination 10.8.0.33:587 # SMTP STARTTLS
sudo iptables -t nat -A PREROUTING -p tcp --dport 465 -j DNAT --to-destination 10.8.0.33:465 # SMTPS

# 配置入站邮件接收转发(排除内网流量避免循环)
sudo iptables -t nat -A PREROUTING ! -s 10.8.0.0/24 -p tcp --dport 25 -j DNAT --to-destination 10.8.0.33:25

# 配置转发规则
sudo iptables -A FORWARD -p tcp -d 10.8.0.33 -m multiport --dports 993,143,587,465,25 -j ACCEPT

# 配置出站NAT
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

1.4 安装和配置Postfix中继服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装Postfix
sudo apt update && sudo apt install postfix

# 配置为邮件中继服务器
sudo postconf -e "mynetworks = 127.0.0.0/8 10.8.0.33/32"
sudo postconf -e "inet_interfaces = all"
sudo postconf -e "relayhost = "
sudo postconf -e "mydestination = localhost"

# 重启服务
sudo systemctl restart postfix

# 配置防火墙
sudo ufw allow from 10.8.0.33 to any port 25

2. Mailcow服务器配置

2.1 OpenVPN客户端配置

.ovpn配置文件中添加:

1
2
route 10.8.0.0 255.255.255.0
route-nopull

2.2 出站邮件中继配置

方案一:使用内网Postfix中继(推荐)

1
2
3
# 配置Mailcow使用ConoHa服务器作为中继
docker-compose exec postfix-mailcow postconf -e "relayhost = [10.8.0.34]:25"
docker-compose restart postfix-mailcow

方案二:使用Gmail SMTP中继(备选)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置Gmail作为SMTP中继
docker-compose exec postfix-mailcow postconf -e 'relayhost = [smtp.gmail.com]:587'
docker-compose exec postfix-mailcow postconf -e 'smtp_use_tls = yes'
docker-compose exec postfix-mailcow postconf -e 'smtp_sasl_auth_enable = yes'
docker-compose exec postfix-mailcow postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'
docker-compose exec postfix-mailcow postconf -e 'smtp_tls_security_level = encrypt'

# 创建Gmail认证文件
echo "[smtp.gmail.com]:587 your-email@gmail.com:your-app-password" | docker-compose exec -T postfix-mailcow tee /etc/postfix/sasl_passwd
docker-compose exec postfix-mailcow postmap /etc/postfix/sasl_passwd
docker-compose exec postfix-mailcow chmod 600 /etc/postfix/sasl_passwd
docker-compose exec postfix-mailcow chmod 600 /etc/postfix/sasl_passwd.db
docker-compose restart postfix-mailcow

2.3 Linux环境下的iptables方案(可选)

如果Mailcow部署在Linux系统上,可以使用iptables在宿主机级别进行流量重定向:

10.8.0.33 (Mailcow服务器) 的设置:

1
2
3
4
5
# 将出站端口25流量重定向到中继服务器
sudo iptables -t nat -A OUTPUT -p tcp --dport 25 -j DNAT --to-destination 10.8.0.34:25

# 对重定向的流量进行源地址转换
sudo iptables -t nat -A POSTROUTING -d 10.8.0.34 -p tcp --dport 25 -j MASQUERADE

10.8.0.34 (中继服务器) 的设置:

1
2
3
4
5
# 允许来自Mailcow服务器的转发流量
sudo iptables -A FORWARD -s 10.8.0.33 -p tcp --dport 25 -j ACCEPT

# 对来自Mailcow的流量进行源地址转换后转发到外网
sudo iptables -t nat -A POSTROUTING -s 10.8.0.33 -p tcp --dport 25 -j MASQUERADE

这种方案的优势是在网络层直接处理,无需修改应用配置,但需要Linux系统支持。

故障排除经验

问题1:防火墙阻止连接

现象: Connection refused错误

1
(connect to 10.8.0.34[10.8.0.34]:25: Connection refused)

解决方案:

1
2
3
4
5
# 检查服务监听状态
sudo ss -tlnp | grep :25

# 配置UFW防火墙
sudo ufw allow from 10.8.0.33 to any port 25

问题2:避免路由循环

现象: 邮件在两个服务器间循环
解决方案: 在iptables PREROUTING规则中排除内网源地址

1
sudo iptables -t nat -A PREROUTING ! -s 10.8.0.0/24 -p tcp --dport 25 -j DNAT --to-destination 10.8.0.33:25

最终配置验证

测试入站邮件

1
2
3
# 从外部发送邮件到 your-email@your-domain.com
# 检查Mailcow日志
docker-compose logs -f postfix-mailcow

测试出站邮件

1
2
3
4
5
# 检查邮件队列
docker-compose exec postfix-mailcow postqueue -p

# 强制发送队列中的邮件
docker-compose exec postfix-mailcow postqueue -f

验证中继工作状态

1
2
3
4
# 查看成功的中继日志
docker-compose logs postfix-mailcow | grep "relay=10.8.0.34"
# 应该看到类似输出:
# status=sent (250 2.0.0 Ok: queued as XXXXX)

性能与安全考量

  1. 网络延迟: VPN隧道会增加约20-50ms延迟,但对邮件服务影响较小
  2. 单点故障: ConoHa服务器是关键节点,建议配置监控和备份方案
  3. 安全性: 所有邮件流量通过加密VPN传输,相比直连更安全
  4. 成本优化: ConoHa服务器选择最低配置即可满足中继需求

总结

通过VPN+中继服务器的架构,成功解决了云服务商端口25限制的问题。该方案具有以下优势:

  • 灵活性: 可以随时更换云服务商而不影响邮件服务
  • 可扩展性: 中继服务器可以同时为多个Mailcow实例提供服务
  • 成本效益: 相比企业级邮件服务,成本显著降低
  • 完全控制: 保持对邮件数据和配置的完全控制权

这套解决方案为在受限云环境中部署自托管邮件服务器提供了可行的技术路径。

Comments

2025-08-07