墨少离 - 个人小站，分享一些资源以及心得~ - Wireguard
type: channel
link: https://www.msl.la/tag/Wireguard/
items: Wireguard 全互联模式（full mesh）配置指南
items: WireGuard 配置教程：使用 wg-gen-web 来管理 WireGuard 的配置
items: WireGuard 快速安装教程
items: WireGuard 教程：WireGuard 的搭建使用与配置详解
items: WireGuard 教程：WireGuard 的工作原理
items: CentOS8 安装最新版的Wireguard

Wireguard 全互联模式（full mesh）配置指南
type: item
date: 2021-04-12T14:51:00+08:00
description: 上篇文章给大家介绍了如何使用 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 Listen…

WireGuard 配置教程：使用 wg-gen-web 来管理 WireGuard 的配置
type: item
date: 2021-04-12T14:34:00+08:00
description: 之前花了很大的篇幅介绍了 WireGuard 的工作原理和配置详解，可这里面的内容实在太多了，大部分人根本没兴趣深究，只是将其当成参考书来看。WireGuard 虽然组网逻辑很简洁明了，但秘钥和配置文件的管理是个麻烦事，需要手工配置。为了让大部分读者能够快速上手 WireGuard，体验 WireGuard 的优雅和强大，我决定新开一个 WireGuard 快速上手系列，第一篇之前已经发出来了：WireGuard 快速安装教程这篇文章仅仅介绍了如何快速安装 WireGuard，并没有涉及到如何配置使其正常工作。本文主要介绍如何方便优雅地管理 WireGuard 的配置和秘钥。当然了，这里不会详细解读各个配置参数的含义，也不会告诉你通过哪个命令来创建公钥私钥，如果你对此部分感兴趣，可以查看我之前发布的 WireGuard 配置详解。1. wg-gen-web 配置对于新手来说，如何才能快速把 WireGuard 用起来呢？当然是通过图形管理界面啦，填几个参数，生成个二维码，再拿客户端扫下二维码就连上了，简直是比爽姐还爽~wg-gen-web 就是这样一款图形管理界面，主要包含以下这些功能：根据 CIDR 自动分配 IP 地址给客户端；每个客户端会生成 QR 二维码，方便移动客户端扫描使用；支持通过邮件发送二维码和配置文件；支持启用和禁用某个客户端；支持 IPv6；支持使用 GitHub 和 Oauth2 OIDC 来进行用户认证；颜值还比较高。wg-gen-web 支持直接通过容器来运行，如果你是在本地运行，可以准备一份 docker-compose 文件：version: '3.6' services: wg-gen-web: image: vx3r/wg-gen-web:latest container_name: wg-gen-web restart: always expose: - "8080/tcp" ports: - 80:8080 environment: - WG_CONF_DIR=/data - WG_INTERFACE_NAME=wg0.conf - OAUTH2_PROVIDER_NAME=fake - WG_STATS_API=http://<API_LISTEN_IP>:8182 volumes: - /etc/wireguard:/data network_mode: bridge wg-json-api: image: james/wg-api:latest container_name: wg-json-api restart: always cap_add: - NET_ADMIN network_mode: "host" command: wg-api --device wg0 --listen <API_LISTEN_IP>:8182这里还用到了另外一个项目 wg-api，该项目提供了一个 JSON-RPC 接口，用来暴露 WireGuard 的网络状态信息。其中 <API_LISTEN_IP> 可以直接替换成 docker0 的 IP。执行以下命令运行 wg-gen-web：docker-compose up -d在浏览器中输入 URL 打开图形管理界面，点击 “SERVER” 开始填写服务端和客户端的配置信息：各项配置的含义我就不解释了，都很好理解，实在不理解的请查看 WireGuard 配置详解。填写好配置信息后，直接点击 UPDATE SERVER CONFIGURATION 保存，同时会生成配置文件 wg0.conf： cat /etc/wireguard/wg0.conf # Updated: 2021-01-20 03:59:37.718655459 +0000 UTC / Created: 2021-01-20 03:32:28.045982181 +0000 UTC [Interface] Address = 10.6.6.1/24 ListenPort = 51820 PrivateKey = iLPeSYaKYERfyrOX/YcAam4AIIHCNEBXnqL2oRedAWQ= 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;…

