WireGuard VPN 搭建指南
WireGuard VPN 搭建指南
一、服务端配置(Ubuntu 云服务器)
1. 切换到 root 用户
sudo -i2. 安装 WireGuard
bash
apt update
apt install -y wireguard3. 生成服务端密钥对
bash
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key查看密钥(稍后使用):
bash
cat server_private.key
cat server_public.key4. 创建服务端配置文件
bash
vim /etc/wireguard/wg0.conf内容如下(将 PrivateKey 替换为你的服务端私钥,PublicKey 先留空,待客户端生成后填入):
ini
[Interface]
PrivateKey = 服务端私钥
ListenPort = 51820
Address = 10.0.0.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = 客户端公钥
AllowedIPs = 10.0.0.2/32注意:
eth0需替换为服务器实际网卡名(ip a查看,常见为eth0或ens3)。- 如果系统提示
iptables命令不存在,先安装:apt install -y iptables。
5. 开启 IP 转发
bash
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p6. 启动 WireGuard 服务
bash
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0看到 active (running) 即成功。
7. 安全组放行 UDP 51820
在阿里云控制台安全组入方向添加规则:
- 协议:UDP
- 端口:51820
- 授权对象:0.0.0.0/0
这一步必须做,否则客户端无法握手。
二、客户端配置(Windows)
1. 安装 Windows 客户端
从官网下载并安装:https://www.wireguard.com/install/
2. 生成客户端密钥对
打开客户端 → 点击“新建空隧道”,自动生成客户端公钥和私钥,并显示配置窗口。
3. 编辑客户端配置
将配置窗口内容替换为:
ini
[Interface]
PrivateKey = 客户端私钥(自动生成)
Address = 10.0.0.2/32
DNS = 223.5.5.5
[Peer]
PublicKey = 服务端公钥
Endpoint = 你的服务器公网IP:51820
AllowedIPs = 10.0.0.0/24, 你的服务器内网IP/32
PersistentKeepalive = 25注意:
PublicKey必须填服务端公钥(服务器上cat /etc/wireguard/server_public.key)。Endpoint使用服务器公网 IP,格式IP:51820,英文冒号,无空格。AllowedIPs中包含10.0.0.0/24和服务器内网 IP 段(可选)。如果只用于访问 VPN 内网和服务器内网,填10.0.0.0/24即可;若还要访问服务器所在内网其他资源,加上内网网段(如172.23.0.0/16)。
4. 保存并连接
点击保存,然后点击“连接”,状态显示为绿色或打勾即表示连接成功。
三、将客户端公钥填入服务端
在 Windows 客户端复制客户端公钥。
回到服务器,编辑
/etc/wireguard/wg0.conf,将[Peer]部分的PublicKey替换为客户端公钥。重启服务端:
bash
systemctl restart wg-quick@wg0
四、测试连通性
1. 在 Windows 上 ping 服务端虚拟 IP
powershell
ping 10.0.0.1能通说明 VPN 隧道建立成功。
2. 在服务器上查看握手状态
bash
wg出现类似以下内容表示握手成功:
text
peer: <客户端公钥>
endpoint: <家庭公网IP>:xxxxx
latest handshake: 10 seconds ago
transfer: 1.2 MiB received, 2.3 MiB sent五、通过 VPN 连接 MySQL
1. 修改 MySQL 监听地址
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,将 bind-address 修改为:
text
bind-address = 0.0.0.0或仅监听 VPN 虚拟 IP:
text
bind-address = 10.0.0.1然后重启 MySQL:
bash
systemctl restart mysql2. 创建允许 VPN 网段访问的数据库用户
sql
CREATE USER 'vpnuser'@'10.0.0.%' IDENTIFIED BY '你的复杂密码';
GRANT ALL PRIVILEGES ON *.* TO 'vpnuser'@'10.0.0.%';
FLUSH PRIVILEGES;3. 从 Windows 连接
使用 Navicat 或 DBeaver:
- 主机:
10.0.0.1 - 端口:
3306 - 用户名:
vpnuser - 密码:你的密码
命令行测试:
powershell
mysql -h 10.0.0.1 -P 3306 -u vpnuser -p六、故障排查
1. 服务器 wg 输出没有 peer
- 检查安全组 UDP 51820 是否放行。
- 检查客户端 Endpoint 是否填写正确。
- 检查客户端是否点击“连接”。
2. 有 peer 但没有 latest handshake
- 检查服务器和客户端公钥是否匹配(不可填反)。
- 临时关闭 Windows 防火墙测试。
- 尝试更换端口(如 51821),并同步修改服务器配置、安全组、客户端 Endpoint。
3. 握手成功但 ping 不通
检查 IP 转发:
sysctl net.ipv4.ip_forward是否输出1。检查 iptables NAT 规则是否存在:
bash
iptables -t nat -L -n -v | grep MASQUERADE若无则手动添加:
bash
iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE检查客户端
AllowedIPs是否包含10.0.0.0/24。重启服务端:
systemctl restart wg-quick@wg0。临时关闭 Windows 防火墙,如能通则需在防火墙放行 ICMPv4。
七、日常使用
- 服务端:已设置开机自启(
systemctl enable wg-quick@wg0)。 - Windows 客户端:可在设置中勾选开机自动连接。
配置完成后,无论家庭宽带 IP 如何变化,VPN 都会自动重连。访问云服务器上的服务时,使用虚拟 IP(如 10.0.0.1)即可,无需在安全组暴露业务端口。
text