本文记录如何在 pfSense 与远程 OpenWrt 之间,利用公网 IPv6 作为 WireGuard 传输层,建立 IPv4 Site-to-Site VPN,实现两个局域网之间的互相访问。
该方案适用于:
- 两端均拥有公网 IPv6 地址
- IPv4 网络无法直接互通
- 一端位于 NAT 后方
- 希望通过 WireGuard 打通异地局域网
网络拓扑
192.168.101.0/24
|
pfSense 192.168.101.252
WG 10.10.0.1
IPv6 240e:680:488c::3
|| WireGuard over IPv6 / UDP 51820
IPv6 240e:380:39e0:fa20:5cbe:d1ff:feeb:53d4
WG 10.10.0.2
OpenWrt 192.168.18.2
|
192.168.18.0/24
配置参数
pfSense
管理地址:192.168.101.252/24 公网地址:240e:680:488c::3 WireGuard 地址:10.10.0.1/24
OpenWrt
管理地址:192.168.18.2/24 公网地址:240e:380:39e0:fa20:5cbe:d1ff:feeb:53d4 WireGuard 地址:10.10.0.2/24
WireGuard 默认使用 UDP 51820 端口。
经过实际测试,本环境下 WireGuard 的最佳 MTU 为:1380
准备工作
1. 安装 WireGuard
pfSense
进入:System→ Package Manager → Available Packages,找到 WireGuard 插件并安装。
OpenWrt
在终端执行以下命令安装:
opkg update opkg install \kmod-wireguard \wireguard-tools \luci-proto-wireguard
2. 测试 IPv6 连通性
确认两端公网 IPv6 已配置,并允许 ICMPv6。
OpenWrt 测试:
ping -6 240e:680:488c::3
如果能够成功返回,说明 IPv6 基础通信正常。由于 OpenWrt 会主动发起 WireGuard 握手,即使上级路由器阻止入站连接,也可以通过:“PersistentKeepalive” 保持隧道连接。如果OpenWrt是旁路由,可以尝试这种设置。
3.生成密钥
umask 077 wg genkey | tee privatekey | wg pubkey > publickey
cat publickey
注意:
- 私钥只保留在本机
- 双方只交换公钥
本文使用以下占位符:
<PFSENSE_PRIVATE_KEY> <PFSENSE_PUBLIC_KEY> <OPENWRT_PRIVATE_KEY <OPENWRT_PUBLIC_KEY>
pfSense 配置
1. 创建 WireGuard 隧道
进入:VPN → WireGuard → Tunnels
添加一条隧道:
| 项目 | 值 |
|---|---|
| Enable | 启用 |
| Description | IPv6 tunnel to OpenWrt |
| Listen Port | 51820 |
| Interface Keys | pfSense 私钥 |
| Interface Address | 10.10.0.1/24 |
| MTU | 1380 |
添加完成保存,注意记录生成的 pfSense 公钥。
2. 添加 OpenWrt 端点
进入:VPN → WireGuard → Peers
添加如下端点:
| 项目 | 值 |
|---|---|
| Enable | 启用 |
| Tunnel | tun_wg0 |
| Description | OpenWrt via IPv6 |
| Dynamic Endpoint | 启用 |
| Public Key | <OPENWRT_PUBLIC_KEY> |
| Allowed IP | 10.10.0.2/32 |
| Allowed IP | 192.168.18.0/24 |
这里无需填写 OpenWrt Endpoint,OpenWrt 会主动发起握手,pfSense 会自动学习:
- 对端 IPv6 地址
- UDP 端口
3. 放行 WireGuard UDP 端口
进入:Firewall → Rules → WAN
新增 IPv6 规则:
- Action:Pass
- Address Family:IPv6
- Protocol:UDP
- Source:any
- Destination:WAN address
- Destination Port:51820
4. 分配 WireGuard 接口
进入:Interfaces → Assignments
添加:tun_wg0
配置如下:
| 项目 | 值 |
|---|---|
| Description | WG_OpenWrt |
| IPv4 Type | Static IPv4 |
| IPv4 Address | 10.10.0.1/24 |
| MTU | 1380 |
确保:
- Tunnel 地址一致
- Interface 地址一致
- MTU 一致
5. 添加 OpenWrt LAN 路由
目标:
192.168.18.0/24
下一跳:
10.10.0.2
测试:
route add -net 192.168.18.0/24 10.10.0.2
如果需要重启后自动恢复,可以安装 Shellcmd插件,添加如下命令:
/sbin/route add -net 192.168.18.0/24 10.10.0.2
OpenWrt 配置
1.创建 WireGuard 接口
uci set network.wg_pfsense='interface' uci set network.wg_pfsense.proto='wireguard' uci set network.wg_pfsense.private_key='<OPENWRT_PRIVATE_KEY>' uci set network.wg_pfsense.listen_port='51820' uci set network.wg_pfsense.mtu='1380' uci add_list network.wg_pfsense.addresses='10.10.0.2/24'
2.添加 pfSense 端点
uci set network.wg_pfsense_peer='wireguard_wg_pfsense' uci set network.wg_pfsense_peer.description='pfSense via IPv6' uci set network.wg_pfsense_peer.public_key='<PFSENSE_PUBLIC_KEY>' uci set network.wg_pfsense_peer.endpoint_host='240e:680:488c::3' uci set network.wg_pfsense_peer.endpoint_port='51820' uci set network.wg_pfsense_peer.persistent_keepalive='25' uci set network.wg_pfsense_peer.route_allowed_ips='1' uci add_list network.wg_pfsense_peer.allowed_ips='10.10.0.1/32' uci add_list network.wg_pfsense_peer.allowed_ips='192.168.101.0/24' uci commit network
3.防火墙配置
创建 WireGuard 区域:
uci set firewall.wg_pfsense='zone' uci set firewall.wg_pfsense.name='wg_pfsense' uci add_list firewall.wg_pfsense.network='wg_pfsense' uci set firewall.wg_pfsense.input='ACCEPT' uci set firewall.wg_pfsense.output='ACCEPT' uci set firewall.wg_pfsense.forward='REJECT'
允许 LAN 与 WireGuard 双向转发:
uci set firewall.lan_to_wg_pfsense='forwarding' uci set firewall.lan_to_wg_pfsense.src='lan' uci set firewall.lan_to_wg_pfsense.dest='wg_pfsense' uci set firewall.wg_pfsense_to_lan='forwarding' uci set firewall.wg_pfsense_to_lan.src='wg_pfsense' uci set firewall.wg_pfsense_to_lan.dest='lan' uci commit firewall
最后,应用配置:
ifup wg_pfsense /etc/init.d/firewall reload
连接测试
1、查看WireGuard状态
执行以下命令:
wg show
正常状态如下:
endpoint: [240e:680:488c::3]:51820 allowed ips: 10.10.0.1/32, 192.168.101.0/24 latest handshake: 22 seconds ago transfer: 62.76 KiB received, 396.08 KiB sent persistent keepalive: every 25 seconds
2、测试 WireGuard 地址
ping 10.10.0.2
ping 10.10.0.1
3、测试 LAN 互访
ping -S 192.168.101.252 192.168.18.2
ping -I 192.168.18.2 192.168.101.252
成功后,两端 IPv4 局域网即可通过 WireGuard 隧道互通。
最后总结
该方案利用 IPv6 作为 WireGuard 底层传输,实现以下目标:
- IPv6 建立安全隧道
- IPv4 LAN 跨站点互访
- OpenWrt 主动连接避免入站限制
- pfSense 与 OpenWrt 双向路由
对于拥有公网 IPv6 的家庭网络、异地办公网络以及小型机房环境,这是一种简单、稳定且低成本的 Site-to-Site VPN 方案。