WireGuard 快速安装教程
type: item
date: 2021-04-12T14:09:31+08:00
description: 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 教程：WireGuard 的搭建使用与配置详解
type: item
date: 2021-04-12T14:03:00+08:00
description: 上篇文章介绍了 WireGuard 相对于其他 VPN 协议的优点和 WireGuard 的工作原理，本文将会学习如何从零开始配置 WireGuard，这里会涉及到很多高级的配置方法，例如动态 IP、NAT 到 NAT、IPv6 等等。1. 快速开始配置 WireGuard 的大致流程如下：安装Centos7$ yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm $ yum install yum-plugin-elrepo $ yum install kmod-wireguard wireguard-tools # 如果你使用的是非标准内核，需要安装 DKMS 包 $ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm $ curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo $ yum install wireguard-dkms wireguard-toolsUbuntu# Ubuntu ≥ 18.04 $ apt install wireguard # Ubuntu ≤ 16.04 $ add-apt-repository ppa:wireguard/wireguard $ apt-get update $ apt-get install wireguardMacOS:$ brew install wireguard-toolsWindows:https://www.moyann.com/archives/298/ https://download.wireguard.com/windows-client/wireguard-amd64-0.1.1.msi在中继服务器上开启 IP 地址转发：$ echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf $ echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf $ sysctl -p /etc/sysctl.conf添加 iptables 规则，允许本机的 NAT 转换：$ iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT $ iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT $ iptables -A FORWARD -i wg0 -o wg0 -m conntrack --ctstate NEW -j ACCEPT $ iptables -t nat -A POSTROUTING -s 192.0.2.0/24 -o eth0 -j MASQUERADE需要把 eth0 改成你实际使用的网卡接口名称。编写配置文件配置文件可以放在任何路径下，但必须通过绝对路径引用。默认路径是 /etc/wireguard/wg0.conf。配置文件内容解析放到下一章节再讲。生成密钥#生成私钥 $ wg genkey > example.key # 生成公钥 $ wg pubkey < example.key > example.key.pub启动与停止$ wg-quick up /full/path/to/wg0.conf $ wg-quick down /full/path/to/wg0.conf # 启动/停止 VPN 网络接口 $ ip link set wg0 up $ ip link set wg0 down # 注册/注销 VPN 网络接口 $ ip link add dev wg0 type wireguard $ ip link delete dev wg0 # 注册/注销 本地 VPN 地址 $ ip address add dev wg0 192.0.2.3/32 $ ip address delete dev wg0 192.0.2.3/32 # 添加/删除 VPN 路由 $ ip route add 192.0.2.3/32 dev wg0 $ ip route delete 192.0.2.3/32…

