wireguard 原理与基本使用

WireGuard 的核心是一个名为 Cryptokey Routing 的概念,它的工作原理是将公钥与隧道中允许的隧道 IP 地址列表相关联。每个网络接口(interface)都有一个私钥和一个 peer list。每个 peer 都有一个公钥。公钥既短又简单,被 peer 用来互相验证。它们可以通过任何带外方法在配置文件中传递,类似于将其 SSH 公钥发送给朋友以访问 shell 服务器。

由于每个节点都有自己的公钥和私钥,实际上就建立了公钥和节点之间的一一映射。当 wg0 需要向外发送的包的时候,会查这个表来找到正确的公钥。当接收到一个外部的包的时候,会根据公钥来检查是否是合法的目标 IP。

当一个 Peer 发过来一个包,并且通过了验证之后,路由表就会记录下对方的外部地址,这样当需要给对方发包的时候,就可以直接通过这个地址发送了。同时,如果对方切换了网络,那么路由表就会跟着新的包更新,也就是 WireGuard 支持“漫游”。

WireGuard 优点

•简单易用
•加密健全
•最小攻击面
•高性能:比目前主流的 VPN 协议,连接速度要更快,延迟更低
•简单的网络接口(interface):就像普通的以太网接口一样,以 Linux 内核模块的形式运行,资源占用小。
•加密密钥路由:使用了更先进的加密技术,具有前向加密和抗降级攻击的能力。
•内置漫游
•容器就绪:可以运行在主机中为容器之间提供通信,也可以运行在容器中为主机之间提供通信。
•能够将部分流量或所有流量通过 VPN 传送到局域网内的任意主机。
•能够在网络故障恢复之后自动重连,这是相比其他 VPN 优势的一点
•支持任何类型的二层网络通信,例如 ARP、DHCP 和 ICMP,而不仅仅是 TCP/HTTP。比如 VPN Peer 之间可以互 ping

配置方法

公共步骤

1、生成公钥和私钥:

 wg genkey | tee privatekey | wg pubkey > publickey

2、创建 /etc/wireguard/wg0.conf;

客户端配置

1、执行公共步骤;
2、配置 wg.conf

[Interface]
# Name = ${clientName}
Address = 10.0.0.2/32
PrivateKey = ${clientPrivateKey}
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]
Endpoint = ${publicIp}:${publicPort:51820}
PublicKey = ${delayPublicKey}
AllowedIPs = ${vpnCIDR}
PersistentKeepalive = 25

3、执行 wg-quick up wg0 启动 wireguard。

服务端配置

1、执行公共步骤;
2、配置 wg.conf

[Interface]
# Name = ${serverName}
Address = 10.0.0.1/24
PrivateKey = ${delayPrivateKey}
ListenPort = ${publicPort:51820}
PostUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE
DNS = 223.5.5.5

[Peer]
# Name = pve
PublicKey = ${clientIp}
AllowedIPs = ${clientIp}/32
PersistentKeepalive = 25

3、执行 wg-quick up wg0 启动 wireguard。

技巧

不重启重新加载配置:

 wg syncconf wg0 <(wg-quick strip wg0)

设置开机自启动

systemctl enable wg-quick@wg0

几种典型的拓扑

• Point-to-point
• Hub-and-spoke
• Nat-to-Nat
• Full Mesh

参考

[1] WireGuard基本原理