EdgeRoutor ER-X WireGuard配置指南

最近入手了一只er-x作为主路由,考虑可以随时漫游回家,er-x支持的vpn协议很多,也尝试配置了L2TP和OpenVPN,但是都不成功,且配置太难懂,经历了无数天的头疼和尝试之后,转向了wireguard。

WireGuard介绍

了解wiredguard的概念,可以更好的理解他的配置。

WG 先定义了一个很重要的概念 —— WireGuard Interface(以下简称 wgi)。为什么要有 wgi?为什么现有的 tunnel 接口不适合?一个 wgi 是这么一个特殊的接口:

通过定义这样一个新的接口,wgi 把它和一般的 tunnel 接口区分开。有了这样一个接口的定义,其它数据结构的挂载,以及数据的收发都很清晰明了了。

我们看 WG 的接口配置:

[Interface]
Address = 10.1.1.1/24
ListenPort = 12345
PrivateKey = blablabla

[Peer]
PublicKey = <server public key>
AllowedIPs = 0.0.0.0/0,::/0
Endpoint = 1.1.1.1:54321

WG 的 VPN 隧道的发起者(initiator)/ 接收者(responder)是对等的,所以也没有一般 VPN 的客户端/服务器端或者 spoke/hub 的区别。因而配置也是对等的。

在这个配置中,我们进一步了解了 peer 这个概念:它是 WG 节点的对端,有静态配置的公钥,peer 背后的网络的白名单(AllowedIPs),以及 peer 的地址和端口(这个并不一定需要,并且随着网络的漫游,可能会自动更改)

Important

我的理解:interface是当前wireguad端,peer是与其配对的另一方端每一端的interface声明了当前端的地址,监听的端口,和私钥peer配置对方的公钥和对方的地址

我自己的理解

首先,在wg中,定义上是没有服务端和客户端的分别,使用上还是有的。每个wg实例,都有interface(接口)配置和peer(对端)配置

以以下我实际使用的配置为例

server配置:

wireguard wg0 {
	address 10.6.69.1/24
	listen-port 51820
	mtu 1420
	peer public_key_1 {
		allowed-ips 10.6.69.2/32
		description mac
	}
	peer public_key_2 {
		allowed-ips 10.6.69.4/32
		description phone
	}
	peer public_key_3 {
		allowed-ips 10.6.69.3/32
		description phone2
	}
	private-key ****************
	route-allowed-ips true
}

client配置:

[Interface]
Address = 10.6.69.2/24
DNS = 192.168.99.1
ListenPort = 51820
PrivateKey = xxxx

[Peer]
AllowedIPs = 192.168.99.0/24
Endpoint = <your doamin>:<your port>
PublicKey = <server public key>

配置WireGuard(EdgeRoutor)

虽然WireGuard概念上不区分服务端客户端,但是总是有个端来提供服务,其他一堆客户端链接他。所以我们还是按照传统的概念描述吧

安装

  1. WireGuard Github下载官方安装包
    curl -OL https://github.com/WireGuard/wireguard-vyatta-ubnt/releases/download/1.0.20210606-2/e50-v2-v1.0.20210606-v1.0.20210914.deb
    
  2. 安装deb文件
    dpkg -i e50-v2-v1.0.20210606-v1.0.20210914.deb
    

通过执行**show interfaces**可以确认是否安装成功

