在云服务器端口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
数据流向说明:
- 入站邮件: 外网 → ConoHa(iptables DNAT) → VPN → Mailcow
- 出站邮件: Mailcow → VPN → ConoHa(Postfix relay) → 外网
- 用户连接: 客户端 → 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
| 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
| 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
| 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 sudo iptables -t nat -A PREROUTING -p tcp --dport 143 -j DNAT --to-destination 10.8.0.33:143 sudo iptables -t nat -A PREROUTING -p tcp --dport 587 -j DNAT --to-destination 10.8.0.33:587 sudo iptables -t nat -A PREROUTING -p tcp --dport 465 -j DNAT --to-destination 10.8.0.33:465
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
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
| 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
| 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
| 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'
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
| 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
| sudo iptables -A FORWARD -s 10.8.0.33 -p tcp --dport 25 -j ACCEPT
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
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
|
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"
|
性能与安全考量
- 网络延迟: VPN隧道会增加约20-50ms延迟,但对邮件服务影响较小
- 单点故障: ConoHa服务器是关键节点,建议配置监控和备份方案
- 安全性: 所有邮件流量通过加密VPN传输,相比直连更安全
- 成本优化: ConoHa服务器选择最低配置即可满足中继需求
总结
通过VPN+中继服务器的架构,成功解决了云服务商端口25限制的问题。该方案具有以下优势:
- 灵活性: 可以随时更换云服务商而不影响邮件服务
- 可扩展性: 中继服务器可以同时为多个Mailcow实例提供服务
- 成本效益: 相比企业级邮件服务,成本显著降低
- 完全控制: 保持对邮件数据和配置的完全控制权
这套解决方案为在受限云环境中部署自托管邮件服务器提供了可行的技术路径。