背景

搭建 VPN 方便连接无公网 IP 云主机进行开发,WireGuard 配置比 OpenVPN 要简单很多,WireGuard 是通过 Linux 内核模块的方式实现的,这样性能最好,但是只能用在 Linux 系统上。本文使用的 wireguard-go, 则是使用 Golang 实现的 WireGuard 协议,属于用户空间(User Space)的实现,性能没有内核模块方式好,但好处就是跨平台且更简单易用。

VPN 的用处非常的多,不像 frp 之类的端口穿透应用,它是直接建立虚拟的网络,网络中的每个客户端也都可以拥有自己独立的 IP,于是测试调试就没有了端口的限制,非常的方便。

除了方便安全连接云服务器,还可以通过 VPN 搭建工业设备的远程部署和维护的解决方案。

编译 wireguard-go

# 使用 GitHub 的源码镜像,速度会快一些
git clone [email protected]:wireguard/wireguard-go.git

# 在 MacOS 下交叉编译
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o "wireguard-go"

# Linux 环境下直接编译

go build -v -o "wireguard-go"

cp wireguard-go /usr/sbin/

编译 WireGuard tools

git clone [email protected]:wireguard/wireguard.git

# 安装依赖

## debian&ubuntu
sudo apt-get install libmnl-dev libelf-dev

## centos
sudo yum install libmnl-devel elfutils-libelf-devel

cd wireguard/src/tools
make 
sudo make install

配置 WireGuard

生成密钥

cd /etc/wireguard
wg genkey | tee server_privatekey | wg pubkey > server_publickey

生成服务器端配置文件 wg0.conf

echo "[Interface]
PrivateKey = $(cat server_privatekey)
Address = 10.0.0.1/24 
PostUp   = iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT; iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT; iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 1194
MTU = 1420
"> wg0.conf

生成客户端配置文件 client-wg0.conf

echo "[Interface]
PrivateKey = $(cat client_privatekey)
Address = 10.0.0.2/24
DNS = 8.8.8.8
MTU = 1420

[Peer]
PublicKey = $(cat server_publickey)
Endpoint = ${server_ip}:1194
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 30" | sed '/^#/d;/^\s*$/d' > client-wg0.conf

在服务器端开启数据包转发

echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

最后在服务器端启动 WireGuard

wg-quick up wg0

客户端需要根据前面生成的配置文件进行配置

参考