前几天写过 WireGuard 手动服务端教程后,一部分人想知道如何配置多用户,即多个客户端账号。
同一个账号可以多个设备链接,但是如果你要分享给朋友使用,为了方便管理,建议配置多个账号,这样如果不想要某个人使用的话,直接删除账号即可。
简单说明
其实 WireGuard 的多用户配置特别简单,只需要生成一对客户端密匙(公匙+私匙),在服务端配置文件中新增一段 [Peer] 写上新的客户端公匙和客户端的内网IP地址即可。
当然我们可以用命令快捷添加,或者手动修改服务端配置文件也行。
而各客户端账号配置文件的区别也只是 [Interface] 中的客户端私匙和客户端内网IP地址不同罢了。
另外我们需要明白一个对等原则:
- 服务端配置文件中的 [Interface] 是保存自己的服务端私匙,而客户端配置文件中的 [Interface] 同样保存自己的客户端私匙。
- 服务端配置文件中的 [Peer] 是保存客户端的公匙,而客户端配置文件中的 [Peer] 是保存服务端的公匙。
- 即,服务端与客户端都是互相保存自己的私匙在 [Interface] 中,互相保存对方公匙在 [Peer] 中。
服务端配置文件添加用户
以下步骤是动态添加客户端配置(以下配置前提是你已经配置过 WireGuard 配置文件并启动了)。
你也可以手动修改配置文件 [/etc/wireguard/wg0.conf],记得修改完重启一下。以下动态添加无需重启。
- # 重新生成一对客户端密匙
- # cprivatekey1 为客户端私匙,cpublickey1 为客户端公匙
- wg genkey | tee cprivatekey1 | wg pubkey > cpublickey1
- # 服务器上执行添加客户端配置代码(新增一个 [peer]):
- # $(cat cpublickey1) 这个是客户端公匙,10.0.0.3/32 这个是客户端内网IP地址,按序递增最后一位(.3),不要重复
- wg set wg0 peer $(cat cpublickey1) allowed-ips 10.0.0.3/32
然后查看 WireGuard 状态:
- wg
- # 执行命令后输出内容如下(仅供参考,下面的不是让你执行的命令):
- interface: wg0
- public key: xxxxxxxxxxxxxxxxx #服务端私匙
- private key: (hidden)
- listening port: 443
- peer: xxxxxxxxxxxxxxxxxxxx #旧客户端账号的公匙
- allowed ips: 10.0.0.2/32 #旧客户端账号的内网IP地址
- peer: xxxxxxxxxxxxxxxxxxxx #新客户端账号的公匙
- allowed ips: 10.0.0.3/32 #新客户端账号的内网IP地址
- # 以上内容仅为输出示例(仅供参考)
如果显示正常,那么我们就保存到配置文件:
- wg-quick save wg0
然后我们就要开始生成对应的客户端配置文件了。
生成对应客户端配置文件
新客户端配置文件,和其他客户端账号的配置文件只有 [Interface] 中的客户端私匙、内网IP地址参数不一样。
- # 井号开头的是注释说明,用该命令执行后会自动过滤注释文字。
- # 下面加粗的这一大段都是一个代码!请把下面几行全部复制,然后粘贴到 SSH软件中执行,不要一行一行执行!
- echo “[Interface]
- # 客户端的私匙,对应服务器配置中的客户端公匙(自动读取上面刚刚生成的密匙内容)
- PrivateKey = $(cat cprivatekey1)
- # 客户端的内网IP地址(如果上面你添加的内网IP不是 .3 请自行修改)
- Address = 10.0.0.3/24
- # 解析域名用的DNS
- DNS = 8.8.8.8
- # 保持默认
- MTU = 1420
- [Peer]
- # 服务器的公匙,对应服务器的私匙(自动读取上面刚刚生成的密匙内容)
- PublicKey = $(cat spublickey)
- # 服务器地址和端口,下面的 X.X.X.X 记得更换为你的服务器公网IP,端口请填写服务端配置时的监听端口
- Endpoint = X.X.X.X:443
- # 因为是客户端,所以这个设置为全部IP段即可
- AllowedIPs = 0.0.0.0/0, ::0/0
- # 保持连接,如果客户端或服务端是 NAT 网络(比如国内大多数家庭宽带没有公网IP,都是NAT),那么就需要添加这个参数定时链接服务端(单位:秒),如果你的服务器和你本地都不是 NAT 网络,那么建议不使用该参数(设置为0,或客户端配置文件中删除这行)
- PersistentKeepalive = 25″|sed ‘/^#/d;/^\s*$/d’ > client1.conf
- # 上面加粗的这一大段都是一个代码!请把下面几行全部复制,然后粘贴到 SSH软件中执行,不要一行一行执行!
接下来你就可以将这个客户端配置文件 [/etc/wireguard/client.conf] 通过SFTP、HTTP等方式下载到本地了。
不过我更推荐,SSH中打开显示配置文件内容并复制出来后,本地设备新建一个文本文件 [xxx.conf] (名称随意,后缀名需要是 .conf) 并写入其中,提供给 WireGuard 客户端读取使用。
- cat /etc/wireguard/client.conf
服务端配置文件删除用户
要删除呢也很简单,首先你需要知道你要删除用户的客户端公匙(例如上面刚刚生成的 cpublickey1)。
当然,你也可以手动打开配置文件删除,记得修改后重启。下面的动态删除无需重启。
- wg set wg0 peer $(cat cpublickey1) remove
- # 如果客户端公匙文件还在,那么可以执行这个命令删除。
- # 注意:该命令执行后,就可以跳过下面这段命令了,直接保存配置文件即可。
- ——————————————
- # 如果客户端公匙文件已删除,那么可以通过 wg 命令看到客户端的公匙:
- wg
- # 执行命令后输出内容如下(仅供参考,下面的不是让你执行的命令):
- interface: wg0
- public key: xxxxxxxxxxxxxxxxx #服务端私匙
- private key: (hidden)
- listening port: 443
- peer: xxxxxxxxxxxxxxxxxxxx #客户端账号的公匙
- allowed ips: 10.0.0.2/32 #客户端账号的内网IP地址
- peer: xxxxxxxxxxxxxxxxxxxx #客户端账号的公匙
- allowed ips: 10.0.0.3/32 #客户端账号的内网IP地址
- # 以上内容仅为输出示例(仅供参考)
- # 复制你要删除的客户端账号的公匙(peer 后面的字符),替换下面命令中的 xxxxxxx 并执行即可
- wg set wg0 peer xxxxxxx remove
- # 执行后,我们在用 wg 命令查看一下是否删除成功。
如果删除成功,那么我们就保存到配置文件:
- wg-quick save wg0
完啦~