在 Proxmox VE (PVE) 中运行邮件服务器,解决 25 端口转发主要取决于你的 网络拓扑结构(是 NAT 模式还是网桥模式)。
绝大多数在 PVE 上遇到转发问题的用户使用的是 NAT 模式(即 PVE 宿主机拥有公网 IP,虚拟机处于内网)。以下是几种主流的解决方案:
方案一:使用 iptables 规则(最直接、最常用)
这是在 NAT 模式下最标准的做法。你需要告诉 PVE 宿主机:凡是访问我 25 端口的流量,全都转发到虚拟机的内网 IP。
确定信息:
- 宿主机网口名称(如
eno1或vmbr0) - 虚拟机的内网 IP(如
10.0.0.100)
- 宿主机网口名称(如
执行转发命令:
在 PVE 宿主机的终端执行:# 开启流量转发(临时生效) iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-destination 10.0.0.100:25 # 如果你的虚拟机无法回程上网,可能还需要伪装规则 iptables -t nat -A POSTROUTING -j MASQUERADE注意:请根据实际网卡名替换
eth0。持久化配置:
为了防止重启后失效,建议将规则写入/etc/network/interfaces。在你的vmbr配置下添加post-up:auto vmbr0 iface vmbr0 inet static address 192.168.1.10/24 bridge-ports eno1 bridge-stp off bridge-fd 0 # 添加下面这一行 post-up iptables -t nat -A PREROUTING -p tcp --dport 25 -j DNAT --to 10.0.0.100:25 post-down iptables -t nat -D PREROUTING -p tcp --dport 25 -j DNAT --to 10.0.0.100:25
方案二:利用 PVE 防火墙 (GUI 方式)
如果你不想动命令行,可以尝试 PVE 自带的防火墙,但 PVE 的 Web 界面主要处理“允许/拒绝”,对于 NAT 转发(DNAT)的支持并不直观,通常仍需配合方案一的命令行。
如果你使用的是网桥模式(虚拟机和宿主机在同一公网网段):
你不需要做端口转发,只需要在 虚拟机设置 -> 防火墙 中,开放 25 端口的入站权限即可。
方案三:使用反向代理(如 Nginx 或 Postfix 中继)
如果你希望更安全,或者 PVE 宿主机本身也需要处理邮件,可以在宿主机上装一个轻量级的代理。
- Nginx Stream 模块: 可以转发 TCP 流量。
- Postfix 中继: 在宿主机装 Postfix,配置为
relayhost,将所有 25 端口收到的信件转发给内部虚拟机。这种方式最专业,可以做第一层垃圾邮件过滤。
⚠️ 关键排错检查(非常重要)
即使转发配置正确,邮件服务器仍可能无法访问,请务必检查以下三点:
ISP 是否封锁了 25 端口?
- 这是最常见的原因。 许多云服务商(如阿里云、AWS、Azure)和家庭宽带供应商默认禁用出站/入站 25 端口。
- 测试方法: 在外部机器执行
telnet 你的公网IP 25。如果没反应,说明被上层 ISP 拦截了。
虚拟机网关设置:
- 在 NAT 模式下,虚拟机的网关必须指向 PVE 宿主机的内网 IP,否则数据包回不去。
虚拟机本地防火墙:
- 确保虚拟机内部(如 Ubuntu 的
ufw或 CentOS 的firewalld)已经允许了 25 端口。
- 确保虚拟机内部(如 Ubuntu 的
进阶建议
如果你是为了绕过 ISP 的封锁,或者希望提高投递成功率,可以考虑以下方案:
- 使用 465 或 587 端口: 用于客户端发信(SMTP Submission)。
- 配置 SMTP 代理(如 SendGrid 或 Mailgun): 避开 25 端口封锁,直接通过 API 或 587 端口把邮件发出去。