使用wireguard-go两地组网实现内网互通

背景

现在很多网络环境都覆盖了IPv6了,基本可以通过IPv6的方式实现点对点通信。不过由于IPv6的地址很长,不是很方便记忆。使用DDNS有不是所有的设备都能加上去。目前需要有2地的网络,想要方便的让两地内网可以互相通信,2地的主路由都是小米路由,都开启了SSH访问,可以后台操作。小米原版的系统其实就是OpenWrt。由于没有对主路由刷为第三方,因此不支持内核版本的WireGuard来组网。需要使用wireguard-go来实现组网。

网络环境说明

wireguard-go两地组网网络环境
  • 两地的小米路由都加上ddns能力,域名指向AAAA IPv6的公网地址
  • 两地的子网分别在不同的子网内,确保后续组网不会冲突
  • 后续使用wireguard-go创建的子网走192.168.8.0/24

网络环境明确后,两地确保可以使用IPv6互通(其中需要注意的是,IPv6要关闭防火墙。并且要拿WAN口的IPv6地址,如果拿br-lan获取的IPv6,还需要自己添加防火墙策略,确保可以正常出局。这个被坑了好久,一直以为是哪里配置有问题)。

部署实施

前置准备

接下来就是部署实施的环节了,我们需要提前做一些准备。

  1. 首先是下载对应的wireguard-go,可以从wireguard-go的git直接编译出最新版本,但是这个比较占用磁盘空间,我自己编译出来有接近3M的磁盘占用。为了减少磁盘占用,我选择https://github.com/seud0nym/openwrt-wireguard-go/tree/master/repository/arm_cortex-a53/base里面的二进制包解压(两个小米路由器都是arm_cortex-a53平台的芯片,下载ipk文件后,可以直接使用压缩软件将wireguard-go提取出来,不用opkg安装)。如果这边是另外的平台,可能就需要自己走https://git.zx2c4.com/wireguard-go 编译对应芯片的wireguard-go
  2. 同样的逻辑,提取wireguard-tools中的二进制文件wg,由于我两台小米路由都是18版本的OpenWrt二次开发,因此我直接从以下链接https://archive.openwrt.org/releases/18.06.9/packages/aarch64_cortex-a53/base/ 中下载 wireguard-tools的ipk包,一样用压缩软件提取wg二进制。我看了下wg的依赖,主要依赖C库,因此按说只要C库兼容,高版本wg也可以直接使用。
  3. ddns这块前置的域名配置也是要准备好。

配置组网

先使用wg工具生成key和pubkey,由于是2地组网,因此需要2对的key/pubkey。

wg genkey > /etc/config/wireguard/private.key # 生成私钥
wg pubkey < /etc/config/wireguard/private.key > /etc/config/wireguard/public.key # 生成公钥

两地分别添加配置如下,A地,配置文件统一存在/etc/config/wireguard/wg0.conf(注意目录要放在/etc/config下,小米路由器这个目录下才是ubifs,否则会掉电丢失):

[Interface]
PrivateKey = A地自己的私钥
ListenPort = 5789

# 以下peer是B地的配置
[Peer]
PublicKey = B地的公钥
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = wg-b.elkpi.com:5789
PersistentKeepalive = 25

网上很多资料都是需要添加Interface.Address地址的,但是OpenWrt的wg并不支持这个配置,因此这里不需要添加。然后由于我们使用的IPv6是可变的,因此AllowedIPs至少需要为::/0,确保任意V6地址都被允许。然后B地的配置基本上就是反过来:

[Interface]
PrivateKey = B地自己的私钥
ListenPort = 5789

# 以下peer是A地的配置
[Peer]
PublicKey = A地的公钥
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = wg-a.elkpi.com:5789
PersistentKeepalive = 25

实际测试AB两地都需要配置对端的peer信息,否则不会互相协商成功。然后配置好了之后,我们执行下列的命令来创建两地的组网建联。

# 运行wireguard-go起wg0的隧道,此时使用ifconfig wg0可以看到对应网口信息
wireguard-go wg0
# 生效配置
wg setconf wg0 /etc/config/wireguard/wg0.conf
# 配置生效,网口还没起来,需要执行以下命令up起wg0
ip link set wg0 up

# 后面的脚本就需要两地各自执行了
# A地使用192.168.8.1的IP并添加B地的子网192.168.6.0/24走wg0
ip addr add 192.168.8.1/24 dev wg0
ip route add 192.168.6.1 dev wg0
ip route add 192.168.6.0/24 dev wg0 via 192.168.6.1

# B地使用192.168.8.2的IP并添加A地的子网192.168.9.0/24走wg0
ip addr add 192.168.8.2/24 dev wg0
ip route add 192.168.9.1 dev wg0
ip route add 192.168.9.0/24 dev wg0 via 192.168.9.1

上述命令都执行成功之后,可以使用wg show命令来查看是否建联:

有peer信息并且latest handshake有握手信息,transfer有互相换传输的数据,并且互相ping对方192.168.8.0/24及192.168.9.1/192.168.6.1都可以ping通,那么组网建联就初步完成了(需要注意的是,及时使用了ddns,peer里面的endpoint依旧会被解析为v6的地址,暂时不清楚后续v6重新分配后,是否会重新dns解析,如果不会,那么还需要执行个脚本做v6地址变化的调整)。但是还不能ping通内网其他的IPv4的设备,还需要执行以下的防火墙策略:

# 修改 /etc/config/firewall
config zone 'wg_zone'
	option name 'wg'
	option input 'ACCEPT'
	option output 'ACCEPT'
	option forward 'ACCEPT'
	list device 'wg0'

config forwarding 'wg_2_lan'
	option src 'wg'
	option dest 'lan'

config forwarding 'lan_2_wg'
	option src 'lan'
	option dest 'wg'

config forwarding 'wg_2_wan'
	option src 'wg'
	option dest 'wan'

分别对应wg的防火墙策略,需要都ACCEPT以及wg和lan的互相转发能力支持。至于wg_2_wan则是可选的,如果不期望走wg走wan转换,我理解是可以不用添加这个转发策略。使用命令,生效防火墙:

/etc/init.d/firewall restart

执行防火墙策略后,分别在A地ping B地中的子网内的设备(非小米路由主网关,比如有台设备IP是192.168.6.10,可以直接ping这台设备),响应的B地也需要ping A地中的子网设备。如果都ping通,那么整体组网的逻辑就建设好了。

后续再对以上执行的操作写入shell脚本,并设置开机启动,确保路由器重启可以正常使用。整体组网花了昨天一整天的时间来研究。把踩到的一些坑都记录下。另外,如果调试wireguard-go,可以使用以下命令前台调试:

# 使用debug前台日志等级调试wg0 
LOG_LEVEL=debug wireguard-go -f wg0

其中看了下wireguard-go的代码,LOG_LEVEL支持以下级别:

日志级别说明
verboseverbose日志等级
debugdebug其实和verbose是一样的
errorerror日志,这个也是默认日志等级
silent字面意思就是不打印日志信息

以上就是这个周末折腾的组网事项,还是花了不少时间去踩坑。大家如果有遇上同样的事项,后续可以在评论区交流交流。

转载请注明: 转载自elkPi.com

本文链接地址: 使用wireguard-go两地组网实现内网互通

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top