阿里云 CentOS 搭建 WireGuard
1. 购买服务器 & 配置安全组
在 阿里云 ECS 控制台 购买一台 ECS 实例
- 地域:选择中国大陆机房
- 系统:Alibaba Cloud Linux 3 / CentOS 8
- 带宽:≥ 5 Mbps
在 安全组 → 入方向规则 添加:
- 协议类型:UDP
- 端口范围:51820
- 授权对象:0.0.0.0/0
2. 服务端安装 WireGuard
sudo dnf update -y
sudo dnf install -y wireguard-tools iproute iptables
# 生成密钥
# 服务端
wg genkey | tee ~/server_private.key | wg pubkey > ~/server_public.key
# 客户端
wg genkey | tee ~/client_private.key | wg pubkey > ~/client_public.key
# 写配置文件 /etc/wireguard/wg0.conf
SVR_PRIV=$(cat ~/server_private.key)
CLI_PUB=$(cat ~/client_public.key)
sudo bash -c "cat > /etc/wireguard/wg0.conf" <<EOF
[Interface]
PrivateKey = ${SVR_PRIV}
Address = 10.0.0.1/24
ListenPort = 51820
MTU = 1380
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = ${CLI_PUB}
AllowedIPs = 10.0.0.2/32
EOF
# 开启内核转发
sudo sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
# 启动WireGuard
sudo systemctl enable wg-quick@wg0
sudo systemctl restart wg-quick@wg0
sudo wg show
3. 本地 Windows 客户端
下载 WireGuard for Windows
打开应用 → Add Tunnel → Import from file
写入如下配置(⚠️ 修改为你的公网 IP,例如 1.123.123.123):
[Interface]
PrivateKey = (client_private.key 内容)
Address = 10.0.0.2/24
DNS = 223.5.5.5
MTU = 1380
[Peer]
PublicKey = (server_public.key 内容)
Endpoint = 1.123.123.123:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
4.细节
在客户端
wireguard使用Curve25519 椭圆曲线密钥(非对称加密算法)
[Interface]
里面是自己的私钥和自己的虚拟ip地址,解析用的dns服务器(这里选了阿里云的)
MTU限制吞吐量
- 这么做有三大好处:
避免 DNS 泄漏:如果不改,浏览器可能还在用本地网关的 DNS,查询会走公网而不是隧道。
解析内网域名:你在服务器上跑了
dnsmasq/unbound
(比如10.0.0.1
),客户端填它就能解析内网域名。稳定性:一些网络/MTU 场景下,把 DNS 指向“隧道内可达”的服务器更稳。
[peer]
端保存服务器的公钥,服务器的ip和端口
AllowedIPs目前是全局代理,当然可以指定自己的规则
- 全局代理:
0.0.0.0/0, ::/0
- 仅内网:例如
10.0.0.0/24
PersistentKeepalive = 25
是为了防止因为NAT等原因断开
但是我下边的日志交换密钥很频繁可能是因为丢包率较高
在服务器端
首先下载需要的组件
其次生成公钥私钥
自己保存私钥 公钥是为了方便别人找到自己
在服务器控制面板打开udp协议和端口
[peer]
PublicKey =
AllowedIPs = 10.0.0.2/32
写好客户端的公钥和ip
[Interface]
端不需要写DNS但是要指定自己的端口
启用 IPv4 转发:
net.ipv4.ip_forward=1
(见安装步骤)NAT 与转发:同时允许流量进/出
wg0
,并做源 NAT
#配置服务器转发(若需客户端通过服务器访问公网)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 启动服务并设置开机自启
sudo systemctl enable --now wg-quick@wg0
# 查看状态(若显示“active (running)”则成功)
sudo systemctl status wg-quick@wg0
# 查看连接信息(初始为空,待客户端连接后显示)
sudo wgo wg
分析一下通信过程
- Peer A:「客户端设备」(比如你的 PC、手机,即之前配置中
Address = 10.0.0.2/24
或10.0.0.3/24
的设备) - Peer B:「阿里云 WireGuard 服务器」(即
Address = 10.0.0.1/24
、ListenPort = 51820
的设备,其 Endpoint 是服务器公网 IP:51820,比如你之前用的8.138.164.133:51820
)
1. 密钥协商:A 是客户端,B 是服务器
流程中 “Peer A 首次向 Peer B 发送数据”,对应实际场景:
- Peer A(客户端):你的 PC / 手机(主动发起连接的一方)。比如你点击 PC 上 WireGuard 的 “Activate” 后,客户端会生成 “临时随机数”,用服务器的公钥加密,向服务器的 Endpoint(
8.138.164.133:51820
)发送请求; - Peer B(服务器):阿里云上的 WireGuard 服务端(监听 51820 端口的一方)。收到客户端的请求后,用自己的私钥解密,再生成临时随机数、用客户端公钥加密后返回响应,最终双方算出相同的 “会话密钥”。
2. 数据封装:A 是客户端(发起访问的一方)
流程中 “Peer A 要访问 Peer B 所在的公司内网(如 10.0.0.5)”,对应实际场景:
- Peer A(客户端):你的 PC / 手机(要访问服务器内网资源的一方)。比如你在 PC 上访问服务器内网的
10.0.0.5
设备,PC 会把访问请求发给本地 WireGuard 虚拟网卡(wg0
),再由 WireGuard 用 “会话密钥” 加密,封装成 UDP 包发给服务器; - Peer B(服务器):阿里云 WireGuard 服务端(内网资源的 “网关”)。客户端发送的 UDP 包,目标地址就是服务器的 Endpoint(
8.138.164.133:51820
)。
3. 数据解密与转发:B 是服务器(转发内网资源的一方)
流程中 “Peer B 收到 UDP 数据包后转发到内网”,对应实际场景:
- Peer B(服务器):阿里云 WireGuard 服务端。收到客户端的加密包后,验证客户端身份、解密数据,再根据
AllowedIPs
规则(比如服务器配置中允许客户端访问内网),把请求转发到内网的10.0.0.5
; - Peer A(客户端):你的 PC / 手机。当
10.0.0.5
返回响应时,响应会先发给服务器,服务器加密后再发给客户端,客户端解密后交给本地系统,完成一次通信。