发布于 

使用Wireguard实现异地组网并构建IPv6隧道

前言

最近在研究Wireguard异地组网,打算将家里和机房的局域网组合在一起。同时朋友有使用Wireguard IPv6上网的需求,决定再在组网的基础上添加一个IPv6隧道。

准备工作

  • 两个网段不同的局域网(例如10.10.10.0/24192.168.1.0/24
  • 两台OpenWrt(至少一个接入公网IPv6)
  • 任意客户端

为机房PVE添加NAT网桥

PVE默认的网桥是采用桥接方式,这次我要为它添加一个IPv4 / IPv6双栈NAT网桥

添加网桥

添加一个网桥vmbr1,如图所示,将10.10.10.1预留给OpenWrt,IPv6 ULA地址给OpenWrt自动分配

截屏2023-06-03 08.56.13
截屏2023-06-03 08.56.13

为了给vmbr1网桥下的设备分配IP地址,我们需要安装DHCP服务,这里由于组网需要我选择安装OpenWrt

安装OpenWrt

创建虚拟机openwrt,配置如图所示

注意:先添加vmbr1再添加vmbr0,这样OpenWrt才会将vmbr0(互联网)视为WAN口

截屏2023-06-03 08.59.48
截屏2023-06-03 08.59.48

下载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

截屏2023-06-03 09.10.01
截屏2023-06-03 09.10.01

重启OpenWrt后,在vmbr1网桥下任意虚拟机访问10.10.10.1,即可登录OpenWrt

配置NAT6

安装完OpenWrt后,尽管此时我们拥有了IPv6 ULA地址,但未配置NAT6,因此并不能访问IPv6互联网

编辑/etc/sysctl.d/forward.conf ,添加以下内容:

1
2
3
4
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.eth1.autoconf=1
net.ipv6.conf.eth1.accept_ra=2

其中eth1为WAN口接口名

重启OpenWrt后,访问10.10.10.1,打开网络->防火墙->自定义规则,添加以下内容:

1
2
# Enable IPv6 NAT
ip6tables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

点击重启防火墙后,vmbr1下的IPv6设备应该可以访问IPv6互联网了

截屏2023-06-03 09.31.43
截屏2023-06-03 09.31.43

配置Wireguard VPN

配置家中OpenWrt

ssh连接到路由器,创建密钥目录并设定掩码:

1
2
3
mkdir keys
cd keys
umask 077

创建并查看密钥:

1
2
3
4
wg genkey > openwrt-home.key
cat openwrt-home.key
wg pubkey < openwrt-home.key > openwrt-home.pub
cat openwrt-home.pub

打开OpenWrt,点击网络->接口->添加新接口,名称为wg1,协议为WireGuard VPN

截屏2023-06-03 09.36.03
截屏2023-06-03 09.36.03

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

截屏2023-06-03 13.15.01
截屏2023-06-03 13.15.01

将私钥填入配置界面,监听端口任意,建议选高位端口,防止被运营商干扰

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/32fd45:da8::2/64,如图所示:

截屏2023-06-03 13.26.01
截屏2023-06-03 13.26.01

配置对端(Peer)

登入任意路由器,生成一个预共享密钥,增强安全性:

1
wg genpsk

该密钥在所有端通用,须保存好。

在Peers处点击添加,公钥填写对方的(如家里OpenWrt填写机房公钥),预共享密钥输入刚刚生成的,端点主机输入对端IP(这里我两端均为家宽,因此做了DDNS),端口输入配置的端口,持续Keep-Alive不填。

对于允许的IP,需要输入两项,第一项是WireGuard的IP段,即172.17.0.0/24,第二项即对方机器所处内网IP段,如对端为家则为192.168.1.0/24,如图所示:

截屏2023-06-03 13.36.24
截屏2023-06-03 13.36.24

配置完后保存并应用,点击WireGuard接口旁的“连接”,重启接口。

若要查看是否成功连接,点击LuCI界面中的状态->WireGuard状态即可看到对端连接信息:

截屏2023-06-03 13.39.43
截屏2023-06-03 13.39.43

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

截屏2023-06-03 13.40.38
截屏2023-06-03 13.40.38

配置客户端

创建密钥

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

截屏2023-06-03 17.09.05
截屏2023-06-03 17.09.05

image-20230603170949355
image-20230603170949355

对于Linux,参照上文

编写配置文件

添加空隧道,填写以下配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Interface]
PrivateKey = [你的私钥]
Address = 172.17.0.4/32, fd45:da8::4/128
DNS = 119.29.29.29, 2402:4e00::
MTU = 1420

[Peer]
PublicKey = [服务端公钥]
PresharedKey = [预共享密钥]
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = [服务端IP]:端口
PersistentKeepalive = 25

对于允许的IPAllowedIPs:填写0.0.0.0/0, ::/0即代理IPv4和IPv6所有流量,其他的一些示例:

1
2
3
4
5
6
# 只需访问内网段10.10.10.0/24,其他流量不走WireGuard
AllowedIPs = 10.10.10.0/24
# 全局代理,只允许IPv4流量
AllowedIPs = 0.0.0.0/0
# 全局代理,只允许IPv6流量
AllowedIPs = ::/0

保存配置文件后,在WireGuard客户端中导入即可,当然,在正式使用之前,我们还需在服务端中添加客户端作为对端。

配置服务端

打开OpenWrt的wg0接口,添加一个Peers,但是这次无需输入端点主机和端口,因为客户端可能位于多层NAT之后:

截屏2023-06-03 17.32.29
截屏2023-06-03 17.32.29

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