@TOC
wireguard官网地址:https://www.wireguard.com
wireguard简介
由 Jason Donenfeld 等人用 C 语言编写的一个开源 威屁恩 协议,被视为下一代 威屁恩 协议,旨在解决许多困扰
IPSec/IKEv2、Open威屁恩 或 L2TP 等其他 威屁恩 协议的问题。它与 Tinc 和 MeshBird 等现代 威屁恩 产品有一些相似之处,即加密技术先进、配置简单。从 2020 年 1 月开始,它已经并入了 Linux 内核的 5.6 版本,这意味着大多数 Linux 发行版的用户将拥有一个 开箱即用的 WireGuard。
WireGuard是一种实现加密虚拟专用网络(VPN) 的通信协议和免费开源软件,其设计目标是易于使用、高速性能和低攻击面;
它旨在比IPsec和OpenVPN这两种常见的隧道协议具有更好的性能和更强大的功能;
它可以通过不同网段,不同地区的实现异地组网,通过UDP传递流量,高效稳定,FAST(速度快)、MODERN(流行)、SECURE
(安全)的VPN TUNNEL(VPN隧道)。
WireGuard 与其他 VPN协议的
性能测试对比:
官方安装教程:
WireGuard 优点:
- 配置精简,可直接使用默认值
- 只需最少的密钥管理工作,每个主机只需要 1 个公钥和 1 个私钥。
- 就像普通的 以太网接口
- 能够将部分流量或所有流量通过 威屁恩 传送到局域网内的任意主机。
- 能够在网络故障恢复之后自动重连,戳到了其他 威屁恩 的痛处。
- 比目前主流的 vpn 协议,连接速度要更快,延迟更低(见上图)。
- 使用了更先进的加密技术,具有前向加密
- 支持任何类型的 二层网络通信,例如 ARP、DHCP 和 ICMP,而不仅仅是 TCP/HTTP
可以运行在主机中为容器之间提供通信,也可以运行在容器中为主机之间提供通信。
缺点:
- 不具有类似 gossip 协议实现网络自愈。
- 不能通过信令服务器突破双重 NAT。
- 不能通过中央服务器自动分配和撤销密钥。
- 不能发送原始的 二层以太网帧。
本文配置
服务端 unbuntu20
客户端 win11
安装
# unbuntu
$ apt-get update
$ apt-get install wireguard
# centos
$ yum install wireguard
wireguard客户端 https://www.wireguard.com/install/
注意:在 WireGuard 的世界里没有 Server 和 Client 之分,所有的节点都是 Peer,以上采用的是把wg0当作中转节点,也就是vpn网关来和其他节点连接
Wireguard 全互联模式(full mesh)配置指南
Wireguard 全互联模式(full mesh)配置指南
Wireguard 中转模式
服务端配置
- 开启ipv4流量转发:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
- 创建并进入WireGuard文件夹:
mkdir -p /etc/wireguard && chmod 0777 /etc/wireguard
cd /etc/wireguard
umask 077
3.生成服务器和客户端密钥对:
wg genkey | tee server_privatekey | wg pubkey > server_publickey
wg genkey | tee client_privatekey | wg pubkey > client_publickey
4.配置文件生成
echo "
[Interface]
PrivateKey = $(cat server_privatekey) # 填写本机的privatekey 内容
Address = 10.0.8.1/24 # 填写模拟的网卡地址
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
ListenPort = 50814 # 注意该端口是UDP端口
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = $(cat client_publickey) # 填写对端的publickey 内容
AllowedIPs = 10.0.8.10/24 " > wg0.conf
注:
- 模拟网卡地址不能填内外网地址,否则在连接过程中会产生内循环,导致服务器卡死
- 以上内容一次性粘贴执行,不要分行执行
4.启动
wg-quick up wg0 // 启动服务端
wg-quick down wg0 // 停止服务端
设置开机启动
systemctl enable wg-quick@wg0
客户端配置
打开客户端软件,新建隧道->将下列文件保存到本地,直接打开
[Interface]
PrivateKey = $(cat client_privatekey) # 填写本机的privatekey 内容
Address = 10.0.8.10/24 # 填写模拟的网卡地址
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = $(cat server_publickey) # 填写对端的publickey 内容
Endpoint = server:50814 #公网的IP和端口,可异地
AllowedIPs = 0.0.0.0/0, ::0/0 # 通过流量的ip
PersistentKeepalive = 25
打开如下
软件会自动根据私钥解析出接口公钥
中转节点状态
下面是我的2个节点,连接到中转节点上
注:
- 模拟网卡地址不能填内外网地址
- 连接方的公钥和被连接方的公钥要一一对应
- 以上内容一次性粘贴执行,不要分行执行
测试
连接前
连接后
注意:如果连接后存在异常,请看最下面常见问题解读
常用配置
[Interface] 配置
[Interface]即本地的接口配置,一般是手工创建的虚拟接口,推荐的接口名称为“wg0”或“wgvpn0”
PrivateKey:必配项,一般是通过wg-genkey生成的base64私钥。
ListenPort:可选项,用于指定建立Wireguard隧道时本地所侦听的端口,配置范围为0-65535,建议配置10000以上的端口。默认是没有指定的,此时程序会随机选择一个端口,所以程序启动时大家会看到有一个默认端口,建立连接时需要匹配到对应的端口,不算方便,建议指定。
Address:可选项,用于指定分配给Wireguard 接口的IP地址 DNS:可选项,用于指定分配给Wireguard
接口的DNS服务器的IP地址,可以通过逗号“,”进行分隔来配置多个DNS服务器。
MTU:可选项,用于指定接口的最大传输单元MTU。默认情况下,MTU会根据端点地址或系统默认路由自动确定。如果有特殊需求,可以手工指定MTU的值,一般用于减少报文在传输过程中被分片。
Table:可选项,当系统中有多个路由表时,用于控制要添加路由的路由表。默认未配置,即默认配置为“auto”,表示将路由添加到默认表中,并启用[Peer]默认路由的特殊处理;如果配置为“off”,表示完全禁用添加路由的功能。
PreUp、PostUp、PreDown、PostDown:可选项,用于配置在使能/去使能接口之前/之后需要执行的脚本。常用于配置自定义DNS选项或防火墙规则,如果指定了多条命令,这些命令将按照配置顺序依次执行。
PostUp = ip rule add ipproto tcp dport 22 PreDown = ip rule delete
ipproto tcp dport 22
SaveConfig:可选项,用于设置在关闭Wireguard接口时,是否将当前状态保存到配置文件中。默认未配置,如果需要启用此功能,需要设置为“true”。
SaveConfig = true
[Peer]配置
[Peer]部分就是指定Wireguard邻居的相关信息,可能包含以下内容: PublicKey:必配项,一般是通过wg
pubkey从私钥计算的base64公钥,用于验证邻居身份信息。
PresharedKey:可选项,一般是通过wg-genpsk生成的base64预共享密钥。此选项添加了一个额外的对称密钥加密层,以混合到现有的公钥加密中,以实现后量子抗性。
AllowedIPs:必配项,用于配置允许邻居的传入流量,以及本地要发送给对端的发送流量。格式为以逗号分隔的包含CIDR掩码的IP地址列表,也可以配置为默认路由,匹配所有IPv4地址指定为0.0.0.0/0,匹配所有IPv6地址指定为::/0。
Endpoint:可选项,用于指定对端邻居的IP地址或主机名,后跟冒号“:”,然后是端口号。
PersistentKeepalive:可选项,用于配置和对端邻居的保活报文的发送间隔,配置范围为1-65535。当端点位于有状态防火墙或NAT设备后方时,为了保持会话的持续连接,可以通过配置保活报文向对端发送经过身份验证的空数据包来实现。默认处于关闭状态,即值为“0”或“off”,如果要使用,请配置为1-65535之间的值。
常见问题
连接后本地网络异常, window中无法DNS解析
解决办法:
- 手动修改hosts文件
在Windows下实现WireGuard动态DNS解析(DDNS)的正确方法:避免无意义的开销 | Kenvix's Blog
注意再次声明
- 模拟网卡地址不能填内外网地址
- 连接方的公钥和被连接方的公钥要一一对应
- 以上内容一次性粘贴执行,不要分行执行
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。