wireguard搭建记录

WireGuard是一款简洁、快速且现代化的VPN。本文记录了利用wireguard搭建内网穿透的步骤。

准备工作

首先,需要一台公网服务器,假设其地址是wg-server.com。防火墙放开一个UDP端口给wireguard使用,假设是54321

再准备一台局域网服务器,作为局域网入口设备。我选择的是immortalWrt旁路由。如果有多个局域网需要穿透,则每个局域网都需要准备一台。下面以两个局域网为例。假如第一个局域网网段是192.168.x.0/24,旁路由IP是192.168.x.51。第二个局域网网段是192.168.y.0/24,旁路由IP是192.168.y.53。需要特别注意的是,这两个局域网网段不能一样。

给wireguard网络选择一个网段,可以任意选择。下面以10.28.0.0/24为例。

对接入wireguard网络的设备,我选择静态分配IP地址。所以需要给所有接入wireguard网络的设备规划IP地址。我有3台移动设备,外加2台旁路由,所以总共5台设备。IP分配参考下表。

IP 主机名 备注
10.28.0.1 wg-server.com 公网服务器
10.28.0.51 wrt-x.lan 第一个局域网旁路由,局域网网段192.168.x.0/24。DNS服务器。
10.28.0.53 wrt-y.lan 第二个局域网旁路由,局域网网段192.168.y.0/24。DNS服务器。
10.28.0.135 windows.lan 接入wireguard网络的Windows电脑
10.28.0.150 phone.lan 接入wireguard网络的手机
10.28.0.178 linux.lan 接入wireguard网络的linux电脑

以上所有lan域名,均在两台旁路由的dns服务器添加了解析,解析地址是局域网IP,而不是wireguard网络IP。

最终设置完成后,windows电脑、Linux电脑以及手机,在任意网络环境下接入公网,连上wireguard网络后,就可以使用lan域名访问局域网下面的设备。

以下是设置的详细过程。

服务器安装与配置

所有接入wireguard网络的设备,通过这一台公网服务器交换数据。安装命令参考如下,需要root权限。

1
apt install wireguard

生成私钥与公钥

服务器和所有客户端都需要生成一对私钥和公钥。下面生成了服务器和所有客户端的私钥和公钥。后面编写配置文件的时候会用到。

1
2
3
4
5
6
7
8
9
10
11
12
mkdir -p /etc/wireguard
cd /etc/wireguard

# 服务端密钥
wg genkey | tee server_privatekey | wg pubkey > server_publickey

# 客户端密钥,按需生成
wg genkey | tee wrt-x_privatekey | wg pubkey > wrt-x_publickey
wg genkey | tee wrt-y_privatekey | wg pubkey > wrt-y_publickey
wg genkey | tee windows_privatekey | wg pubkey > windows_publickey
wg genkey | tee phone_privatekey | wg pubkey > phone_publickey
wg genkey | tee linux_privatekey | wg pubkey > linux_publickey

创建配置文件

创建配置文件/etc/wireguard/wg0.conf。内容参考如下。[Interface]是服务器网卡的配置。PostUp表示启动网卡时执行的指令,这条iptable规则表示允许wireguard进来的流量通过本机转发。随后是5个[Peer]。公钥填入对应客户端的公钥,AllowedIPs填入给客户端分配的IP地址。对于两台旁路由,还需要填入其所在局域网的网段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[Interface]
PrivateKey = 服务器私钥
Address = 10.28.0.1/32
ListenPort = 54321
DNS = 10.28.0.51
PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT

# wrt-x.lan
[Peer]
PublicKey = 客户端私钥
AllowedIPs = 10.28.0.51/32,192.168.x.0/24

# wrt-y.lan
[Peer]
PublicKey = 客户端私钥
AllowedIPs = 10.28.0.53/32,192.168.y.0/24

# windows.lan
[Peer]
PublicKey = 客户端私钥
AllowedIPs = 10.28.0.135/32

# phone.lan
[Peer]
PublicKey = 客户端私钥
AllowedIPs = 10.28.0.150/32

# linux.lan
[Peer]
PublicKey = 客户端私钥
AllowedIPs = 10.28.0.178/32

启动服务

最后,启动wireguard服务,并打开开机自启动。如果服务启动失败,可以用命令wg-quick up wg0启动,观察log。配置文件修改后,可以使用命令systemctl restart wg-quick@wg0重启服务。服务重启后,客户端如果要立即重连,也需要重启。也可以等待一段时间后,自动重连。取决于客户端设置的PersistentKeepalive参数。

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

客户端

immortalwrt系统

两个旁路由的设置过程类型,这里以wrt-x.lan为例。软件包搜索安装 luci-proto-wireguard。安装完成后重启系统。

系统启动后,进入网络->接口->添加新接口,名字写wg0,协议选择WireGuard VPN,点击创建接口,进入接口配置页面。