WireGuard 教程：WireGuard 的工作原理
type: item
date: 2021-04-12T13:19:00+08:00
description: WireGuard 是由 Jason Donenfeld 等人用 C 语言编写的一个开源 VPN 协议，被视为下一代 VPN 协议，旨在解决许多困扰 IPSec/IKEv2、OpenVPN 或 L2TP 等其他 VPN 协议的问题。它与 Tinc 和 MeshBird 等现代 VPN 产品有一些相似之处，即加密技术先进、配置简单。从 2020 年 1 月开始，它已经并入了 Linux 内核的 5.6 版本，这意味着大多数 Linux 发行版的用户将拥有一个开箱即用的 WireGuard。无论你是想破墙而出，还是想在服务器之间组网，WireGuard 都不会让你失望，它就是组网的『乐高积木』，就像 ZFS 是构建文件系统的『乐高积木』一样。WireGuard 与其他 VPN 协议的性能测试对比：可以看到 WireGuard 直接碾压其他 VPN 协议。再来说说 OpenVPN，大约有 10 万行代码，而 WireGuard 只有大概 4000 行代码，代码库相当精简，简直就是件艺术品啊。你再看看 OpenVPN 的性能，算了不说了。WireGuard 优点：配置精简，可直接使用默认值只需最少的密钥管理工作，每个主机只需要 1 个公钥和 1 个私钥。就像普通的以太网接口一样，以 Linux 内核模块的形式运行，资源占用小。能够将部分流量或所有流量通过 VPN 传送到局域网内的任意主机。能够在网络故障恢复之后自动重连，戳到了其他 VPN 的痛处。比目前主流的 VPN 协议，连接速度要更快，延迟更低（见上图）。使用了更先进的加密技术，具有前向加密和抗降级攻击的能力。支持任何类型的二层网络通信，例如 ARP、DHCP 和 ICMP，而不仅仅是 TCP/HTTP。可以运行在主机中为容器之间提供通信，也可以运行在容器中为主机之间提供通信。WireGuard 不能做的事：类似 gossip 协议实现网络自愈。通过信令服务器突破双重 NAT。通过中央服务器自动分配和撤销密钥。发送原始的二层以太网帧。当然，你可以使用 WireGuard 作为底层协议来实现自己想要的功能，从而弥补上述这些缺憾。本系列 WireGuard 教程分为两个部分，第一部分偏理论，第二部分偏实践。本文是第一部分，下面开始正文教程。1. WireGuard 术语Peer/Node/Device连接到 VPN 并为自己注册一个 VPN 子网地址（如 192.0.2.3）的主机。还可以通过使用逗号分隔的 CIDR 指定子网范围，为其自身地址以外的 IP 地址选择路由。中继服务器（Bounce Server）一个公网可达的对等节点，可以将流量中继到 NAT 后面的其他对等节点。Bounce Server 并不是特殊的节点，它和其他对等节点一样，唯一的区别是它有公网 IP，并且开启了内核级别的 IP 转发，可以将 VPN 的流量转发到其他客户端。子网（Subnet）一组私有 IP，例如 192.0.2.1-255 或 192.168.1.1/24，一般在 NAT 后面，例如办公室局域网或家庭网络。CIDR 表示法这是一种使用掩码表示子网大小的方式，这个不用解释了。NAT子网的私有 IP 地址由路由器提供，通过公网无法直接访问私有子网设备，需要通过 NAT 做网络地址转换。路由器会跟踪发出的连接，并将响应转发到正确的内部 IP。公开端点（Public Endpoint）节点的公网 IP 地址:端口，例如 123.124.125.126:1234，或者直接使用域名 some.domain.tld:1234。如果对等节点不在同一子网中，那么节点的公开端点必须使用公网 IP 地址。私钥（Private key）单个节点的 WireGuard 私钥，生成方法是：wg genkey > example.key。公钥（Public key）单个节点的 WireGuard 公钥，生成方式为：wg pubkey < example.key > example.key.pub。DNS域名服务器，用于将域名解析为 VPN 客户端的 IP，不让 DNS请求泄漏到 VPN 之外。2. WireGuard 工作原理中继服务器工作原理中继服务器（Bounce Server）和普通的对等节点一样，它能够在 NAT 后面的 VPN 客户端之间充当中继服务器，可以将收到的任何 VPN 子网流量转发到正确的对等节点。事实上 WireGuard 并不关心流量是如何转发的，这个由系统内核和 iptables 规则处理。如果所有的对等节点都是公网可达的，则不需要考虑中继服务器，只有当有对等节点位于 NAT 后面时才需要考虑。在 WireGuard 里，客户端和服务端基本是平等的，差别只是谁主动连接谁而已。双方都会监听一个 UD…

CentOS8 安装最新版的Wireguard
type: item
date: 2021-01-08T17:30:00+08:00
description: 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，从而导致连不上服务器。因此我这边推…