背景
由于家里没有公网IP,想随时访问回家里的网络还是比较麻烦的,由于目前家里的服务器操作系统是 Ubuntu 20.04 LTS,里面搭建了一些常用的的开发环境,刚好手上也有云服务器,云服务器也是Ubuntu 20.04 LTS,刚好用来中转流量回到家庭局域网。找了下资料,决定用WireGuard来实现。
WireGuard 介绍
WireGuard ®是一种极其简单但快速的现代 VPN,它使用最先进的加密技术。它旨在比 IPsec更快、更简单、更精简和更有用,同时避免令人头疼的问题。它旨在比 OpenVPN 具有更高的性能。WireGuard 被设计为通用 VPN,用于在嵌入式接口和超级计算机上运行,适用于许多不同的环境。最初是为 Linux 内核发布的,现在是跨平台的(Windows、macOS、BSD、iOS、Android)并且可以广泛部署。它目前正在大力发展,但它可能已经被认为是业内最安全、最容易使用和最简单的 VPN 解决方案。
极高速加密原语和 WireGuard 存在于 Linux 内核中这一事实的结合意味着安全网络可以非常高速。它既适用于智能手机等小型嵌入式设备,也适用于满载的主干路由器。
关于更多的WireGuard的资料可以去WireGuard官网查看更多的信息以及原理
安装
由于我的服务器和客户端都是Ubuntu系统,所以两台机器都是同样执行一样的命令,其他的系统可以在其WireGuard官网安装指引以及WireGuard‘s Github上查看更多
# 安装 wireguard
$ sudo apt install wireguard resolvconf -y
# 查看一些是否开启了ipv4的转发 如果是1跳过下面
$ cat /proc/sys/net/ipv4/ip_forward
# 开启ipv4的内核转发
$ sudo sh -c 'echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf'
# 使配置生效
$ sudo sysctl -p
# 再次查看一些是否开启了ipv4的转发 如果是1跳过下面
$ cat /proc/sys/net/ipv4/ip_forward
配置
由于WireGuard都是通过非对称加密传输的,我们先用wg命令(安装完WireGuard就有了)来创建服务器的公私钥 以及客户端的公私钥,当然客户端的公私钥也可以在其他平台上介绍,到时候复制一下客户端的公钥过来就好了。
由于udp协议的原因,运营商总是会qos,所以我搭配了udp2raw使用,可以将udp模拟成tcp。所以可以在Github Release上下载并解压好文件,我放在**/opt/udp2raw**下
服务端的配置
$ cd /etc/wireguard/
#生成服务器私钥
$ wg genkey > server_priv.key
#通过服务器私钥生成服务器公钥
$ wg pubkey < server_priv.key > server_pub.key
#生成客户端的私钥
$ wg genkey > client_priv.key
#生成客户端的私钥
$ wg pubkey < client_priv.key > client_pub.key
$ cd /etc/wireguard
# 输出配置到文件
$ echo """
[Interface]
PrivateKey = $(cat server_priv.key) # 填写本机的privatekey 内容
Address = 172.16.100.1 #本机虚拟局域网IP
ListenPort = 10086 # 监听端口
DNS = 8.8.8.8
MTU = 1200
PreUp = /opt/udp2raw/udp2raw_amd64 -s -l0.0.0.0:10085 -r127.0.0.1:10086 -k "wireguard-udp2raw" --raw-mode faketcp -a > udp.log &
PostDown = killall udp2raw_amd64 || true
#注意eth0需要为本机网卡名称
[Peer] #Peer可以有很多个例如下面可以继续添加100.3 100.4
PublicKey = xxxxx
AllowedIPs = 172.16.100.2/32
""" > wg0.conf
# 设置开机服务启动,后面的wg0就是配置的名字,可以根据自己去修改
$ sudo systemctl enable wg-quick@wg0
#启动wg0
$ sudo wg-quick up wg0
#关闭wg0
$ sudo wg-quick down wg0
# 打印一下信息,配置客户端使用
$ cat server_pub.key && cat client_priv.key
客户端的配置
# 输出配置到文件
$ echo """
[Interface]
PrivateKey = xxxxxxx # 填写服务器生成的client_priv.key的内容 通过服务器命令 cat client_priv.key 获取
Address = 172.16.100.2 #本机虚拟局域网IP
MTU = 1200
PreUp = /opt/udp2raw/udp2raw_amd64 -c -l0.0.0.0:10085 -r [服务器ip或者域名]:10086 -k "wireguard-udp2raw" --raw-mode faketcp -a > udp.log &
PostDown = killall udp2raw_amd64 || true
[Peer]
PublicKey = xxxxxxx # 填写服务器生成的server_pub.key的内容 通过服务器命令 server_pub.key 获取
AllowedIPs = 176.16.100.0/24
Endpoint = 127.0.0.1:10085
PersistentKeepalive = 25 # 心跳保持 持久性keepalive
""" > wg0.conf
查看结果
# 服务器或者客户端上执行如下命令
$ wg
interface: wg0
public key: xxxxxxx
private key: (hidden)
listening port: 10011
peer: xxxxxx
endpoint: 127.0.0.1:45114
allowed ips: 172.16.100.2/32
latest handshake: 52 seconds ago #这里有写着handshake握手代表成功
transfer: 41.77 KiB received, 36.73 KiB sent