Wireguard是一个非常轻量化的VPN,相比臃肿的OpenVPN配置要简单很多。非常适合组建自己家的VPN,这样比较敏感的服务就可以先连接到家里的VPN,然后再访问内网了。

下图是我家的网络拓扑(详见:树莓派4B+安装OpenWrt用作旁路由 | Kunyang’s Blog)是把OpenWrt作为旁路由使用,其他设备的默认网关和DNS指向OpenWrt。

Network Topologic

OpenWrt

安装

所需插件:

  • kmod-wireguard
  • luci-proto-wireguard
  • wireguard-tools

配置

  • Network → Interface → Add new interface,创建一个wireguard,名字就叫wg0

    创建Interface

  • 点击Generate new key pair,会自动生成一个公钥一个私钥,IP地址可以随便写一个私有地址的网段,我填写192.168.100.1/24,这就是这个VPN的子网,然后设置默认端口,可以随便写,这里我设置55555

    配置Wireguard

  • 然后来到Network → Firewall → General Setting,可以选择为wireguard单独创建一个zone,Input, Output和Forward全部开启,Masq关闭

    Firewall

    配置完之后在Interface → wg0 → Firewall Settings就能看到wg0被单独分配到了自己的zone

  • 如果OpenWrt是主路由,则需要在Firewall → Traffic Rules中开放端口

    开放Wireguard端口

  • 像我家的情况OpenWrt是旁路由,则需要在主路由上做端口转发

    端口转发

  • 在Network → Interface → wg0点击Edit,然后转到Peers,点击Add peer

    • 添加Description,比如我的Windows台式机
    • 我们可以点击创建新的密钥对
    • 建议创建Preshared Key
    • Allow IPs就是这个节点在这个VPN网络的IP地址,我输入192.168.100.2/32,注意掩码一定是32,一个设备应该只含有一个IP地址
    • 如果该设备在家里,比如我的台式机,Endpoint填OpenWrt的地址,如果设备在外网,比如我的MacBook,则填家里的公网IP
    • Keep Alive可以设置为25

    Peer设置

  • Reload一下wg0接口

Windows或Mac Os

安装

这里下载Wireguard App

配置

  • 在OpenWrt → Network → Interface → wg0 → Edit Peer中可以很方便地为每个终端导出配置文件,复制粘贴在Windows客户端的wireguard中就可以了

  • 这是Windows的配置例子

    [Interface]
    PrivateKey = [Windows_PRIVATE_KEY]
    ListenPort = Port
    Address = 192.168.100.2/32			# 这个IP是Windows在wireguard子网的IP
    DNS = [OpenWrt IP]					# 可以设置为Wireguard Server(即OpenWrt)的真实IP地址
    
    [Peer]
    PublicKey = [OpenWrt_PUBLIC_KEY]
    PresharedKey = [Windows_PSK]
    AllowedIPs = 192.168.100.0/24		# 我的Windows和主路由在同一个子网,因此可以设置只有192.168.100.0/24的流量经过VPN
    Endpoint = [OpenWrt IP]:Port
    PersistentKeepalive = 25
    

MacBook

我的MacBook一般是带出家门使用的,因此不常常在我家的内网,除了AllowedIPs设置为所有流量经过VPN以外其他与上面相同

[Interface]
PrivateKey = [MacBook_PRIVATE_KEY]
Address = 192.168.100.3/32
ListenPort = PORT
DNS = [OpenWrt IP]

[Peer]
PublicKey = [OpenWrt_PUBLIC_KEY]
PresharedKey = [MacBook_PSK]
AllowedIPs = 0.0.0.0/0, ::/0		# All traffic
Endpoint = [Home Public IP]:Port	# Public IP
PersistentKeepAlive = 25

Linux

安装

sudo apt update
sudo apt upgrade
sudo apt install wireguard

配置

  • 进入/etc/wireguard,并生成密钥对,也可以使用OpenWrt的Web manager来生成密钥对(使用OpenWrt集中的管理密钥对更方便,但是不安全)

    sudo -i
    cd /etc/wireguard
    umask 077
    wg genkey | tee privatekey | wg pubkey > publickey
    
  • 编辑配置文件wg0.conf

    [Interface]
    PrivateKey = [LINUX_PRIVATE_KEY]
    Address = 192.168.100.4/32
    ListenPort = Port
    DNS = [OpenWrt IP]
    
    [Peer]
    PublicKey = [OpenWrt_PUBLIC_KEY]
    PresharedKey = [LINUX_PSK]
    AllowedIPs = 192.168.100.0/24	# 我的Linux作为服务器也一直在家里
    Endpoint = [OpenWrt IP]:Port
    PersistentKeepAlive = 25
    
  • 启动Wireguard

    sudo wg-quick up wg0
    
  • 如果需要reloead

    sudo wg-quick down wg0
    sudo wg-quick up wg0
    

问题分析

  • 如果报错

    root@debian:/etc/wireguard# sudo wg-quick up wg0
    [#] ip link add wg0 type wireguard
    [#] wg setconf wg0 /dev/fd/63
    [#] ip -4 address add 192.168.100.4/32 dev wg0
    [#] ip link set mtu 1420 up dev wg0
    [#] resolvconf -a wg0 -m 0 -x
    /usr/bin/wg-quick: line 32: resolvconf: command not found
    [#] ip link delete dev wg0
    

    没有安装resolvconf,需要下载

    sudo apt install resolvconf