WireGuard

阿里云 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限制吞吐量

  • 这么做有三大好处:
  1. 避免 DNS 泄漏:如果不改,浏览器可能还在用本地网关的 DNS,查询会走公网而不是隧道。

  2. 解析内网域名:你在服务器上跑了 dnsmasq/unbound(比如 10.0.0.1),客户端填它就能解析内网域名。

  3. 稳定性:一些网络/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/2410.0.0.3/24 的设备)
  • Peer B:「阿里云 WireGuard 服务器」(即 Address = 10.0.0.1/24ListenPort = 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 返回响应时,响应会先发给服务器,服务器加密后再发给客户端,客户端解密后交给本地系统,完成一次通信。

PC端客户端的日志

到货包装 日志1