背景

我需要一个简单-安全-高效的三层VPN,于是关注到了wireguard。
wireguard易用性几乎满足了我对vpn的所有需求

关于配置

1、wireguard使用两对秘钥进行加密,自己持有私钥,对等体需要持有对端的公钥。
2、配置文件仅有两个点,Interface 和Peer
Interface代表了本地wg三层接口信息、Peer代表了本端需要知道的对端的信息
Interface有以下字段:

  • PrivateKey - 使用wg genkey生成的base64加密的私钥,这个参数是必须的。
  • LinsenPort - 本地监听端口,用于对端向本端建立隧道。可选参数,如果不指定,将会随机选择。(两端至少有1端配置监
    听端口,否则没法建立隧道ps、必然的 毕竟工作在udp层)
  • FwMark - 一个32位的fwmark用于标记出口的数据包。可选参数(给数据包打个标 用于路由或者其他策略使用)

Peer有以下字段(这里都是对端的信息):

  • PublicKey - wg pubkey根据私钥生成的公钥(对端的公钥)必须的
  • PresharedKey - wg genpsk生成的共享秘钥,给数据包再套一层对称加密说是能抗量子解密.可选
  • AllowedIPs - 逗号分隔的网段,允许哪些网段从对端传入。这个不写就啥都不允许,通=不通
  • Endpoint - 对端节点的IP或者主机名和用冒号隔开的端口信息,不写会自动更新。可选(不过两端至少写一个 同interfaceport是对于的关系)
  • PersistentKeepalive - 以秒为单位的时间间隔,用于发送心跳报文。(wireguard不是“闲聊”的协议,首包交互即可完成通道建立,udp也让其不可探测,但如果有一段位于nat后面的话,nat表老化后,另一端则无法再主动与nat后的peer通信,故需要心跳,保持nat表的状态,大多数设备udp回话老化时间默认是30s,一般推荐25s避免老化)

好了就这些 ,示例如下
‘’’
Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820

[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
Endpoint = 192.95.5.67:1234
AllowedIPs = 10.192.122.3/32, 10.192.124.1/24

[Peer]
PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
Endpoint = [2607:5300:60:6b0::c05f:543]:2468
AllowedIPs = 10.192.122.4/32, 192.168.0.0/16

[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
Endpoint = test.wireguard.com:18981
AllowedIPs = 10.10.10.230/32
‘’’

配置文件写好后,开始着手配置
建立vpn接口
ip link add dev wg0 type wireguard
配置接口地址
ip address add dev wg0 192.168.2.1/24
配置接口wg信息
wg setconf wg0 myconfig.conf
开启接口
ip link set up dev wg0

两端配置好后,基本结束了
wg show看下状态 三层通道连接后
可以考虑路由 手动写写就ok了,相当于接了根网线

使用wg配置 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
使用wg-quick配置 (不推荐)
为啥不推荐呢,wg-quick用了策略路由和多表路由,还会根据你的peer allowIPs去给你自动写路由,但是allowIPs是指运行哪些ip通过,不是让这些ip必须通过,远没有自己手打路由 手写nat方便直观