Skip to content

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 模块,只需安装用户态工具:

apt update
apt install wireguard wireguard-tools -y

验证内核支持:

modprobe wireguard && echo "OK" || echo "FAIL"

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

查看隧道状态:

wg show

输出示例——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