通过 WireGuard 组建虚拟局域网 实现多个局域网全互联

2024-06-22 12:14:14 21点赞 196收藏 9评论

本文后半部分代码框较多,欢迎点击原文链接获得更佳的阅读体验。

前言

上一篇关于 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

生成配置文件

  1. 访问 http://ip:8080,进入 SERVER 中设置全局配置

Server's interface configurationServer's interface configurationClient's global configurationClient's global configurationInterface configuration hooksInterface configuration hooks
  1. 返回 CLIENTS 中添加节点,勾选 Enable client after creation

Add new clientAdd new client
  1. SUBMIT 之后,还需要重新编辑 client,在 Addresses 中,将这个局域网的网段填入

Edit clientEdit client
  1. 以此类推,将所有的设备都添加进去

添加所有设备添加所有设备
  1. 此时我们拥有了 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

  1. wg0.confUnicomMobile 复制到 Telecom.conf

    • [Interface] 删除 Address 并添加 PostUp 与 PostDown

    • [Peer] 删除 UnicomMobilePresharedKey 并添加 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

  1. 以此类推,将 Unicom.confMobile.conf 做同样的处理

启动 WireGuard

wg-gen-web 只是一个帮助我们生成配置文件的工具,并不能直接启动 WireGuard,还需要通过以下命令启动

systemctl start wg-quick@wg0

每一个 Peer 启动也是如此,将 Telecom.conf 重命名为 wg0.conf 上传至 /etc/wireguard 目录中,启动即可

关于局域网开放 UDP 51820 端口,以及 Android 与 Windows 客户端的使用,可以参考上篇文章通过 WireGuard 与 IPv6 异地组网 实现远程访问局域网

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
9评论

  • 精彩
  • 最新
  • 安装,请参考官方教程去看看
    如果用openWRT,这里有批量生成的脚本,我都是一次性生成20个,去看看

    校验提示文案

    提交
  • 配置完以后几个设备都可以互通吗,是在这一个地方配置即可还是需要几个设备上都做好配置

    校验提示文案

    提交
    所有的设备都需要配置 这个配置文件可以在同一台上面生成再放到其他设备上 要开箱即用的话还是推荐 Tailscale 或者 ZeroTier

    校验提示文案

    提交
    好的,谢谢老哥

    校验提示文案

    提交
    收起所有回复
  • 太麻烦了 不如taiscale

    校验提示文案

    提交
    taiscale是基于wg 的封装,就是为了降低使用难度!当然了wg的优势就是自己可控的地方多

    校验提示文案

    提交
    收起所有回复
  • 如果是v6公网,wg在没有v6公网的情况下无法使用

    校验提示文案

    提交
    现在ipv6三大运营商都有,不管家宽还是移动网络,如果家宽没有就是宽带装维没给你在光猫上打开ipv6,或者自家路由器没开ipv6

    校验提示文案

    提交
    收起所有回复
  • easytier,没有之一

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
196
扫一下,分享更方便,购买更轻松