侧边栏壁纸
博主头像
liveJQ博主等级

沒有乐趣,何来开始

  • 累计撰写 162 篇文章
  • 累计创建 66 个标签
  • 累计收到 2 条评论

OpenWrt 使用 Wireguard 插件组网实现内网穿透

liveJQ
2024-08-11 / 0 评论 / 0 点赞 / 240 阅读 / 2,446 字 / 正在检测是否收录...
广告 广告

概述

本次实验需要使用 WireGuard 架设三个节点,实现通过访问客户端公网IP+端口(或者反代域名)可以经过中继节点转发到达服务端,最终访问到其内部局域网服务。

20240814_wireguard_servers_and_openwrt_topology.png

地址分配情况

客户端(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地址(不与你当前局域网同段就行)。因为这边定义为服务端,所以手动指定下监听端口。
20240814_openwrt_setting_normal.png

高级设置里面,定义下 DNS 和勾选使用默认网关。最关键的地方是定义下面的网关跃点,比如这里是 10,需要比你 br-lan 定义的网关跃点要小(优先),所以我 br-lan 定义的网关跃点修改为 20,默认是 0 最优先。
20240814_openwrt_setting_advanced.png

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

添加单独的防火墙区域,自定义名称为 wireguard。
20240814_openwrt_setting_firewall_zone.png

Peer填入对端的公钥、公网IP和监听端口,然后允许的IP填入你要访问的客户端隧道地址。你应该发现这里我是有设置 Keep-Alive 为 25 的,意思是我这边需要每隔25秒去探测一次对端,因为我这里是动态IP,探测也就是为了告诉对端我现在的公网IP,但是很奇怪没有生效,动态IP改变了之后就断开连接了,需要手动重启下网卡才行,这个待解决。
20240814_openwrt_setting_peer.png

添加防火墙策略

这里需要加一条数据包进来之后的转发规则,也就是从隧道进来的流量都过一次NAT,然后从 br-lan 口出去。
20240814_openwrt_add_firewall_rules.png

这样 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

到这里,三个节点应该都已经成功打通了,之后访问方式就很灵活了,端口映射或反代都是没问题的。

相关资料

  1. wg-quick document
  2. WireGuard Quick Start
  3. wireguard-docs-practice
0

评论区