问题:邮件无法通过 WireGuard 隧道发出。
问题:从我的一个自托管域发送电子邮件时,如何配置邮件服务器或 pfSense 以使用 WireGuard 隧道?
概述:自托管 Web 服务器和邮件服务器。使用 VPS(运行 pfSense)提供两个公共 IP 地址。WireGuard 隧道将两个公共 IP 地址连接到我本地 pfSense 盒后面的自托管服务器。Web 服务器和邮件服务器可从互联网访问。
编辑1
Internet
/ \
|
\ /
REMOTE VPS pfSense
111.111.111.111 WAN Public IP Gateway WANGW 111.111.111.1
222.222.222.22 Public IP NAT 1:1 192.168.3.2 Gateway VIPGW
222.222.222.25 Public IP NAT 1:1 192.168.4.2 Gateway VIPGW
10.6.210.0 Private WireGuard Interface WG_HOME
GATEWAYS: WANGW INTERFACES: WAN
VIPGW WG_HOME
WG_HOME_GW
/ \
|
\ /
10.6.210.0 VPS
WireGuard Tunnel
10.6.210.1 PEER
/ \
|
\ /
|-----------------
|
|
\ /
HOME pfSense <-----> Local ISP Gateway <-----> Internet
100.100.100.100 WAN CGNAT Gateway WANGW 100.100.100.1
192.168.1.1 LAN
192.168.3.1 VLAN3
192.168.4.1 VLAN4
GATEWAYS: WANGW INTERFACES: WAN
VIPGW LAN
WG_VPS_GW VLAN3
VLAN4
/ \
|
\ /
24 Port Switch
/ \ / \
vlan3 vlan4
| |
| |
| |
| \ /
| (VM HOST) enp4s0f1 / br1 192.168.4.2
| |
| |
| VM Mail Server 192.168.4.3
|
\ /
(VM HOST) enp4s0f0 / br0 192.168.3.2
|
|
VM Web Server 192.168.3.3
编辑2
VPS pfSense 上的防火墙阻止了从 VM 邮件服务器发送邮件。
VPS 上的防火墙日志
X Aug 30 13:03:48 WG_HOME 10.6.210.1:12345 172.253.122.26:25 TCP:S
源地址正在从 192.168.4.3(邮件服务器 VM)重写为 10.6.210.1(WireGuard 隧道的对等端),因此防火墙正在阻止它。
编辑3
成功!解决了!谢谢!
症结(又称问题,又称用户错误)是出站 NAT。
当您说“不要对 WG_VPS 进行 NAT”和“不要对 WG_HOME 进行 NAT”时,我就好像不会对它们进行 NAT 一样。“蟋蟀在鸣叫”,没有意识到有一个用于选择接口的选项 HYBRID Do Not NAT。
问题:我应该在高级出站 NAT 条目中的源还是目标中定义端口?
问题:您能解释一下为什么使用以下两个规则吗?
pass VLAN4 inbound source 192.168.4.2 TCP port 25 -> gateway WG_VPS_GW
pass VLAN4 inbound source 192.168.4.2 destination TCP port 25 -> gateway WG_VPS_GW
问题:我还需要考虑其他什么吗?或者如果需要的话,只需“冲洗并重复”设置 587,465 即可。
关于 HTTP/HTTPS(192.168.3.3),传入请求不是从它们自动进入的同一网关发出的,因此无需进行类似的配置。
答案1
您需要的核心是策略路由:您需要一个策略路由规则来通过 WireGuard 接口路由 TCP 目标端口为 25 的出站数据包。但您还需要设置 WireGuard 连接,以便它无需任何 NAT 即可通过隧道来回路由数据包。
pfSense 到 pfSense
普菲 VPS
通过您绘制的 pfSense 到 pfSense WireGuard 连接,这就是您在 pf VPS 端想要的内容:
WireGuard
确保您已为 HOME 端点配置了“AllowedIPs”设置,以包含您可能从 pf VPS 发送到 pf HOME 的流量的所有目标 IP 地址:
10.6.210.1, 192.168.3.0/24, 192.168.4.0/24
确保已将 pfSense 接口 (WG_HOME) 分配给 WireGuard 接口,为其创建网关 (WG_HOME_GW),并将此网关设为 WG_HOME 接口的“上游网关”(这使 WG_HOME 成为 WAN 类型接口;请参阅WAN 与 LAN 接口文档以证明这一点的重要性)。
1:1 网络地址转换
- 确保您已为您的 Web 服务器和邮件服务器添加了 1:1 NAT 映射:
222.222.222.22
->192.168.3.2
222.222.222.25
->192.168.4.2
出站 NAT
- 选择“混合出站 NAT”,并添加自定义“不 NAT”规则,以防止任何来自 WG_HOME 的出站 NAT:
- 不进行 NAT:已选择
- 接口:WG_HOME
- TCP/IP 版本:IPv4
- 协议:任意
- 源地址:任意
- 目的地址:任意
静态路由
- 确保已经为要从 pf VPS 路由的每个 HOME 网络添加了静态路由:
192.168.3.0/24
->WG_HOME_GW
192.168.4.0/24
->WG_HOME_GW
防火墙规则
入站连接 WAN -> WG_HOME
确保每个要允许通过的端口的 WAN 接口上都有防火墙规则,并使用 1:1 NAT 转换后的目标 IP 地址:
- 在 WAN 上快速传递 inet proto tcp 从任意端口到 192.168.3.2 端口 = http
- 在 WAN 上快速传递 inet proto tcp 从任意端口到 192.168.3.2 端口 = https
- 在 WAN 上快速传递 inet proto tcp 从任意到 192.168.4.2 端口 = smtp
- 在 WAN 上快速传递 inet proto tcp 从任意端口到 192.168.4.2 端口 = smtps
- 在 WAN 上快速将 inet proto tcp 从任意端口传递到 192.168.4.2 端口 = 提交
或者如果您想在其他地方进行端口过滤(例如在家庭端),只需在 1:1 NAT 转换后为每个目标 IP 地址添加一条规则:
- 在 WAN 上快速传递 inet proto tcp 从任意位置到 192.168.3.2
- 在 WAN 上快速传递 inet proto tcp 从任意位置到 192.168.4.2
出站连接 WG_HOME -> WAN
- 为了确保您的邮件服务器(以及 Web 服务器,如果您在某个时候开始通过 WG 隧道从 Web 服务器发送新连接)发起的新连接使用正确的出站网关(如果与您的 WAN 网关不同),请为每个网关添加一个策略路由防火墙规则,将来自它们的流量路由出您的 VIPGW 网关:
- 在 WG_HOME 上快速传递到 VIPGW inet proto tcp 路由,从 192.168.3.2 到任意
- 在 WG_HOME 上快速传递到 VIPGW inet proto tcp 路由,从 192.168.4.2 到任意
pf 首页
这是您在 pf HOME 端想要的内容:
WireGuard
确保已将 VPS 端点的“AllowedIPs”设置配置为包含整个 IPv4 地址空间:
0.0.0.0/0
与 pf VPS 相同,确保已为 WireGuard 接口分配了 pfSense 接口(WG_VPS),为其创建了网关(WG_VPS_GW),并将该网关设为 WG_VPS_GW 接口的“上游网关”。
出站 NAT
- 与 pf VPS 相同,选择“混合出站 NAT”,并添加自定义“不 NAT”规则,以防止来自 WG_VPS 的任何出站 NAT:
- 不进行 NAT:已选择
- 接口:WG_VPS
- TCP/IP 版本:IPv4
- 协议:任意
- 源地址:任意
- 目的地址:任意
防火墙规则
入站连接 WG_VPS -> VLAN3/4
确保 WG_VPS 接口上针对每个要允许通过的端口都设置了防火墙规则:
- 在 WG_VPS inet proto tcp 上快速从任意端口传递到 192.168.3.2 端口 = http
- 在 WG_VPS inet proto tcp 上快速从任意端口传递到 192.168.3.2 端口 = https
- 在 WG_VPS inet proto tcp 上快速从任意端口传递到 192.168.4.2 端口 = smtp
- 在 WG_VPS inet proto tcp 上快速从任意端口传递到 192.168.4.2 端口 = smtps
- 在 WG_VPS inet proto tcp 上快速从任意端口传递到 192.168.4.2 端口 = 提交
或者如果您想在其他地方进行端口过滤(例如在 VPS 端,或在邮件/Web 服务器本身),只需为每个目标 IP 地址添加一条规则:
- 在 WG_VPS inet proto tcp 上快速从任意位置传递到 192.168.3.2
- 在 WG_VPS inet proto tcp 上快速从任意位置传递到 192.168.4.2
回复入站连接
- 在之前的编辑中,我说过您还需要一个如下所示的出站策略路由规则,并认为这是回复所需要的——那是错误的只要 WG_VPS 是 WAN 类型接口,就会自动为入站连接生成正确的“回复”设置,所以你实际上不需要这个:
- 在 VLAN4 上快速传递路由到 WG_VPS_GW inet proto tcp 从 192.168.4.2 端口 = smtp 到任何
出站连接 VLAN4 -> WG_VPS
为了确保您的邮件服务器发起的与其他邮件服务器的新连接使用正确的出站网关,请添加一个策略路由防火墙规则,该规则将流量路由到您自己的邮件服务器可能连接到其他邮件服务器的每个端口:
- 在 VLAN4 上快速传递路由到 WG_VPS_GW inet proto tcp 从 192.168.4.2 到任何端口 = smtp
- 在 VLAN4 上快速传递路由到 WG_VPS_GW inet proto tcp 从 192.168.4.2 到任何端口 = smtps
- 在 VLAN4 上快速传递路由到 WG_VPS_GW inet proto tcp,从 192.168.4.2 到任意端口 = 提交
仅当您的邮件服务器发起连接到那些远程端口——如果它只是监听来自远程服务器连接到这些本地端口。具体来说,如果您不需要连接到远程端口 587 和 465,则不需要最后 2 条规则(通常您只需要 3 条规则中的 1 条)。
pfSense 到 Linux
在一个假设的替代方案中,您的邮件服务器本身与您的 pf VPS 有直接的 WireGuard 连接,并且您在 pf VPS 上从邮件服务器的公共 IP 到邮件服务器的 WireGuard IP 地址进行了 1:1 NAT,并且邮件服务器运行的是 Linux,您可以在邮件服务器上配置 WireGuard,如下所示:
# /etc/wireguard/wg0.conf
# local settings for the mail server
[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE=
Address = 10.6.210.4/24
Table = 123
# route replies to inbound connections back out the WG tunnel
PreUp = ip rule add from 10.6.210.0 table 123 priority 456
PostDown = ip rule del from 10.6.210.0 table 123 priority 456
# route new connections to TCP port 25 out the WG tunnel
PreUp = ip rule add dport 25 ipproto tcp table 123 priority 457
PostDown = ip rule del dport 25 ipproto tcp table 123 priority 457
# remote settings for the VPS server
[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
Endpoint = 111.111.111.111:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
此策略路由规则将把新连接从 WG 隧道发送到 TCP 端口 25:
ip rule add dport 25 ipproto tcp table 123 priority 457