背景
现在很多网络环境都覆盖了IPv6了,基本可以通过IPv6的方式实现点对点通信。不过由于IPv6的地址很长,不是很方便记忆。使用DDNS有不是所有的设备都能加上去。目前需要有2地的网络,想要方便的让两地内网可以互相通信,2地的主路由都是小米路由,都开启了SSH访问,可以后台操作。小米原版的系统其实就是OpenWrt。由于没有对主路由刷为第三方,因此不支持内核版本的WireGuard来组网。需要使用wireguard-go来实现组网。
网络环境说明
- 两地的小米路由都加上ddns能力,域名指向AAAA IPv6的公网地址
- 两地的子网分别在不同的子网内,确保后续组网不会冲突
- 后续使用wireguard-go创建的子网走192.168.8.0/24
网络环境明确后,两地确保可以使用IPv6互通(其中需要注意的是,IPv6要关闭防火墙。并且要拿WAN口的IPv6地址,如果拿br-lan获取的IPv6,还需要自己添加防火墙策略,确保可以正常出局。这个被坑了好久,一直以为是哪里配置有问题)。
部署实施
前置准备
接下来就是部署实施的环节了,我们需要提前做一些准备。
- 首先是下载对应的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
- 同样的逻辑,提取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也可以直接使用。
- 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支持以下级别:
日志级别 | 说明 |
---|---|
verbose | verbose日志等级 |
debug | debug其实和verbose是一样的 |
error | error日志,这个也是默认日志等级 |
silent | 字面意思就是不打印日志信息 |
以上就是这个周末折腾的组网事项,还是花了不少时间去踩坑。大家如果有遇上同样的事项,后续可以在评论区交流交流。
转载请注明: 转载自elkPi.com
本文链接地址: 使用wireguard-go两地组网实现内网互通