使用WireGuard远程访问OpenWrt内网设备

整体思路

通过一台公网云服务器搭建WireGuard中转节点,所有设备(OpenWrt/手机/电脑)作为客户端接入该节点,形成统一VPN网络,再由OpenWrt把流量引入家庭局域网,实现远程访问内网设备

服务端配置

安装WireGuard

1
apt update && apt install wireguard iptables -y

开启IP转发

1
2
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

作用是让服务器具备路由能力,否则VPN之间的数据无法互相转发

设置NAT转发规则

1
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

作用是把VPN内网流量“伪装成服务器公网流量”,让它能正常访问互联网

允许转发流量

1
2
iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT

允许WireGuard虚拟网段和公网之间双向转发流量,让VPN客户端能正常访问外网并接收返回数据

各个设备密钥生成

1
2
3
4
5
6
7
8
9
10
# 新建文件夹,这个文件夹存放密钥和配置文件
mkdir -p /etc/wireguard
# 生成云服务器(服务端)的密钥
wg genkey | tee server_private.key | wg pubkey | tee server_public.key
# 生成OpenWrt(客户端)的密钥
wg genkey | tee OpenWrt_private.key | wg pubkey | tee OpenWrt_public.key
# 生成安卓手机(客户端)的密钥
wg genkey | tee android_private.key | wg pubkey | tee android_public.key
# 生成笔记本(客户端)的密钥
wg genkey | tee computer_private.key | wg pubkey | tee computer_public.key

WireGuard配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Interface]
PrivateKey = 云服务器的私钥(server_private.key)
Address = 10.0.0.1/24
ListenPort = 51820

[Peer]
PublicKey = OpenWrt的公钥(OpenWrt_public.key)
AllowedIPs = 192.168.2.0/24, 10.0.0.2/32
# 192.168.2.0为本地局域网IP段,请按实际修改
PersistentKeepalive = 25

[Peer]
PublicKey = 安卓手机的公钥(android_public.key)
AllowedIPs = 10.0.0.3/32

[Peer]
PublicKey = 笔记本的公钥(computer_public.key)
AllowedIPs = 10.0.0.4/32

启动WireGuard并设置开机自启动

1
2
systemctl start wg-quick@wg0
systemctl enable wg-quick@wg0

OpenWrt客户端配置

安装WireGuard

1
2
opkg update
opkg install wireguard-tools kmod-wireguard luci-proto-wireguard

安装完成后需重启OpenWrt使配置生效

网络配置

编辑/etc/config/network加入下面的配置

1
2
3
4
5
6
7
8
9
10
11
config interface 'wg0'
option proto 'wireguard'
option private_key 'OpenWrt的私钥(OpenWrt_private.key)'
list addresses '10.0.0.2/24'

config wireguard_wg0
option public_key '云服务器的公钥(server_public.key)'
option endpoint_host '云服务器的公网IP'
option endpoint_port '51820'
option persistent_keepalive '25'
list allowed_ips '10.0.0.0/24'

防火墙配置

编辑/etc/config/firewall加入下面的配置

1
2
3
4
5
6
7
config zone
option name 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
list network 'lan'
list network 'wg0'

重启网络和防火墙

1
2
/etc/init.d/network restart
/etc/init.d/firewall restart

Windows客户端配置

进入WireGuard官网下载Windows客户端程序:

https://www.wireguard.com/install/

下载并安装好后按格式填入下面的配置文件就可以连接上了,Mac客户端也同理

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = computer_private.key
Address = 10.0.0.3/24

[Peer]
PublicKey = server_public
Endpoint = server_ip:51820
AllowedIPs = 192.168.2.0/24,10.0.0.0/24
PersistentKeepalive = 25

Android客户端

进入WireGuard官网下载Android客户端程序:

https://www.wireguard.com/install/

下载并安装好后按格式填入下面的配置文件就可以连接上了,iOS客户端也同理

最终效果

flowchart LR

subgraph WAN[外部网络]
A1[手机]
A2[笔记本]
end

subgraph VPS[云服务器]
B1[WireGuard服务端 10.0.0.1]
B2[NAT转发]
end

subgraph HOME[家庭网络]
C1[OpenWrt 10.0.0.2]
C2[家庭LAN 192.168.2.0/24]
C3[NAS/PC/IoT]
end

A1 --> B1
A2 --> B1

B1 --> B2
B2 --> C1

C1 --> C2
C2 --> C3

使用WireGuard远程访问OpenWrt内网设备
https://chenjihan.com/posts/10532/
作者
陈悸涵
发布于
2024年9月4日
许可协议