wiregurad目前已经正式合入linux kernal, 日后的应用范围也一定会越来越广, 本文将会介绍如何使用wireguard创建自己的虚拟局域网, 并完成网关设置
Wireguard 安装
对于Ubuntu ≥ 19.10以上的用户, 直接安装即可
1 | sudo apt install wireguard |
对于19.04及以下用户
1 | sudo add-apt-repository ppa:wireguard/wireguard |
Wireguard 组网设置
早期的教程中经常使用名为 wg-quick
的命令, 我个人非常不建议使用该工具, 而且官网也移除了关于此命令的相关描述, 因此接下来的操作都讲直接使用 wg
和 ip
命令完成。
wireguard必须在要组网的所有设备上都进行以下操作
添加网卡
首先我们需要添加一块网卡, 并将其命名为 wg0
1 | sudo ip link add dev wg0 type wireguard |
设置ip
添加网卡后为这张网卡配置ip, wireguard无法使用dhcp等功能,我们必须手动为其配置ip, 并且每个设备的ip都不能重复。
注意此处的子网掩码。这里指定的掩码将会在之后被用于设置ip route, 通常wg会自动设置, 但我们也可以手动设置, 这在之后会进行讲解。
因为我需要让所有设备都连接到一台公网设备, 所以我给我的公网设备分配了192.168.100.1
的ip。其他设备依次使用192.168.100.(2/3/4)
。
1 | sudo ip address add dev wg0 192.168.100.1/24 |
生成连接密钥
密钥是wg连中最为重要的一环。在两个节点之间, 数据的的接受和发送都需要单独的密钥对。
以A, B两设备为例。A需要持有A的私钥和B的公钥。B需要持有B的私钥和A的公钥。 B向A发送数据需要使用A的公钥。A接受B的数据需要使用A的私钥。
因此两个节点互联共需要2对共4个密钥。注意三个节点互联需要3对共6个密钥而不是4对共8个。因为节点的公钥可以给多个其他节点使用,不需要生成新的密钥对。
生成一对密钥
生成私钥
1 | wg genkey |
生成公钥
生成公钥需要使用之前的私钥
1 | echo 6EQR4ABmq4otoOhSYVCJP4BBWKgLzIlTJ4QSPQZAR3s= | wg pubkey |
编写配置文件
以下以一个公网设备A和一个私网(家宽)设备B为例
有公网ip的设备 A
对于有公网ip的设备, 我们不需要指定 peer 的地址(因为存在NAT指定了也没用), 我们只需要配置私钥和连接端口即可。
1 | # file: A.conf |
无公网ip设备 B
对于有无公网ip的设备, 需要使用Endpoint
指定 peer A 的地址, 这样才能在 A, B 之间建立起链接。
1 | # file: B.conf |
AllowedIPs
需要注意两份配置的 AllowedIPs 不同, 对于A来说, peer B 的地址必须为192.168.100.2/32
, 而对于B来说, 局域网中的所有 peer 都需要通过A来访问, 所以 AllowedIPs 被设置为 192.168.100.0/24
。
AllowedIPs类似于一个白名单机制, 只有目的地址在AllowedIPs中的包才允许发往该 peer。
应用配置文件
1 | sudo wg setconf wg0 xxxx.conf |
启用网卡
1 | sudo ip link set up dev wg0 |
添加路由
创建网卡之后, 我们还需要设置路由, 告诉系统使用wg0网卡处理发往192.168.100.0/24地址的数据。
1 | sudo ip route add 192.168.100.0/24 dev wg0 |
或者使用完整写法
1 | sudo ip route add 192.168.100.0/24 dev wg0 proto kernel scope link src 192.168.100.x |
如果设置的时候提示 RTNETLINK answers: File exists
则表示wg已经自动设置过路由。可以使用以下命令查看
1 | sudo ip route |
查看连接状态
1 | sudo wg |
网关设置
请查看iptables forward 及 nat 相关讲解