前言
最近我在阿里云轻量应用服务器上部署了一个个人自用的 WireGuard VPN。
这台服务器原本已经运行了 WordPress、Nginx、MariaDB 和宝塔面板,所以在正式搭建 VPN 之前,我先对服务器做了一轮基础安全加固。
本篇文章记录完整过程,包括:
1. 检查服务器端口
2. 加固 MariaDB 数据库端口
3. 收紧 Nginx 888 端口
4. 确认宝塔面板公网不可访问
5. 阿里云防火墙放行 WireGuard UDP 端口
6. 安装 WireGuard
7. 配置服务端
8. 配置 Windows 客户端
9. 测试 VPN 是否成功连接
本次搭建目标很明确:
只做个人自用 VPN,不做机场,不做多人共享。
一、服务器环境
本次使用的是阿里云轻量应用服务器,环境如下:
| 项目 | 配置 |
|---|---|
| 云厂商 | 阿里云 |
| 类型 | 轻量应用服务器 |
| 地域 | 日本东京 |
| 系统 | Alibaba Cloud Linux 3 |
| CPU | 2 vCPU |
| 内存 | 2 GiB |
| 硬盘 | 40 GiB |
| 镜像 | WordPress 应用镜像 |
| Web 环境 | Nginx + MariaDB + WordPress |
| VPN 软件 | WireGuard |
服务器原本已经运行 WordPress,所以不能直接乱改端口或服务。
在部署 VPN 前,先查看当前监听端口。
ss -tulnp
可以看到类似端口:
22 SSH
80 HTTP
443 HTTPS
888 Nginx 附加端口
8888 宝塔面板
3306 MariaDB
这里需要重点关注:
3306 数据库端口
888 Nginx 附加端口
8888 宝塔面板端口
二、加固 MariaDB:关闭 3306 公网监听
一开始查看端口时,MariaDB 是这样监听的:
*:3306
这表示 MariaDB 监听在所有网卡上。
如果云防火墙不小心放行了 3306,公网就可能直接访问数据库,这是比较危险的。
1. 查看 MariaDB 进程
ps -ef | grep '[m]ariadbd'
可以看到数据库路径类似:
/www/server/mysql/bin/mariadbd
这说明当前 MariaDB 是宝塔环境安装的。
2. 查找 MySQL 配置文件
find /etc /www/server -name "my.cnf" 2>/dev/null
主要配置文件是:
/etc/my.cnf
其他 mysql-test 目录下的是测试文件,不需要修改。
3. 备份配置文件
cp /etc/my.cnf /etc/my.cnf.bak.$(date +%F_%H%M)
4. 修改 MariaDB 监听地址
执行下面命令,把 MariaDB 限制为只监听本机:
if grep -q "^\[mysqld\]" /etc/my.cnf; then
if grep -qE "^[[:space:]]*bind-address[[:space:]]*=" /etc/my.cnf; then
sed -ri 's|^[[:space:]]*bind-address[[:space:]]*=.*|bind-address=127.0.0.1|' /etc/my.cnf
else
sed -i '/^\[mysqld\]/a bind-address=127.0.0.1' /etc/my.cnf
fi
else
cat >> /etc/my.cnf <<'EOF'
[mysqld]
# 只允许本机访问 MySQL,避免 3306 暴露到公网
bind-address=127.0.0.1
EOF
fi
检查是否写入成功:
grep -nE "^\[mysqld\]|bind-address" /etc/my.cnf
正常应该看到:
[mysqld]
bind-address=127.0.0.1
5. 重启 MariaDB
/etc/init.d/mysqld restart
6. 检查 3306 监听状态
ss -tulnp | grep 3306
正确结果应该是:
127.0.0.1:3306
这说明 MariaDB 现在只允许服务器本机访问,公网无法直接连接数据库。
三、确认 WordPress 是否正常
修改数据库监听地址后,需要确认 WordPress 网站是否正常。
curl -I https://你的域名
如果返回:
HTTP/2 200
说明网站正常。
本次环境中,WordPress 通过 Cloudflare 代理访问,访问链路大致是:
用户浏览器 → Cloudflare → 阿里云服务器 → WordPress
数据库端口收紧后,WordPress 没有受到影响。
四、收紧 Nginx 的 888 端口
继续检查发现 Nginx 监听了 888 端口:
0.0.0.0:888
先访问本机测试:
curl -I http://127.0.0.1:888
返回:
HTTP/1.1 404 Not Found
Server: nginx
说明这个端口由 Nginx 监听,但是没有实际页面匹配。
1. 查找 888 端口配置
grep -R "listen 888" /www/server/panel/vhost/nginx /www/server/nginx/conf 2>/dev/null
找到配置位置:
/www/server/nginx/conf/nginx.conf
2. 备份 Nginx 配置
cp /www/server/nginx/conf/nginx.conf /www/server/nginx/conf/nginx.conf.bak.$(date +%F_%H%M)
3. 修改 888 为本机监听
sed -i 's/listen 888;/listen 127.0.0.1:888; # 仅本机访问/' /www/server/nginx/conf/nginx.conf
4. 检查 Nginx 配置
/www/server/nginx/sbin/nginx -t
如果看到:
syntax is ok
test is successful
说明配置没有问题。
5. 重启 Nginx
这里建议使用 restart,而不是 reload。
/etc/init.d/nginx restart
6. 检查 888 端口
ss -ltnp '( sport = :888 )'
正确结果:
127.0.0.1:888
这说明 888 端口已经只允许本机访问。
五、确认宝塔 8888 端口
查看宝塔面板端口:
ss -ltnp '( sport = :8888 )'
结果可能是:
0.0.0.0:8888
这表示宝塔面板在服务器本机监听所有网卡。
但是是否能从公网访问,还要看阿里云防火墙是否放行了 8888。
用浏览器访问:
http://你的服务器公网IP:8888
如果打不开,说明阿里云防火墙没有放行 8888,公网访问不到。
我的建议是:
不要在阿里云防火墙放行 8888
如果必须开放,也只允许自己的公网 IP 访问
六、阿里云防火墙放行 WireGuard 端口
WireGuard 默认使用 UDP 协议,本次使用端口:
51820/UDP
在阿里云轻量应用服务器防火墙模板中新增规则:
| 项目 | 内容 |
|---|---|
| 应用类型 | 自定义 |
| 协议 | UDP |
| 端口范围 | 51820 |
| 来源 IP | 0.0.0.0/0 |
| 策略 | 允许 |
注意:
WireGuard 使用 UDP,不是 TCP。
创建规则后,需要将防火墙模板应用到当前服务器实例。
七、检查 WireGuard 内核支持
在服务器执行:
uname -r
modprobe wireguard
lsmod | grep wireguard
如果看到类似内容:
wireguard
libchacha20poly1305
udp_tunnel
curve25519_x86_64
说明当前系统支持 WireGuard。
本次服务器内核可以正常加载 WireGuard 模块。
八、安装 WireGuard 工具
执行:
dnf install -y wireguard-tools iptables || yum install -y wireguard-tools iptables
安装完成后,就可以使用:
wg
wg-quick
九、生成 WireGuard 服务端与客户端密钥
创建配置目录:
mkdir -p /etc/wireguard
chmod 700 /etc/wireguard
生成服务端密钥:
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
生成客户端 peer1 密钥:
wg genkey | tee /etc/wireguard/peer1_private.key | wg pubkey > /etc/wireguard/peer1_public.key
注意:
server_private.key 是服务端私钥,不能泄露。
peer1_private.key 是客户端私钥,也不能泄露。
十、生成 WireGuard 服务端配置
自动识别公网出口网卡:
PUB_IF=$(ip route get 1.1.1.1 | awk '{print $5; exit}')
读取密钥:
SERVER_PRIVATE=$(cat /etc/wireguard/server_private.key)
PEER1_PUBLIC=$(cat /etc/wireguard/peer1_public.key)
写入服务端配置:
cat > /etc/wireguard/wg0.conf <
十一、开启 IPv4 转发
WireGuard 客户端要通过服务器访问外网,服务器必须开启 IPv4 转发。
临时开启:
sysctl -w net.ipv4.ip_forward=1
永久开启:
cat > /etc/sysctl.d/99-wireguard.conf <
重新加载:
sysctl --system
确认看到:
net.ipv4.ip_forward = 1
十二、启动 WireGuard 服务端
启动并设置开机自启:
systemctl enable --now wg-quick@wg0
查看服务状态:
systemctl status wg-quick@wg0 --no-pager
正常状态:
Active: active (exited)
查看 WireGuard 状态:
wg
查看 UDP 51820 是否监听:
ss -ulnp | grep 51820
正常结果:
0.0.0.0:51820
[::]:51820
到这里,WireGuard 服务端已经启动成功。
十三、生成 Windows 客户端配置
生成客户端配置文件:
cat > /root/peer1.conf <
注意:
/root/peer1.conf 里包含客户端私钥,不能公开。
十四、Windows 客户端导入配置
Windows 安装 WireGuard 官方客户端后,打开软件。
点击:
从文件导入隧道
选择:
peer1.conf
导入成功后,点击:
连接
如果导入失败,常见原因是配置文件复制多了终端输出。
正确配置文件第一行必须是:
[Interface]
不能包含:
[root@xxx]# cat /root/peer1.conf
applications.auth peer1.conf
这些内容都不是 WireGuard 配置,复制进去就会报错。
十五、测试 VPN 是否成功连接
Windows 客户端点击连接后,在服务器执行:
wg
如果看到:
latest handshake: xx seconds ago
transfer: xxx received, xxx sent
说明客户端已经连接成功。
本次测试中,服务器显示:
latest handshake: 23 seconds ago
transfer: 567.11 KiB received, 1.86 MiB sent
这说明 Windows 客户端已经和服务器完成握手,并且开始正常收发数据。
最后可以在 Windows 浏览器打开:
https://ifconfig.me
如果显示的是服务器公网 IP,说明当前 Windows 流量已经通过 WireGuard VPN 出口访问互联网。
十六、安全注意事项
1. 不要泄露 peer1.conf
peer1.conf 里面有客户端私钥:
PrivateKey
谁拿到这个文件,谁就可以使用你的 VPN。
2. 不要多人共用同一个 peer
当前客户端地址是:
10.66.66.2/32
这个只建议给一台设备使用。
如果手机也要连接,应该单独创建:
peer2:10.66.66.3/32
peer3:10.66.66.4/32
不要把同一个配置文件复制给多台设备长期同时使用。
3. 阿里云防火墙不要乱开端口
建议只开放:
22/tcp SSH
80/tcp HTTP
443/tcp HTTPS
51820/udp WireGuard
不要开放:
3306/tcp MySQL
888/tcp Nginx 附加端口
8888/tcp 宝塔面板
4. 不要做公开机场
本次搭建目标是个人自用 VPN,不建议用于:
多人共享
公开订阅
机场面板
BT/PT 下载
长期跑满带宽
这样容易触发服务商风控,也可能违反服务商使用规则。
5. 定期检查 WireGuard 状态
查看 WireGuard 状态:
wg
查看服务状态:
systemctl status wg-quick@wg0 --no-pager
重启 WireGuard:
systemctl restart wg-quick@wg0
停止 WireGuard:
systemctl stop wg-quick@wg0
十七、常见问题排查
问题 1:客户端导入失败
一般是配置文件复制错了。
正确开头:
[Interface]
错误开头:
[root@xxx]# cat /root/peer1.conf
applications.auth peer1.conf
解决方法:
只保留 [Interface] 到 PersistentKeepalive = 25 之间的内容。
问题 2:客户端能连接,但是不能上网
检查 IPv4 转发:
sysctl net.ipv4.ip_forward
正确结果:
net.ipv4.ip_forward = 1
检查 NAT 规则:
iptables -t nat -L POSTROUTING -n -v
检查 WireGuard 状态:
wg
问题 3:没有握手
检查阿里云防火墙是否放行:
51820/UDP
注意必须是 UDP,不是 TCP。
检查服务端是否监听:
ss -ulnp | grep 51820
问题 4:和 Clash Verge 冲突
如果电脑上同时开启 Clash Verge 和 WireGuard,可能出现路由或 DNS 冲突。
建议测试 WireGuard 时:
先关闭 Clash Verge
或者把 Clash Verge 切换为直连
十八、最终效果
本次实验最终完成:
MariaDB 3306 收紧到 127.0.0.1
Nginx 888 收紧到 127.0.0.1
宝塔 8888 公网无法访问
阿里云防火墙放行 51820/UDP
WireGuard 服务端正常启动
Windows 客户端成功导入配置
VPN 握手成功
数据传输正常
最终在服务器执行 wg,可以看到:
latest handshake
transfer received / sent
这代表 WireGuard VPN 已经成功连接。
总结
这次实验的重点不是简单安装 WireGuard,而是在已有 WordPress 服务器环境中,先完成基础安全加固,再部署个人 VPN。
整个过程可以总结成三句话:
先加固,再部署。
先收端口,再开 VPN。
只做自用,不做公开服务。
WireGuard 相比传统 VPN 更轻量,配置也更简洁。
只要保护好私钥、控制好端口、避免多人滥用,它非常适合个人远程访问和轻量代理场景。
文章标签
WireGuard
VPN
阿里云
轻量应用服务器
Linux
网络安全
服务器运维
WordPress
宝塔面板
文章摘要
本文记录了一次在阿里云轻量应用服务器上搭建个人 WireGuard VPN 的完整过程,包括 MariaDB 端口加固、Nginx 端口收紧、阿里云防火墙配置、WireGuard 服务端部署、Windows 客户端导入与连接测试。
Comments NOTHING