背景
搭建 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
客户端需要根据前面生成的配置文件进行配置