配置

  1. 生成服务端的密钥对

    mkdir server_keys
    cd server_keys
    wg genkey | tee privatekey | wg pubkey > publickey
    
  2. 相似的,生成多个客户端的密钥对

    mkdir my_phone
    cd my_phone
    wg genkey | tee privatekey | wg pubkey > publickey
    
  3. 配置wg0 interface

    # Enter configure mode
    configure
    
    # The location of the server's private key, previously generated
    set interfaces wireguard wg0 private-key [your server private key data]
    
    # Creates the Gateway IP for the VPN and the subnet
    # This subnet can be any private IP range, through check for conflicts 
    set interfaces wireguard wg0 address 10.6.69.1/24
    
    # Creates entries in the route table for the VPN subnet
    set interfaces wireguard wg0 route-allowed-ips true
    
    # Port for WG (that peers will use)
    set interfaces wireguard wg0 listen-port 51820
    
    commit ; save
    
  4. 添加一个客户端peer

    # Remote User Peer
    set interfaces wireguard wg0 peer [your client public key here]
    # set the client allocate ip
    set interfaces wireguard wg0 peer [your client public key here] allowed-ips 10.6.69.2/32
    commit ; save
    

    注意客户端的ip要每个客户端不一样

  5. 开启防火墙

    # Creates an accept rule in the WAN_LOCAL list (WAN_LOCAL - wan to router)
    # Accepts all incoming UDP connections, from port 51820
    
    set firewall name WAN_LOCAL rule 20 action accept
    set firewall name WAN_LOCAL rule 20 protocol udp
    set firewall name WAN_LOCAL rule 20 destination port 51820
    set firewall name WAN_LOCAL rule 20 description 'WireGuard'
    
    commit ; save
    
Important

家宽还要开启端口转发

最后生成的配置类似如下

user@ER-X$ show configuration

}
    }
    wireguard wg0 {
        address 10.6.69.1/24
        description WG_VPN
        listen-port 51820
        peer <peer public key> {
            allowed-ips 10.6.69.2/32
            description my_phone
        }
        private-key ****************
        route-allowed-ips true
    }
}

        }
        rule 20 {
            action accept
            description WG_IN
            destination {
                port 51820
            }
            log enable
            protocol udp
            source {
            }
        }

客户端配置

新建wg.conf文件,写入如下内容

[Interface]
PrivateKey = <my_phone private key>
ListenPort = 51820
Address = 10.6.69.2/32                                                   
DNS=192.168.99.1

[Peer]
PublicKey = <pubkey of server>
AllowedIPs = 0.0.0.0/0                      
Endpoint = server.com:51820

Interface设置

Peer设置

下载wire官方客户端,导入上述配置文件,大功告成。

Suggest

我的建议是,不提供ListenPort,DNS参数,避免端口占用,和访问其他网络的问题;AllowedIPs可以配置家里的局域网网段+wg的网段即可

新增第二个客户端

同上面的过程创建客户端的密钥

然后设置peer信息

# Remote User Peer
set interfaces wireguard wg0 peer [your client public key here]
# set the client allocate ip
set interfaces wireguard wg0 peer [your client public key here] allowed-ips 10.6.69.3/32
commit ; save
Warn

注意:新的客户端allowed-ips必须是未分配的。多个客户端不能使用相同的配置,会造成冲突在线

新客户端的配置如下

[Interface]
PrivateKey = <my_phone private key>
ListenPort = 51820
Address = 10.6.69.3/32                        
DNS = 192.168.99.1                            

[Peer]
PublicKey = <pubkey of server>
AllowedIPs = 0.0.0.0/0                      
Endpoint = server.com:51820                  

使用用遇到的问题

不能访问公司内网

mac客户端配置后不能访问公司内网,主要是由于DNS错误导致的,建议删除客户端配置中的DNS,会默认使用公司Wi-Fi默认的DNS

IOS配置后不能访问外网

ios和mac有点相反,不配置dns只能访问局域网,加上DNS配置后一切正常

er-x调试

  1. 输入sudo wg可查看接口连接信息
  2. allowed-ips配置错误需要重启路由器才能恢复

两个客户端直接不能访问

  1. 排查allowed-ips是否包括的wg的局域网网段

没有公网ip情况下的中继示例

参考搭建 wireguard 中继服务器连通两个没有公网 IP 的局域网

核心的要点是:

这样,在A中,输入B的局域网地址,首先被发送到server,server解析出目标地址是B的局域网,根据AllowedIPs配置,会发送到peerB
B收到请求,会根据来源发送给server,server再发给A。

参考链接

  1. Wireguard VPN on a Ubiquiti EdgeRouter | Usman
  2. [Releases · WireGuard/wireguard-vyatta-ubnt](https://github.
    com/WireGuard/wireguard-vyatta-ubnt/releases)
  3. Wireguard:简约之美 - 知乎