概述
本次实验需要使用 WireGuard 架设三个节点,实现通过访问客户端公网IP+端口(或者反代域名)可以经过中继节点转发到达服务端,最终访问到其内部局域网服务。
地址分配情况
客户端(Ubuntu 20.04):
e0:3.3.3.3(公网静态IP)
e1:10.0.0.1/30
wg0:172.16.16.3/24
中继节点(Ubuntu 20.04):
e0:2.2.2.2(公网静态IP)
e1:10.0.0.2/30
wg0:172.16.16.1/24
服务端(OpenWrt 23.05):
e0(br-lan):192.168.111.10/24
wg0:172.16.16.2/24
OpenWrt
安装 WireGuard VPN 插件
需要安装如下软件包
wireguard-tools
kmod-wireguard
luci-proto-wireguard
qrencode(可选,生成配置二维码)
安装后重启系统,才能在网卡选项中出现“WireGuard VPN”。修改 WireGuard 配置之前,最好先停止wg0
网卡,修改完毕先保存应用配置,然后再重启网卡生效。
配置 wg0 虚拟网卡
创建好wg0
网卡后编辑接口,配置常规设置。点击生成密钥对,设置当前隧道IP地址(不与你当前局域网同段就行)。因为这边定义为服务端,所以手动指定下监听端口。
高级设置里面,定义下 DNS 和勾选使用默认网关。最关键的地方是定义下面的网关跃点,比如这里是 10,需要比你 br-lan 定义的网关跃点要小(优先),所以我 br-lan 定义的网关跃点修改为 20,默认是 0 最优先。
-----------------------------------------------------
root@ImmortalWrt:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.111.2 0.0.0.0 UG 20 0 0 br-lan
2.2.2.2 192.168.111.2 255.255.255.255 UGH 20 0 0 br-lan
172.16.16.0 0.0.0.0 255.255.255.0 U 10 0 0 wg0
172.16.16.3 0.0.0.0 255.255.255.255 UH 10 0 0 wg0
192.168.111.0 0.0.0.0 255.255.255.0 U 20 0 0 br-lan
Peer填入对端的公钥、公网IP和监听端口,然后允许的IP填入你要访问的客户端隧道地址。你应该发现这里我是有设置 Keep-Alive 为 25 的,意思是我这边需要每隔25秒去探测一次对端,因为我这里是动态IP,探测也就是为了告诉对端我现在的公网IP,但是很奇怪没有生效,动态IP改变了之后就断开连接了,需要手动重启下网卡才行,这个待解决。
添加防火墙策略
这里需要加一条数据包进来之后的转发规则,也就是从隧道进来的流量都过一次NAT,然后从 br-lan 口出去。
这样 OpenWrt 这边的配置就算是搞定了。
云服务器
中继节点
安装和配置可以参考另一篇 Ubuntu 部署 WireGuard VPN 实现客户端上网。
cat /etc/wireguard/wg0.conf
[Interface]
Address = 172.16.16.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = 6JC8pY9XDNRIPMWTPuTBy/h5DuJd/N6Mee0jTK6T/0M=
[Peer]
PublicKey = QJ6s1GeA3ZATTeqA3D1ZsBXyyYVwn2n9W4OAeeUPdBc=
AllowedIPs = 172.16.16.2/32,192.168.111.0/24
[Peer]
PublicKey = 3dUiEmBhiqLmF7NGW3xqQu8UBJLieekJaHZkP806PT4=
AllowedIPs = 172.16.16.3/24
Endpoint = 10.0.0.1:51820
客户端
cat /etc/wireguard/wg0.conf
[Interface]
Address = 172.16.16.3/24
SaveConfig = true
ListenPort = 51820
PrivateKey = 8BAnFcVpbVMsKb+xvNOyGBBD0zBIjd6ToVgvip/VD2I=
[Peer]
PublicKey = YVBuY+nrsH32YxL02eeogvces87GuC23Uw2m3/VoMRU=
AllowedIPs = 172.16.16.1/24,192.168.111.0/24
Endpoint = 10.0.0.2:51820
AllowedIPs 参数
对于路由,系统会优先走最具体的路径,例如:发往 172.16.16.2 的数据包会优先选择 172.16.16.2/32,若不存在再尝试走 172.16.16.2/24 。
- 端点是客户端,只路由自身的流量:
AllowedIPs = 172.16.16.2/32
- 端点是中继节点,可以将流量转发到其他端点:
AllowedIPs = 172.16.16.1/24
因为我这里是需要访问服务端局域网网段192.168.111.0/24
,所以需要在 AllowedIPs 中加入这个网段以允许放行该网段流量,并且还需要在客户端和中继节点上为其添加一条静态路由。
客户端:
ip route add 192.168.111.0/24 via 172.16.16.1 dev wg0
中继节点:
ip route add 192.168.111.0/24 via 172.16.16.2 dev wg0
到这里,三个节点应该都已经成功打通了,之后访问方式就很灵活了,端口映射或反代都是没问题的。
评论区