使用Wireguard实现异地组网并构建IPv6隧道
前言
最近在研究Wireguard异地组网,打算将家里和机房的局域网组合在一起。同时朋友有使用Wireguard IPv6上网的需求,决定再在组网的基础上添加一个IPv6隧道。
准备工作
- 两个网段不同的局域网(例如
10.10.10.0/24
和192.168.1.0/24
) - 两台OpenWrt(至少一个接入公网IPv6)
- 任意客户端
为机房PVE添加NAT网桥
PVE默认的网桥是采用桥接方式,这次我要为它添加一个IPv4 / IPv6双栈NAT网桥
添加网桥
添加一个网桥vmbr1,如图所示,将10.10.10.1预留给OpenWrt,IPv6 ULA地址给OpenWrt自动分配

为了给vmbr1网桥下的设备分配IP地址,我们需要安装DHCP服务,这里由于组网需要我选择安装OpenWrt
安装OpenWrt
创建虚拟机openwrt,配置如图所示
注意:先添加vmbr1再添加vmbr0,这样OpenWrt才会将vmbr0(互联网)视为WAN口

下载OpenWrt镜像并导入硬盘,这里可以参考我一篇没写完的文章(bushi
推荐的镜像:
1 | qm importdisk [vmid] /var/lib/vz/template/iso/bleach-plus-20230601-openwrt-x86-64-generic-squashfs-combined-efi.img local --format=qcow2 |
导入完成后,启动OpenWrt,编辑/etc/config/network
,修改LAN口IP

重启OpenWrt后,在vmbr1网桥下任意虚拟机访问10.10.10.1,即可登录OpenWrt
配置NAT6
安装完OpenWrt后,尽管此时我们拥有了IPv6 ULA地址,但未配置NAT6,因此并不能访问IPv6互联网
编辑/etc/sysctl.d/forward.conf
,添加以下内容:
1 | net.ipv4.ip_forward=1 |
其中eth1
为WAN口接口名
重启OpenWrt后,访问10.10.10.1,打开网络->防火墙->自定义规则
,添加以下内容:
1 | # Enable IPv6 NAT |
点击重启防火墙
后,vmbr1下的IPv6设备应该可以访问IPv6互联网了

配置Wireguard VPN
配置家中OpenWrt
ssh连接到路由器,创建密钥目录并设定掩码:
1 | mkdir keys |
创建并查看密钥:
1 | wg genkey > openwrt-home.key |
打开OpenWrt,点击网络->接口->添加新接口
,名称为wg1
,协议为WireGuard VPN

创建后自动打开接口编辑界面

将私钥填入配置界面,监听端口任意,建议选高位端口,防止被运营商干扰
IP地址一栏,我这里选用172.17.0.1/32
的B类地址,个人建议用10.0.0.0/8
的A类地址,自定义程度更高。对于IPv6地址,使用fd00::/8开头的本地地址即可,如图中的fd45:da8::1/64,配置完后保存并应用。
配置机房OpenWrt
生成公私钥等同上,但是IP填172.17.0.2/32
和fd45:da8::2/64
,如图所示:

配置对端(Peer)
登入任意路由器,生成一个预共享密钥,增强安全性:
1 | wg genpsk |
该密钥在所有端通用,须保存好。
在Peers处点击添加,公钥
填写对方的(如家里OpenWrt填写机房公钥),预共享密钥
输入刚刚生成的,端点主机
输入对端IP(这里我两端均为家宽,因此做了DDNS),端口
输入配置的端口,持续Keep-Alive
不填。
对于允许的IP
,需要输入两项,第一项是WireGuard的IP段,即172.17.0.0/24
,第二项即对方机器所处内网IP段,如对端为家则为192.168.1.0/24
,如图所示:

配置完后保存并应用,点击WireGuard接口旁的“连接”,重启接口。
若要查看是否成功连接,点击LuCI界面中的状态->WireGuard状态
即可看到对端连接信息:

此时ping一下对端内网段的IP,哈哈,是不是很激动?

配置客户端
创建密钥
对于macOS / Windows / Android / iOS等具有GUI等客户端,直接生成一对公私钥即可:


对于Linux,参照上文
编写配置文件
添加空隧道,填写以下配置文件:
1 | [Interface] |
对于允许的IP
即AllowedIPs
:填写0.0.0.0/0, ::/0
即代理IPv4和IPv6所有流量,其他的一些示例:
1 | # 只需访问内网段10.10.10.0/24,其他流量不走WireGuard |
保存配置文件后,在WireGuard客户端中导入即可,当然,在正式使用之前,我们还需在服务端中添加客户端作为对端。
配置服务端
打开OpenWrt的wg0接口,添加一个Peers,但是这次无需输入端点主机和端口,因为客户端可能位于多层NAT之后:

保存后,重启wg0接口,现在即可打开客户端享受安全、快速的WireGuard VPN了!