通过WireGuard组建虚拟局域网 实现多个局域网全互联
通过WireGuard组建虚拟局域网 实现多个局域网全互联
本文将介绍如何使用WireGuard组建虚拟局域网,实现多个局域网的全互联。通过对比wg-easy的局限性,本文将重点介绍在Linux上直接配置WireGuard的方法,包括基本配置、安装步骤以及使用wg-gen-web工具生成配置文件的具体操作。
前言
上一篇关于WireGuard的文章通过Docker安装wg-easy的形式来使用WireGuard,但wg-easy的功能比较有限,并不能发挥出WireGuard的全部潜力。
如果只是想要出门在外随时随地连接家里的局域网,那么wg-easy是一个开箱即用、无需配置的简易工具。
而对于想要把多个地方的局域网组成一个大的虚拟局域网的用户来说,wg-easy就有些力不从心了。对于这部分用户来说,网上大部分教程都是在OpenWRT设置WireGuard进行组网,而今天介绍的是在Linux上直接启动WireGuard来实现多个局域网全互联。
wg-easy优缺点
wg-easy作为开箱即用的工具,WireGuard的配置文件对于用户基本是透明的,只需要在启动Docker容器时,设置好相应的环境变量,直接在Web UI中添加设备,然后扫码或者导入自动生成的配置文件就可以完成连接,非常的简单易用。
正因为配置文件对于用户透明,如果有更多的需求,想要手动修改部分配置,就变得非常的困难了。
配置文件
本文只会介绍必须的配置,更详细的配置可以看这位大佬的文章
在开始之前,我们需要了解WireGuard的基本配置,WireGuard的配置文件采用的是ini的语法,文件命名格式为.conf,默认路径是/etc/wireguard/wg0.conf
配置文件分为[interface]与[Peer]两部分,其中[Interface]定义的是本地节点的配置,[Peer]定义的是对等节点的配置(也就是要连接的远程节点)
[Interface]
- Address:单个IP地址或整个网段
- 常规客户端:例如手机、笔记本,可以设置为单个IP地址 Address = 10.8.0.2/32
- 中继服务器:例如软路由、NAS,可以设置为整个网段 Address = 10.8.0.1/24
- PrivateKey:私钥
- ListenPort:监听端口,默认为51820,常规客户端无需配置
- PostUp:启动接口后运行的命令
# 添加iptables规则,启用数据包转发
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE - PostDown:停止接口后运行的命令
# 停止后删除iptables规则,关闭数据包转发
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
- PublicKey:公钥
- AllowedIPs:路由转发的目标地址
- 常规客户端:可以设置为自身IP地址 Address = 10.8.0.2/32
- 中继服务器:可以设置为虚拟局域网的网段和所在内网网段 Address = 10.8.0.1/24, 192.168.1.0/24
- 中继服务器:还可以设置为 AllowedIPs = 0.0.0.0/0,::/0,转发所有的流量
- Endpoint:节点的公网IP,一般只需指定中继服务器的Endpoint Endpoint = ddns.domain.com:51820
安装WireGuard
Linux内核版本大于等于5.6,系统自带WireGuard,只需要通过以下命令安装wireguard-tools即可
apt install wireguard
对于低内核版本的安装WireGuard过程非常繁琐,有兴趣的可以自行搜索教程
安装wg-gen-web
wg-easy不能自定义配置,而手搓配置文件,客户端一多又非常的繁琐,这次用到的是另一款WireGuard的可视化工具wg-gen-web
通过以下Docker命令直接启动
docker run --rm -it -v /tmp/wireguard:/data -p 8080:8080 -e "WG_CONF_DIR=/data" vx3r/wg-gen-web:latest
也可以通过Docker Compose启动
version: '3.6'
services:
wg-gen-web-demo:
image: vx3r/wg-gen-web:latest
container_name: wg-gen-web-demo
restart: unless-stopped
expose:
- "8080/tcp"
environment:
- WG_CONF_DIR=/data
- WG_INTERFACE_NAME=wg0.conf
- SMTP_HOST=smtp.gmail.com
- SMTP_PORT=587
- SMTP_USERNAME=no-reply@gmail.com
- SMTP_PASSWORD=**********
- SMTP_FROM=Wg Gen Web
- OAUTH2_PROVIDER_NAME=github
- OAUTH2_PROVIDER=https://github.com
- OAUTH2_CLIENT_ID=**********
- OAUTH2_CLIENT_SECRET=**********
- OAUTH2_REDIRECT_URL=https://wg-gen-web-demo.127-0-0-1.fr
volumes:
- /etc/wireguard:/data
生成配置文件
返回CLIENTS中添加节点,勾选Enable client after creation
SUBMIT之后,还需要重新
以此类推,将所有的设备都添加进去
此时我们拥有了4个配置文件(/etc/wireguard/wg0.conf以及添加的3个client)
$ cat /etc/wireguard/wg0.conf
# Updated: 2024-06-21 15:55:58.726520374 +0000 UTC / Created: 2024-06-21 15:49:14.217730273 +0000 UTC
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = YGCi4Jc/s6Ee32bZVma0YCCtdyRBrVZgmQkURklAAWo=
PreUp = echo WireGuard PreUp
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Mobile / / Updated: 2024-06-21 16:15:39.748815304 +0000 UTC / Created: 2024-06-21 16:15:25.886155585 +0000 UTC
[Peer]
PublicKey = LM5i7HeNb34G5Iz3S9274fcxMuTKu6NjkDVX8SLcKjA=
PresharedKey = g8HATK7UubyXaeSE9C8sTxumC7CygXdT766rrh3cMwg=
AllowedIPs = 10.8.0.4/32, 192.168.30.1/24
# Unicom / / Updated: 2024-06-21 16:15:07.982827913 +0000 UTC / Created: 2024-06-21 16:14:18.237769971 +0000 UTC
[Peer]
PublicKey = ex6mAFjEx957kOly9Y573Km4PGKrXEbXmPBkL8smvHw=
PresharedKey = mSmNqhZU+GuimDnttFXSAWqZLrvmzTh5VNIuCmsnPQA=
AllowedIPs = 10.8.0.3/32, 192.168.20.1/24
# Telecom / / Updated: 2024-06-21 16:14:46.592117942 +0000 UTC / Created: 2024-06-21 16:04:04.079557319 +0000 UTC
[Peer]
PublicKey = GPPw22ARd6l1j7ePVR9eOu4jjPW7yvh8HjN+zZc78Xk=
PresharedKey = 1w8XilKRTtFESHEEtTwq8+Va5UvSYDLVdkx+ICR/Bn0=
AllowedIPs = 10.8.0.2/32, 192.168.10.1/24
$ cat Telecom.conf
[Interface]
Address = 10.8.0.2/32, 192.168.10.1/24
PrivateKey = OK8ec/Qk1S8qIO/nSZzXgBcQlqtXB8YJComokZJGP08=
[Peer]
PublicKey = mEiW28urmgzkH0rSXory44z32I/1qoBwIclnEUNeGVg=
PresharedKey = 1w8XilKRTtFESHEEtTwq8+Va5UvSYDLVdkx+ICR/Bn0=
AllowedIPs = 192.168.1.0/24, 10.8.0.1/32
Endpoint = ddns.domain.com:51820
- 将wg0.conf中Unicom与Mobile复制到Telecom.conf中
- [Interface]删除Address并添加PostUp与PostDown
- [Peer]删除Unicom与Mobile的PresharedKey并添加Endpoint
[Interface]
Address = 10.8.0.2/32
PrivateKey = OK8ec/Qk1S8qIO/nSZzXgBcQlqtXB8YJComokZJGP08=
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = mEiW28urmgzkH0rSXory44z32I/1qoBwIclnEUNeGVg=
PresharedKey = 1w8XilKRTtFESHEEtTwq8+Va5UvSYDLVdkx+ICR/Bn0=
AllowedIPs = 192.168.1.0/24, 10.8.0.1/32
Endpoint = ddns.domain.com:51820
# Mobile / / Updated: 2024-06-21 16:15:39.748815304 +0000 UTC / Created: 2024-06-21 16:15:25.886155585 +0000 UTC
[Peer]
PublicKey = LM5i7HeNb34G5Iz3S9274fcxMuTKu6NjkDVX8SLcKjA=
AllowedIPs = 10.8.0.4/32, 192.168.30.1/24
Endpoint = ddns.mobile.com:51820
# Unicom / / Updated: 2024-06-21 16:15:07.982827913 +0000 UTC / Created: 2024-06-21 16:14:18.237769971 +0000 UTC
[Peer]
PublicKey = ex6mAFjEx957kOly9Y573Km4PGKrXEbXmPBkL8smvHw=
AllowedIPs = 10.8.0.3/32, 192.168.20.1/24
Endpoint = ddns.unicom.com:51820
- 以此类推,将Unicom.conf与Mobile.conf做同样的处理
启动WireGuard
wg-gen-web只是一个帮助我们生成配置文件的工具,并不能直接启动WireGuard,还需要通过以下命令启动
systemctl start wg-quick@wg0
每一个Peer启动也是如此,将Telecom.conf重命名为wg0.conf上传至/etc/wireguard目录中,启动即可
关于局域网开放UDP 51820端口,以及Android与Windows客户端的使用,可以参考上篇文章通过WireGuard与IPv6异地组网实现远程访问局域网