前情提要:
搞这个的目的在于,虽然现在已经有太多种成熟的虚拟组网方案,但是我想结合类似cl*sh之类的软件使用的话,就没有办法了,电脑上还好点,手机上iOS只能同时开启一个VPN服务就比较蛋疼。之前用过zerotier,速度一般,最近在用tailscale,老是打洞失败,延迟飙到200+ms,也很难受,并且iOS上好不容易出了一个choc结合了tailscale但是作者又不更新跑路了,无意间发现su*ge现在原生支持wireguard,于是有了后面的折腾与研究,这里记录一下免得若干时间后再弄一次又要从头开始。
准备:
- openwrt路由器,内网段192.168.2.1/24
- ipv4或者ipv6公网并做好ddns解析
生成密钥:
首先根据名称上来定义不同的服务端或者客户端密钥,以免混淆
- sprivatekey: 服务端私钥
- spubkey: 服务端公钥
- cprivatekey: 客户端私钥
- cpubkey: 客户端公钥
ssh到你的openwrt路由器,任意目录新建一个wireguard文件夹用于存放密钥,然后在wireguard文件夹下创建一个user1的子目录,用于存放第一个用户的密钥,如果有需要多个客户端,可以自行创建多个。
mkdir wireguard
cd wireguard
umask 077
mkdir user1 生成服务端密钥
wg genkey | tee sprivatekey | wg pubkey > spublickey openwrt配置:
不同的固件可能界面和操作上会有些许不同,我使用的是esir的固件,自带了wireguard,如果你的openwrt并没有内置,请先自行安装wireguard组件
去到网络 - 接口 - 添加新接口,填写名称(推荐用wg0来表示,我这里已经之前有wg0接口了,所以这里取名wg1),协议选择Wireguard VPN创建

新建接口wg0
下一步,填写上上面生成的服务端私钥sprivatekey,端口任意填写,建议使用高位端口,IP地址选择一个新的内网IP,不要和你的openwrt所在内网地址段冲突,我这里使用了192.168.5.1/24的内网段作为wireguard的地址

接口配置
高级设置跳过,保持默认,防火墙设置选择LAN区域,保存并应用

接口配置
接口这里可以看到新建的接口已经有了

wg接口
配置防火墙,点开网络 - 防火墙 - 自定义规则,最后面粘贴上iptable规则,这里网段替换成你自己的
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 br-lan -j MASQUERADE 点开通信规则,打开路由端口,允许UDP协议的10767端口

打开路由器端口
客户端配置
进入刚才创建的user1文件夹,首先生成一个sharekey,后面会用到,再生成客户端对应的私钥和公钥
cd user1
wg genpsk > sharekey
wg genkey | tee cprivatekey | wg pubkey > cpublickey 回到网络 - 接口 - 修改wg0接口,添加一个新的peers,一个peer对应一个客户端
公钥填入客户端的cpubkey
允许的IP随便写一个但是要在刚才定义的网段里面,192.168.5.2/32,::/0
勾选上路由允许的IP,其余的可以留空
左下角更多选项,添加预共享密钥,就是刚才生成的sharekey

peers
创建客户端配置文件
新建一个后缀为.conf的配置文件,填入刚才的信息,注意不要填错
[Interface]
Address = 192.168.5.2
PrivateKey = EJVGe1xWRndYxX7fgIxNCbCsptrFrZrrXm7tFpSG92o= #cprivatekey
DNS = 192.168.2.1 #你的openwrt主路由ip
[Peer]
PublicKey = duV+MYafJXDU1d2GAOf7XnAp29UpUGDJ6IccFfdIHVE= #spubkey
AllowedIPs = 0.0.0.0/0, ::/0
presharedKey = ehTm40IfeeP0dU857VMrQflFKSRN14D+nbynm2EEnmE= #sharekey
Endpoint = ddns.xx.xx:10767 #ddns域名+端口
PersistentKeepalive = 25 手机或者电脑上安装wireguard客户端,导入.conf配置文件,测试连接成功
openwrt菜单栏状态 - WireGuard状态可以查看当前连接信息

连接状态
进阶
加入分流规则,没有su*ge的可以忽略这部分
在su*ge配置文件中加入wireguard的配置块
[Proxy]
REJECT-TINYGIF = reject-tinygif
#这里的OpenwrtWireGuard就是下面会用到的proxy名称
OpenwrtWireGuard = wireguard, section-name = HomeServer
#HomeServer对应上面的section-name,可以自行定义
[WireGuard HomeServer]
private-key = EJVGe1xWRndYxX7fgIxNCbCsptrFrZrrXm7tFpSG92o= #cprivatekey
self-ip = 192.168.5.2
dns-server = 192.168.2.1
prefer-ipv6 = true
mtu = 1280
peer = (public-key = duV+MYafJXDU1d2GAOf7XnAp29UpUGDJ6IccFfdIHVE=, allowed-ips = "0.0.0.0/0, ::/0", endpoint = ddns.xx.xx:10767, preshared-key = ehTm40IfeeP0dU857VMrQflFKSRN14D+nbynm2EEnmE=, keepalive = 25) 然后在下面的[ProxyGroup]中引用我们的wireguard线路
[Proxy Group]
Home = select, OpenwrtWireGuard, DIRECT 效果,iperf随便测试一下,差不多能跑个30-50MB的上传,我这里4G信号不算好可能会更高


THE END