墨少离 - 个人小站,分享一些资源以及心得~ - Wireguard配置 https://www.msl.la/tag/Wireguard%E9%85%8D%E7%BD%AE/ Wireguard 全互联模式(full mesh)配置指南 https://www.msl.la/archives/267/ 2021-04-12T14:51:00+08:00 上篇文章给大家介绍了如何使用 wg-gen-web 来方便快捷地管理 WireGuard 的配置和秘钥,文末埋了两个坑:一个是 WireGuard 的全互联模式(full mesh),另一个是使用 WireGuard 作为 Kubernetes 的 CNI 插件。今天就来填第一个坑。首先解释一下什么是全互联模式(full mesh),全互联模式其实就是一种网络连接形式,即所有结点之间都直接连接,不会通过第三方节点中转流量。和前面提到的点对多点架构 其实是一个意思。1. 全互联模式架构与配置在 WireGuard 的世界里没有 Server 和 Client 之分,所有的节点都是 Peer。大家使用 WireGuard 的常规做法是找一个节点作为中转节点,也就是 VPN 网关,然后所有的节点都和这个网关进行连接,所有节点之间都通过这个网关来进行通信。这种架构中,为了方便理解,我们可以把网关看成 Server,其他的节点看成 Client,但实际上是不区分 Server 和 Client 的。举个例子,假设有 4 个节点,分别是 A/B/C/D,且这 4 个节点都不在同一个局域网,常规的做法是选取一个节点作为 VPN 网关,架构如图:这种架构的缺点我在之前的文章里也介绍过了,缺点相当明显:当 Peer 越来越多时,VPN 网关就会变成垂直扩展的瓶颈。通过 VPN 网关转发流量的成本很高,毕竟云服务器的流量很贵。通过 VPN 网关转发流量会带来很高的延迟。那么全互联模式是什么样的架构呢?还是假设有 A/B/C/D 四个节点,每个节点都和其他节点建立 WireGuard 隧道,架构如图:这种架构带来的直接优势就是快!任意一个 Peer 和其他所有 Peer 都是直连,无需中转流量。那么在 WireGuard 的场景下如何实现全互联模式呢?其实这个问题不难,难点在于配置的繁琐程度,本文的主要目标就是精简 WireGuard 全互联模式的配置流程。为了让大家更容易理解,咱们还是先通过架构图来体现各个 Peer 的配置:配置一目了然,每个 Peer 和其他所有 Peer 都是直连,根本没有 VPN 网关这种角色。当然,现实世界的状况没有图中这么简单,有些 Peer 是没有公网 IP 的,躲在 NAT 后面,这里又分两种情况:NAT 受自己控制。这种情况可以在公网出口设置端口转发,其他 Peer 就可以通过这个公网 IP 和端口连接当前 Peer。如果公网 IP 是动态的,可以通过 DDNS 来解决,但 DDNS 会出现一些小问题,解决方法可以参考 WireGuard 的优化。NAT 不受自己控制。这种情况无法在公网出口设置端口转发,只能通过 UDP 打洞来实现互联.接着上述方案再更进一步,打通所有 Peer 的私有网段,让任意一个 Peer 可以访问其他所有 Peer 的私有网段的机器。上述配置只是初步完成了全互联,让每个 Peer 可以相互访问彼此而已,要想相互访问私有网段,还得继续增加配置,还是直接看图:红色字体部分就是新增的配置,表示允许访问相应 Peer 的私有网段,就是这么简单。详细的配置步骤请看下一节。2. 全互联模式最佳实践对如何配置有了清晰的思路之后,接下来就可以进入实践环节了。我不打算从 WireGuard 安装开始讲起,而是以前几篇文章为基础添砖加瓦。所以我建议读者先按顺序看下这两篇文章:WireGuard 快速安装教程WireGuard 配置教程:使用 wg-gen-web 来管理 WireGuard 的配置咱们直接从配置开始说起。手撸配置的做法是不明智的,因为当节点增多之后工作量会很大,我还是建议通过图形化界面来管理配置,首选 wg-gen-web。现在还是假设有上节所述的 4 个 Peer,我们需要从中挑选一个 Peer 来安装 wg-gen-web,然后通过 wg-gen-web 来生成配置。挑选哪个 Peer 无所谓,这个没有特殊限制,这里假设挑选 AWS 来安装 wg-gen-web。安装的步骤直接略过,不是本文的重点,不清楚的可以阅读我之前的文章 WireGuard 配置教程:使用 wg-gen-web 来管理 WireGuard 的配置。Server 配置如图:生成 Azure 的配置:SUBMIT 之后再点击 EDIT,添加私有网段:查看 wg0.conf 的内容:$ cat /etc/wireguard/wg0.conf # Updated: 2021-02-24 07:34:23.805535396 +0000 UTC / Created: 2021-02-24 07:24:02.208816462 +0000 UTC [Interface] Address = 10.0.0.1/24 ListenPort = 51820 PrivateKey = eEnHKGkGksx0jqrEDogjRj5l417BrEA39lr7WW9L9U0= PreUp = echo WireGuard PreUp PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i 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 -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # Azure / / Updated: 2021-02-24 07:43:52.717385042 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC [Peer] PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY= PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs= AllowedIPs = 10.0.0.2/32, 192.168.20.0/24 下载 Azure 配置文件:可以看到配置文件内容为:$ cat Azure.conf [Interface] Address = 10.0.0.2/32, 192.168.20.0/24 PrivateKey = IFhAyIWY7sZmabsqDDESj9fqoniE/uZFNIvAfYHjN2o= [Peer] PublicKey = JgvmQFmhUtUoS3xFMFwEgP3L1Wnd8hJc3laJ90Gwzko= PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs= AllowedIPs = 10.0.0.1/32, 192.168.10.0/24 Endpoint = aws.com:51820 先不急着修改,一鼓作气生成所有 Peer 的配置文件:这时你会发现 wg0.conf 中已经包含了所有 Peer 的配置:$ cat /etc/wireguard/wg0.conf # Updated: 2021-02-24 07:57:00.745287945 +0000 UTC / Created: 2021-02-24 07:24:02.208816462 +0000 UTC [Interface] Address = 10.0.0.1/24 ListenPort = 51820 PrivateKey = eEnHKGkGksx0jqrEDogjRj5l417BrEA39lr7WW9L9U0= PreUp = echo WireGuard PreUp PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i 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 -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # Aliyun / / Updated: 2021-02-24 07:57:45.941019829 +0000 UTC / Created: 2021-02-24 07:57:45.941019829 +0000 UTC [Peer] PublicKey = kVq2ATMTckCKEJFF4TM3QYibxzlh+b9CV4GZ4meQYAo= PresharedKey = v818B5etpRlyVYHGUrv9abM5AIQK5xeoCizdWj1AqcE= AllowedIPs = 10.0.0.4/32, 192.168.40.0/24 # GCP / / Updated: 2021-02-24 07:57:27.3555646 +0000 UTC / Created: 2021-02-24 07:57:27.3555646 +0000 UTC [Peer] PublicKey = qn0Xfyzs6bLKgKcfXwcSt91DUxSbtATDIfe4xwsnsGg= PresharedKey = T5UsVvOEYwfMJQDJudC2ryKeCpnO3RV8GFMoi76ayyI= AllowedIPs = 10.0.0.3/32, 192.168.30.0/24 # Azure / / Updated: 2021-02-24 07:57:00.751653134 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC [Peer] PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY= PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs= AllowedIPs = 10.0.0.2/32, 192.168.20.0/24 现在问题就好办了,我们只需将 wg0.conf 中的 Aliyun 和 GCP 部分的配置拷贝到 Azure 的配置中,并删除 PresharedKey 的配置,再添加 Endpoint 的配置和 PostUP/PostDown 规则,最后别忘了删除 Address 中的私有网段:$ cat Azure.conf [Interface] Address = 10.0.0.2/32 PrivateKey = IFhAyIWY7sZmabsqDDESj9fqoniE/uZFNIvAfYHjN2o= PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i 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 -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = JgvmQFmhUtUoS3xFMFwEgP3L1Wnd8hJc3laJ90Gwzko= PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs= AllowedIPs = 10.0.0.1/32, 192.168.10.0/24 Endpoint = aws.com:51820 # Aliyun / / Updated: 2021-02-24 07:57:45.941019829 +0000 UTC / Created: 2021-02-24 07:57:45.941019829 +0000 UTC [Peer] PublicKey = kVq2ATMTckCKEJFF4TM3QYibxzlh+b9CV4GZ4meQYAo= AllowedIPs = 10.0.0.4/32, 192.168.40.0/24 Endpoint = aliyun.com:51820 # GCP / / Updated: 2021-02-24 07:57:27.3555646 +0000 UTC / Created: 2021-02-24 07:57:27.3555646 +0000 UTC [Peer] PublicKey = qn0Xfyzs6bLKgKcfXwcSt91DUxSbtATDIfe4xwsnsGg= AllowedIPs = 10.0.0.3/32, 192.168.30.0/24 Endpoint = gcp.com:51820 同理,GCP 的配置如下:$ cat GCP.conf [Interface] Address = 10.0.0.3/32 PrivateKey = oK2gIMBAob67Amj2gT+wR9pzkbqWGNtq794nOoD3i2o= PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i 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 -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = JgvmQFmhUtUoS3xFMFwEgP3L1Wnd8hJc3laJ90Gwzko= PresharedKey = T5UsVvOEYwfMJQDJudC2ryKeCpnO3RV8GFMoi76ayyI= AllowedIPs = 10.0.0.1/32, 192.168.10.0/24 Endpoint = aws.com:51820 # Aliyun / / Updated: 2021-02-24 07:57:45.941019829 +0000 UTC / Created: 2021-02-24 07:57:45.941019829 +0000 UTC [Peer] PublicKey = kVq2ATMTckCKEJFF4TM3QYibxzlh+b9CV4GZ4meQYAo= AllowedIPs = 10.0.0.4/32, 192.168.40.0/24 Endpoint = aliyun.com:51820 # Azure / / Updated: 2021-02-24 07:57:00.751653134 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC [Peer] PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY= AllowedIPs = 10.0.0.2/32, 192.168.20.0/24 Endpoint = azure.com:51820 Aliyun 的配置如下:$ cat Aliyun.conf [Interface] Address = 10.0.0.4/32 PrivateKey = +A1ZESJjmHuskB4yKqTcqC3CB24TwBKHGSffWDHxI28= PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i 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 -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = JgvmQFmhUtUoS3xFMFwEgP3L1Wnd8hJc3laJ90Gwzko= PresharedKey = v818B5etpRlyVYHGUrv9abM5AIQK5xeoCizdWj1AqcE= AllowedIPs = 10.0.0.1/32, 192.168.10.0/24 Endpoint = aws.com:51820 # GCP / / Updated: 2021-02-24 07:57:27.3555646 +0000 UTC / Created: 2021-02-24 07:57:27.3555646 +0000 UTC [Peer] PublicKey = qn0Xfyzs6bLKgKcfXwcSt91DUxSbtATDIfe4xwsnsGg= AllowedIPs = 10.0.0.3/32, 192.168.30.0/24 Endpoint = gcp.com:51820 # Azure / / Updated: 2021-02-24 07:57:00.751653134 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC [Peer] PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY= AllowedIPs = 10.0.0.2/32, 192.168.20.0/24 Endpoint = azure.com:51820 最后在各自的节点上通过各自的配置文件把 WireGuard 跑起来,就搞定了。整个图形化界面配置过程中不需要手动调整配置,功能还是比较完善的,只有客户端的配置需要手动调整。如果你无法接受手动调整配置,可以尝试另外一个项目:wg-meshconf,这个项目专门用来生成 mesh 的配置,但没有图形化管理界面。各有利弊吧,大家自行选择。3. 总结我知道,很多人可能还是一头雾水,这玩意儿的应用场景有哪些?我随便举个简单的例子,假设你在云服务器上部署了 Kubernetes 集群,可以用本地的机器和云服务器的某台节点组建 WireGuard 隧道,然后在本地的 AllowedIPs 中加上 Pod 网段和 Service 网段,就可以那啥了,你懂吧?好吧,又埋了一个坑,关于如何在家中直接访问云服务器 k8s 集群的 Pod IP 和 Service IP,后面会有专门的文章给大家讲解,虽然我也不确定是多久以后。。 WireGuard 快速安装教程 https://www.msl.la/archives/249/ 2021-04-12T14:09:31+08:00 WireGuard 的安装和使用条件非常苛刻,对内核版本要求极高,不仅如此,在不同的系统中,内核,内核源码包,内核头文件必须存在且这三者版本要一致。所以一般不建议在生成环境中安装,除非你对自己的操作很有把握。Red Hat、CentOS、Fedora 等系统的内核,内核源码包,内核头文件包名分别为 kernel、kernel-devel、kernel-headers,Debian、Ubuntu 等系统的内核,内核源码包,内核头文件包名分别为 kernel、linux-headers。果这三者任一条件不满足的话,则不管是从代码编译安装还是从 repository 直接安装,也只是安装了 wireguard-tools 而已。而 WireGuard 真正工作的部分,是 wireguard-dkms,也就是动态内核模块支持(DKMS),是它将 WireGuard 编译到系统内核中。因此,在某些 VPS 商家,是需要你先自主更换系统内核,并事先将这三者安装好,才有可能不会出现编译或安装失败。当然,目前 WireGuard 已经被合并到 Linux 5.6 内核中了,如果你的内核版本 >= 5.6,就可以用上原生的 WireGuard 了,只需要安装 wireguard-tools 即可。例如,对于 Ubuntu 20.04 来说,它的内核版本是 5.4,虽然小于 5.6,但经过我的测试发现它已经将 WireGuard 合并到了内核中,我们只需要安装 wireguard-tools 即可:$ sudo apt install wireguard -y下面讨论 WireGuard 在低版本内核中的安装方法。1. 升级内核对于 Ubuntu 等 apt 系的发行版来说,不需要升级内核即可安装 WireGuard,可以略过此步骤。如果你使用的是 CentOS 等 rpm 系的发行版,必须要升级内核,步骤如下:① 载入公钥$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org``` ② 升级安装 elrepo$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm`③ 载入 elrepo-kernel 元数据$ yum --disablerepo=\* --enablerepo=elrepo-kernel repolist``` ④ 安装最新版本的内核$ yum --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml.x86_64 -y`⑤ 删除旧版本工具包$ yum remove kernel-tools-libs.x86_64 kernel-tools.x86_64 -y``` ⑥ 安装新版本工具包$ yum --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml-tools kernel-ml-devel kernel-ml-headers -y`⑦ 查看内核插入顺序$ grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2 CentOS Linux (3.10.0-1127.10.1.el7.x86_64) 7 (Core) CentOS Linux (5.7.2-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (0-rescue-96820b9851c24560b5f942f2496b9aeb) 7 (Core)``` 默认新内核是从头插入,默认启动顺序也是从 0 开始。 ⑧ 查看当前实际启动顺序$ grub2-editenv listsaved_entry=CentOS Linux (3.10.0-1127.10.1.el7.x86_64) 7 (Core)`⑨ 设置默认启动$ grub2-set-default 'CentOS Linux (5.7.2-1.el7.elrepo.x86_64) 7 (Core)'``` 最后重启检查:$ reboot$ uname -r`2. 安装 WireGuard升级内核之后,就可以根据官方文档来安装 WireGuard 了。不过这里我要介绍一个更狂野的安装方法,它更高效,也更不容易出错,那就是通过源代码编译安装。先别急着反驳,我知道从源代码编译看起来一点都不容易,但请听我说完。你以为我会教你如何从头开始编译吗?那不可能,有违我这篇文章的初衷,我要推荐一位大佬——秋水逸冰的一键安装脚本,它可以让你哼着小曲就能从源码编译安装 WireGuard,只需一条命令即可。脚本的使用方法超级简单,先下载脚本,然后赋予执行权限,最后执行一条命令搞定:$ wget --no-check-certificate -O /opt/wireguard.sh https://raw.githubusercontent.com/teddysun/across/master/wireguard.sh $ chmod 755 /opt/wireguard.sh $ /opt/wireguard.sh -s关于该脚本需要说明几点:支持两种安装方式:既支持从源代码编译安装,也支持从包管理器直接安装。脚本会创建默认的 wg0 设备,以及 wg0 的客户端配置,并生成客户端配置对应的二维码 png 图片。脚本会修改本机防火墙设置,如果未启用防火墙,则会出现警告提示,需要手动去设置。脚本会从 1024 到 20480 随机生成监听端口。脚本支持新增,删除,列出客户端功能。脚本支持查看已安装的 WireGuard 的版本号。脚本支持从代码编译安装的方式升级 WireGuard 到当前最新版本。对于咱手艺人来说,肯定是不想用它自动生成的配置的,如果你想自己生成配置文件,请直接将配置文件目录清空:$ rm -rf /etc/wireguard/*然后手动生成秘钥和配置文件,具体的流程请参考:WireGuard 的搭建使用与配置详解。如果你想通过 Web UI 来管理 WireGuard 的配置文件,可以看看这个项目:Wg Gen Web参考文档WireGuard 一键安装脚本 CentOS8 安装最新版的Wireguard https://www.msl.la/archives/89/ 2021-01-08T17:30:00+08:00 2017年,新一代VPN技术wireguard诞生。wireguard基于linux kernel内核运行,效率极高,速度很快,而且支持设备IP地址漫游功能,不仅适合服务器之间的互联,还适合在NAT环境下使用,包括家中的智能路由器,配合openwrt等路由器,可安装wireguard,实现路由器绑定wireguard代理功能。其实我已经用Wireguard 很久了,但是一直没有时间去写如何配置,抽空写一篇博客来证明一下我自己还躺下一、 Wireguard 服务器配置我用的是CentOS 8 64bit系统,首先先更新系统内核,我们执行以下命令#1.导入key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org #2.安装 ELRepo for RHEL-8 or CentOS-8: dnf install https://www.elrepo.org/elrepo-release-8.1-1.el8.elrepo.noarch.rpm #3.安装内核 dnf --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml 重启服务器后确认下内核是否安装成功grubby --default-kernel /boot/vmlinuz-5.5.5-1.el8.elrepo.x86_64 uname -r 5.5.5-1.el8.elrepo.x86_64启动完毕后我们加入 Wireguard 的 yum 源sudo curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo sudo yum install epel-release -y sudo yum install wireguard-dkms wireguard-tools -y记得要开启IPv4的转发echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p随后,使用命令创建Publickey和PrivateKeymkdir /etc/wireguard cd /etc/wireguard wg genkey | tee privatekey | wg pubkey > publickey chmod 777 -R /etc/wireguard vim /etc/wireguard/wg0.conf服务器端内容如下:[Interface] Address = 10.0.0.1/24 ListenPort = 6677 PrivateKey = <Private Key> PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE SaveConfig = truePrivateKey则是你刚生成的PrivateKey,需要填入进去。PostUP和PostDown是开启和关闭时分别执行的命令,你需要根据需求自行修改。创建服务器端的自动启动systemctl enable wg-quick@wg0启动服务器端wg-quick up wg0至此,服务器端已经配置完毕,我们需要配置客户端二、客户端配置安装过程与服务器一致,但是配置文件是不一样的,具体的需要看你的需求。假设我们需要将两台服务器互联,以便访问其内网中设备。我们的配置将如下:[Interface] Address = 10.0.0.2/24 ListenPort = 6677 PrivateKey = <Private Key> PostUp = bash /etc/route-add PostDown = bash /etc/route-del SaveConfig = true [Peer] PublicKey = <服务器端的Public Key> AllowedIPs = 10.0.0.1/32 Endpoint = 服务器端的公网IP:6677然后,这边需要注意的是AllowedIPs 如果你写了0.0.0.0/0,你可能会被全部reroute,从而导致连不上服务器。因此我这边推荐你设置为两边的IP先测试完毕再调全局。随后一样的,启动wireguard。在服务器端设置以下内容wg set wg0 peer <客户端的Public Key> allowed-ips 10.0.0.1/32然后你会发现两个内网IP可以互通,ping -c 10 10.0.0.1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=28.5 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=28.4 ms 64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=28.5 ms 64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=28.5 ms 64 bytes from 10.0.0.1: icmp_seq=5 ttl=64 time=28.5 ms 64 bytes from 10.0.0.1: icmp_seq=6 ttl=64 time=28.3 ms 64 bytes from 10.0.0.1: icmp_seq=7 ttl=64 time=28.6 ms 64 bytes from 10.0.0.1: icmp_seq=8 ttl=64 time=28.6 ms 64 bytes from 10.0.0.1: icmp_seq=9 ttl=64 time=28.3 ms 64 bytes from 10.0.0.1: icmp_seq=10 ttl=64 time=28.5 ms --- 10.0.0.1 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9012ms rtt min/avg/max/mdev = 28.360/28.522/28.688/0.207 ms那么,我们的wireguard就算是通了,现在要仔细来调整这个路由让他来符合我们的需求。就拿刚刚所说,如果是为了访问互相的内网,你需要把内网IP加入到 AllowedIPs 里面,用逗号区分。例如:[Interface] Address = 10.0.0.2/24 ListenPort = 56677 PrivateKey = <Private Key> PostUp = bash /etc/route-add PostDown = bash /etc/route-del SaveConfig = true [Peer] PublicKey = <服务器端的Public Key> AllowedIPs = 10.0.0.1/32, 192.168.0.0/16 Endpoint = 服务器端的公网IP:6677在你启动wireguard后,你能访问到服务器端的192.168.0.0/16这个段,当然,这种可以认为是对等互联,所以不存在服务器或者客户端这种说法。而另外一种做法,是在路由器上部署的,实现翻墙功能,这种配置应该是这么写的[Interface] Address = 10.0.0.2/24 ListenPort = 56660 PrivateKey = <Private Key> PostUp = bash /etc/route-add PostDown = bash /etc/route-del SaveConfig = true [Peer] PublicKey = <服务器端的Public Key> AllowedIPs = 0.0.0.0/0 Endpoint = 服务器端的公网IP:6677 PersistentKeepalive = 25另外一点,你需要编辑一下 /etc/route-add 来确保你的服务器IP不走wireguard,否则可能会连不上。启动后,默认会将你所有流量都通过wg0这个接口到你的服务器上,实现翻墙另外附送一个配置脚本(并非安装哈):#! /bin/bash config_dir="$HOME/.wireguard/" mkdir -p "$config_dir" cd "$config_dir" || { echo 切换目录失败,程序退出 exit } # 生成两对密钥,分别用作服务器和客户端使用 wg genkey | tee pri1 | wg pubkey >pub1 wg genkey | tee pri2 | wg pubkey >pub2 # 设置密钥访问权限 chmod 600 pri1 chmod 600 pri2 interface=$(ip -o -4 route show to default | awk '{print $5}') ip=$(ip -4 addr show "$interface" | grep -oP '(?<=inet\s)\d+(\.\d+){3}') # 生成服务端配置文件 cat >wg0.conf <<EOL [Interface] PrivateKey = $(cat pri1) Address = 10.10.10.1 ListenPort = 54321 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o $interface -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o $interface -j MASQUERADE [Peer] PublicKey = $(cat pub2) AllowedIPs = 10.10.10.2/32 EOL # 生成客户端配置文件 cat >client.conf <<EOL [Interface] PrivateKey = $(cat pri2) Address = 10.10.10.2 DNS = 8.8.8.8 [Peer] PublicKey = $(cat pub1) Endpoint = $ip:54321 AllowedIPs = 0.0.0.0/0 EOL # 复制配置文件并启动 sudo cp wg0.conf /etc/wireguard/ || { echo 复制失败,请检查/etc/wireguard目录或wg0.conf是否存在 exit } sudo systemctl start wg-quick@wg0 || { echo 启动wireguard失败,请检查/etc/wireguard/wg0.conf是否存在错误 exit } sudo systemctl enable wg-quick@wg0 # 显示客户端配置文件 echo "----------以下是客户端配置文件,请保存并在客户端中使用----------" cat client.conf echo "----------以下是客户端配置二维码----------" echo "qrencode -t ansiutf8 <~/.wireguard/client.conf 再次显示" qrencode -t ansiutf8 <client.conf参考文章:https://wiki.archlinux.org/index.php/WireGuard_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)