在 Proxmox VE (PVE) 中运行邮件服务器,解决 25 端口转发主要取决于你的 网络拓扑结构(是 NAT 模式还是网桥模式)。

绝大多数在 PVE 上遇到转发问题的用户使用的是 NAT 模式(即 PVE 宿主机拥有公网 IP,虚拟机处于内网)。以下是几种主流的解决方案:


方案一:使用 iptables 规则(最直接、最常用)

这是在 NAT 模式下最标准的做法。你需要告诉 PVE 宿主机:凡是访问我 25 端口的流量,全都转发到虚拟机的内网 IP。

  1. 确定信息:

    • 宿主机网口名称(如 eno1 或 vmbr0)
    • 虚拟机的内网 IP(如 10.0.0.100)
  2. 执行转发命令:
    在 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。

  3. 持久化配置:
    为了防止重启后失效,建议将规则写入 /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 端口收到的信件转发给内部虚拟机。这种方式最专业,可以做第一层垃圾邮件过滤。

⚠️ 关键排错检查(非常重要)

即使转发配置正确,邮件服务器仍可能无法访问,请务必检查以下三点:

  1. ISP 是否封锁了 25 端口?

    • 这是最常见的原因。 许多云服务商(如阿里云、AWS、Azure)和家庭宽带供应商默认禁用出站/入站 25 端口。
    • 测试方法: 在外部机器执行 telnet 你的公网IP 25。如果没反应,说明被上层 ISP 拦截了。
  2. 虚拟机网关设置:

    • 在 NAT 模式下,虚拟机的网关必须指向 PVE 宿主机的内网 IP,否则数据包回不去。
  3. 虚拟机本地防火墙:

    • 确保虚拟机内部(如 Ubuntu 的 ufw 或 CentOS 的 firewalld)已经允许了 25 端口。

进阶建议

如果你是为了绕过 ISP 的封锁,或者希望提高投递成功率,可以考虑以下方案:

  • 使用 465 或 587 端口: 用于客户端发信(SMTP Submission)。
  • 配置 SMTP 代理(如 SendGrid 或 Mailgun): 避开 25 端口封锁,直接通过 API 或 587 端口把邮件发出去。