常规设置选项卡:

  • 私钥:步骤 生成私钥与公钥 有给客户端生成私钥,填入即可
  • 公钥:步骤 生成私钥与公钥 有给客户端生成公钥,填入即可
  • 监听端口:不填
  • IP地址:填入规划的IP地址。这是指定客户端网卡的IP地址,最好设置成 /32

防火墙选项卡,创建防火墙区域wg对端选项卡,点击添加对端公钥填入服务器的公钥,私钥填入服务器的私钥,允许的IP10.28.0.0/24192.168.x.0/24,勾选为允许的IP创建路由对端地址填入服务器的地址,对端端口填入服务器的端口,持续保持连接填25。点击保存,回到上一级页面,点击保存并应用。如果再次修改网卡配置,保存后,建议手工点一下重启网卡,确保设置生效。

划重点,持续保持连接一定要填,如果没有填,客户端不会定时握手,NAT环境下可能会导致网络断连。

接口配置完成后,还需要配置防火墙,进入网络->防火墙,在常规设置选项卡中,找到wg区域,点击编辑,输入、出站数据、区域内转发都选择接受,允许转发到目标区域允许来自源区域的转发都选择lan区域。这是允许wg区域访问lan区域的网络。最终设置效果如下。

点击NAT规则选项卡,新增一个nat规则。名称填wg-to-lan,出站区域选lan,操作选MASQUERADE。如下图所示。点击保存。这条NAT规则是wireguard网络能访问局域网设备的关键。

至此,immortalwrt wireguard设置完成。登录服务器,10.28.0.51192.168.x.51,以及192.168.x.0/24局域网下的所有设备都能ping通了。如果旁路由使用SamrtDNS作为主dns服务器,还需要取消smartdns的设备绑定。服务->SmartDNS,高级设置选项卡,取消勾选绑定设备,点击保存。在主服务器,使用指令nslookup wrt-x.lan 10.28.0.51测试DNS服务器是否正常。

iphone手机

AppStore搜索并安装 wireguard。注意,需要美区账号才能搜索到。在任意一个Linux系统创建配置文件,示例如下。在[Interface]字段填入手机的私钥、地址和DNS服务器。因为要解析lan域名,所以DNS指向旁路由。[Peer]填入服务器的信息,关键是AllowedIPs的配置,这里决定了手机能访问哪一个局域网。假如手机已经在一个局域网了,那么AllowedIPs只需要加另一个局域网网段。

1
2
3
4
5
6
7
8
9
10
[Interface]
PrivateKey = phone私钥
Address = 10.28.0.150/32
DNS = 10.28.0.51

[Peer]
PublicKey = 服务器公钥
Endpoint = 服务器地址
AllowedIPs = 10.28.0.0/24, 192.168.x.0/24, 192.168.y.0/24
PersistentKeepalive = 25

使用指令 qrencode -t ansiutf8 < xxx.conf 将配置文件转换成二维码。如果没有qrencode指令,可以使用apt install qrencode 安装。iPhone 打开wireguard,点击右上角的加号,选择扫描二维码,扫描刚刚添加的二维码即可。然后按提示操作即可。激活网络,在浏览器输入局域网网址,测试网络是否能正常访问。

Linux系统

我的Linux系统是Mint。安装指令如下,需要root权限。

1
2
3
apt install wireguard
mkdir -p /etc/wireguard
cd /etc/wireguard

创建配置文件 /etc/wireguard/wg0.conf,示例配置如下。添加了一条PostUp指令,将网卡wg0的域名设置为lan。确保能解析本地域名。使用指令wg-quick up wg0加入wireguard网络,执行wg-quick down wg0退出wireguard网络。加入和退出都需要root权限。

1
2
3
4
5
6
7
8
9
10
11
[Interface]
PrivateKey = 客户端私钥
Address = 10.28.0.178/32
DNS = 10.28.0.51
PostUp = resolvectl domain wg0 "lan"

[Peer]
PublicKey = 服务器公钥
Endpoint = 服务器地址
AllowedIPs = 10.28.0.0/24, 192.168.x.0/24, 192.168.y.0/24
PersistentKeepalive = 25

windows系统

进入https://download.wireguard.com/windows-client/下载安装包,下载完成后安装并打开。首先创建配置文件,示例如下。在wireguard页面,新建隧道,选择刚刚创建的配置文件,点击连接,即可接入wireguard网络。

1
2
3
4
5
6
7
8
9
10
[Interface]
PrivateKey = 客户端私钥
Address = 10.28.0.135/32
DNS = 10.28.0.51

[Peer]
PublicKey = 服务器公钥
Endpoint = 服务器地址
AllowedIPs = 10.28.0.0/24, 192.168.x.0/24, 192.168.y.0/24
PersistentKeepalive = 25

添加新的客户端

如果未来有新的客户端需要加入,步骤如下:

  1. 分配IP地址
  2. 创建私钥和公钥
  3. 服务器添加peer,并重启服务
  4. 编写配置文件
  5. 安装对应系统的客户端,导入配置文件

参考