pfSense、OpenWrt 基于公网 IPv6 的 WireGuard 站点到站点 VPN 配置教程

本文记录如何在 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 配置

使用 UCI 来进行配置,执行前需要替换私钥和 pfSense 公钥。

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 地址

pfSense
ping 10.10.0.2
OpenWrt
ping 10.10.0.1

3、测试 LAN 互访

pfSense
ping -S 192.168.101.252 192.168.18.2
 OpenWrt
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 方案。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