WireGuard 部署与组网完整教程
1、实验环境
| 项目 | 详情 |
|---|---|
| 服务端 | 阿里云服务器,2C/2G/40G,5Mbps |
| 操作系统 | Debian 13.2 (内核 6.12,WireGuard 内置) |
| 虚拟子网 | 10.8.0.0/24 |
| 服务端虚拟 IP | 10.8.0.1/24 |
| 监听端口 | 51820/UDP |
| 客户端 | Windows / macOS / iOS / Android |
2、WireGuard 详细安装与配置步骤
2.1、安装 WireGuard
Debian 13.2 内核已内置 WireGuard 模块,只需安装用户态工具:
验证内核支持:
2.2、生成密钥对
WireGuard 的配对逻辑是公钥交换——和 SSH 的公钥认证思维一致。
# 服务端密钥对
wg genkey | tee /etc/wireguard/server_private_key | wg pubkey > /etc/wireguard/server_public_key
# 客户端密钥对
wg genkey | tee /etc/wireguard/client_private_key | wg pubkey > /etc/wireguard/client_public_key
每条隧道是两个公钥的绑定关系:服务端持有自己的私钥 + 客户端的公钥,客户端持有自己的私钥 + 服务端的公钥。双方没有证书链、没有 CA、没有信任链概念——就是两个密钥对的直接配对。
2.3、服务端配置
创建 /etc/wireguard/wg0.conf
# Server
[Interface]
PrivateKey = <server_private_key>
Address = 10.8.0.1/24
ListenPort = 51820
PreUp =
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
PreDown =
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT 2>/dev/null || true; iptables -D FORWARD -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT 2>/dev/null || true
# Client 1
[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.8.0.2/32
AllowedIPs 的含义
AllowedIPs 不是 IP 白名单,它是 WireGuard 的路由表。 对服务端来说,
AllowedIPs = 10.8.0.2/32表示「发往 10.8.0.2 的包走这个 peer 的隧道」。 对客户端来说,AllowedIPs = 0.0.0.0/0表示「所有流量都路由进隧道(全局代理)」,AllowedIPs = 10.8.0.0/24 表示「只有内网流量走隧道(内网穿透模式)」。
2.4、开启内核转发 + BBR
编辑文件:/etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 使配置生效
sysctl -p
2.5、启动服务
chmod 600 /etc/wireguard/*.conf
systemctl enable wg-quick@wg0 --now
systemctl status wg-quick@wg0 --no-pager
查看隧道状态:
输出示例——latest handshake 和 transfer 是连接状态的直接证据:
interface: wg0
public key: <server_public_key>
private key: (hidden)
listening port: 51820
peer: <client_public_key>
allowed ips: 10.8.0.2/32
latest handshake: 22 seconds ago
transfer: 4.23 MiB received, 18.71 MiB sent
2.6、客户端配置
客户端配置文件 /etc/wireguard/client.conf
[Interface]
PrivateKey = <client_private_key>
Address = 10.8.0.2/32
PreUp =
PostUp = iptables -A FORWARD -i client -j ACCEPT; iptables -A FORWARD -o client -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown =
PostDown = iptables -D FORWARD -i client -j ACCEPT 2>/dev/null || true; iptables -D FORWARD -o client -j ACCEPT 2>/dev/null || true; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE 2>/dev/null || true
[Peer]
PublicKey = <server_public_key>
Endpoint = <阿里公网IP>:51820
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25
两种模式的切换点就在 AllowedIPs:
0.0.0.0/0— VPN 全局代理,所有流量经服务器出去10.8.0.0/24— 内网穿透模式,只有内网 IP 段流量走隧道
PersistentKeepalive = 25 针对 NAT 后面的客户端——每 25 秒发一个 keepalive 包,维持 NAT 表项不过期。
2.7、添加新客户端
方法一:命令行热添加(不中断服务)
wg genkey | tee /etc/wireguard/new_client_private_key | wg pubkey > /etc/wireguard/new_client_public_key
wg set wg0 peer $(cat /etc/wireguard/new_client_public_key) allowed-ips 10.8.0.3/32
方法二:编辑配置文件
在 /etc/wireguard/wg0.conf 中追加新 [Peer] 块,然后执行systemctl restart wg-quick@wg0。
方法二会断开所有现有连接,如果服务正在承载生产流量,选方法一。
3、常用命令速查
| 动作 | 命令 |
|---|---|
| 启动 | systemctl start wg-quick@wg0 |
| 停止 | systemctl stop wg-quick@wg0 |
| 重启 | systemctl restart wg-quick@wg0 |
| 查看状态 | systemctl status wg-quick@wg0 --no-pager |
| 隧道状态 | wg show |
| 日志 | journalctl -u wg-quick@wg0 -f |