大家好,我是冯哥的缓存。前面我们搞定了 Nginx 的全部安全链路——从安装、反代、HTTPS、负载均衡到性能优化和安全加固。现在服务器在公网上已经比较安全了。
但有一种场景 Nginx 解决不了:想在家里安全地访问公司内网的服务器,或者在外面用手机连家里的 NAS。总不能把所有端口都暴露在公网上吧?这时候就需要 VPN。
提到 VPN,很多人第一反应是 OpenVPN,配置文件几百行,证书体系复杂,速度还不快。今天要聊的 WireGuard,是 VPN 领域的"降维打击":配置短到几十行,性能比 OpenVPN 快好几倍,连手机都能装。
💡 提示: WireGuard 的设计哲学是"少即是多"——代码量只有 OpenVPN 的 1%,意味着漏洞数量天然更少,攻击面更小,更安全。但它不追求功能大而全,而是把核心功能做到极致。
一、为什么选 WireGuard
1.1 WireGuard vs 传统 VPN
💡 提示: "无状态"是 WireGuard 最大的设计亮点。传统 VPN 维护连接状态,连接断了要重新协商。WireGuard 不维护连接状态机,而是通过密钥和计数器维护会话。网络切换时无需重新协商。这意味着网络切换(WiFi→4G)不会断开 VPN。
1.2 WireGuard 的核心特点
| |
|---|
| |
| ChaCha20(对称加密)+ Poly1305(认证)+ Curve25519(密钥交换)+ BLAKE2s(哈希) |
| 只走 UDP,不支持 TCP(UDP 在丢包网络下性能更好) |
| |
| 客户端 IP 变了不影响连接(手机从 WiFi 切到 4G,VPN 不断) |
| 没收到合法数据包时完全不响应,扫描器看不出这是个 VPN 服务 |
| |
1.3 适用场景
⚠️ 注意: WireGuard 本身只是一个 VPN 隧道工具。它不做流量混淆,在防火墙严格的网络环境中可能被识别和阻断。如果需要混淆,可以用 WireGuard + UDP2RAW 等工具组合,或选择 Shadowsocks/V2Ray。
二、安装 WireGuard
2.1 服务端安装(Linux)
Ubuntu/Debian(Linux 5.6+ 内核自带):
# Ubuntu 20.04+ / Debian 11+ 内核已内置 WireGuard 模块# 只需要安装用户态工具sudo apt updatesudo apt install wireguard wireguard-tools
CentOS/RHEL/Rocky:
# CentOS 8+ / Rocky 9sudo dnf install epel-releasesudo dnf install wireguard-tools
内核版本检查:
# 确认内核版本 >= 5.6uname -r# 输出示例:5.15.0-76-generic(OK)# Ubuntu 20.04 的 HWE 内核也内置 WireGuard,可升级sudo apt install linux-generic-hwe-20.04 # 如果内核 < 5.6,需要安装 DKMS 模块sudo apt install wireguard-dkms# 或者升级内核
2.2 验证安装
# 检查内核模块是否加载sudo modprobe wireguardlsmod | grep wireguard# 输出:wireguard 110592 0# 检查工具是否可用wg --version# 输出:wireguard-tools v1.0.20210914 - runtime: go# 如果 modprobe 报错 "Module not found"# 说明内核太低,需要安装 DKMS 或升级内核
三、密钥生成——WireGuard 的身份证
3.1 密钥体系
WireGuard 用公钥加密体系认证身份,和 SSH 类似:
3.2 生成密钥对
# 生成服务端密钥对# 私钥:保存在服务端配置里# 公钥:分发给客户端cd /etc/wireguard# 方法一:分步生成sudo bash -c 'umask 077; wg genkey > server_private.key'sudo bash -c 'wg pubkey < server_private.key > server_public.key'# 方法二:一行搞定sudo bash -c 'wg genkey | tee server_private.key | wg pubkey > server_public.key'# 查看密钥sudo cat server_private.key# 输出:yAnz5TF+lXXJte14tji3zlMNqzhd2rYUIgJBgB3fBmk=sudo cat server_public.key# 输出:GtL7fZc/bLnqZldpVofMCD6hDjrKbioS1A82lSDwXWQ=
⚠️ 注意:umask 077 非常重要!WireGuard 的私钥文件权限必须是 600(只有 owner 可读)。如果不加 umask,密钥文件默认权限是 644,WireGuard 会拒绝加载并报错。
3.3 生成客户端密钥
# 每个客户端都需要独立的密钥对# 生成手机/笔记本的密钥cd /etc/wireguard# 客户端1sudo bash -c 'wg genkey | tee client1_private.key | wg pubkey > client1_public.key'# 客户端2sudo bash -c 'wg genkey | tee client2_private.key | wg pubkey > client2_public.key'# 可选:生成 Pre-shared Key(额外的安全层)sudo bash -c 'wg genpsk > psk.key'# Pre-shared Key 是可选的,加上后即使公钥被破解也无法解密
3.4 密钥文件清单
💡 提示: 私钥永远不出本机。交换的只有公钥。服务端要知道所有客户端的公钥,客户端要知道服务端的公钥。
四、服务端配置
4.1 网络规划
在写配置之前,先规划好 VPN 内部使用的 IP 段:
⚠️ 注意: VPN 网段不能和现有局域网冲突。如果家庭网络是 192.168.1.0/24,公司网络也是 192.168.1.0/24,VPN 就不能用这个段,否则路由冲突。选一个不常用的段,如 10.13.0.0/24。
4.2 编写服务端配置
# /etc/wireguard/wg0.conf[Interface]# 服务端的 VPN 内部 IPAddress = 10.13.0.1/24# 监听端口(UDP)# 51820 是 WireGuard 的官方默认端口,可以自定义ListenPort = 51820# 服务端私钥PrivateKey = yAnz5TF+lXXJte14tji3zlMNqzhd2rYUIgJBgB3fBmk=# MTU(一般不用改,除非有特殊网络环境)MTU = 1420# 开启 IP 转发(让 VPN 客户端可以访问服务端所在的局域网)# 这些命令在 WireGuard 启动/停止时自动执行PostUp = sysctl -w net.ipv4.ip_forward=1PostUp = iptables -A FORWARD -i wg0 -j ACCEPTPostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEPostDown = iptables -D FORWARD -i wg0 -j ACCEPTPostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE# ===== 客户端1:手机 =====[Peer]# 客户端1的公钥PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NQ434kLdPEE=# 客户端1的 VPN IP(注意 /32 表示单个 IP)AllowedIPs = 10.13.0.2/32# 可选:Pre-shared KeyPresharedKey = /Nq5T9XqGwq3Dn3A5pPvVq2bN5bG5L5pVq2bN5bG5E=# 保持连接:每 25 秒发一个心跳包# 如果客户端在 NAT 后面,这个很重要PersistentKeepalive = 25# ===== 客户端2:笔记本 =====[Peer]PublicKey = TrMv5P+wkZEW1iZFd6VGegrN5n3k3l1q7kxXn6mQXxw=AllowedIPs = 10.13.0.3/32PersistentKeepalive = 25
4.3 配置项详解
[Interface] 段(本机配置):
[Peer] 段(对端配置):
💡 提示: 服务端配置里 不需要 写客户端的 Endpoint。客户端是动态 IP,连上来时服务端会自动学习它的地址。只有客户端配置里需要写服务端的 Endpoint。
4.4 PostUp/PostDown 说明
PostUp 和 PostDown 是 WireGuard 启动和停止时自动执行的 shell 命令。上面的配置做了三件事:
| |
|---|
sysctl -w net.ipv4.ip_forward=1 | |
iptables -A FORWARD -i wg0 -j ACCEPT | |
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE | |
这三条命令实现了"让 VPN 客户端通过服务端访问外网"的功能。如果只做点对点 VPN(客户端之间互访),不需要后两条。
⚠️ 注意:eth0 要改成服务器的实际网卡名。用 ip addr 查看网卡名,云服务器通常是 eth0 或 ens3 或 ens5。
五、客户端配置
5.1 Linux 客户端
# /etc/wireguard/wg0.conf(客户端)[Interface]# 客户端的 VPN IPAddress = 10.13.0.2/24# 客户端私钥PrivateKey = cPEt6T7gN3xL5pVq2bN5bG5L5pVq2bN5bG5L5pVq0=# DNS(可选,通过 VPN 时使用的 DNS 服务器)DNS = 223.5.5.5[Peer]# 服务端的公钥PublicKey = GtL7fZc/bLnqZldpVofMCD6hDjrKbioS1A82lSDwXWQ=# 服务端的公网地址和端口Endpoint = your-server.com:51820# 允许通过 VPN 隧道的流量# 0.0.0.0/0 表示所有流量都走 VPN(全局代理)# 10.13.0.0/24 表示只有 VPN 内网流量走 VPN(分流模式)AllowedIPs = 0.0.0.0/0# 心跳保活(客户端在 NAT 后面时必须设)PersistentKeepalive = 25
5.2 AllowedIPs 详解——最重要的参数
AllowedIPs 是 WireGuard 最核心也最容易搞混的参数,它同时控制两件事:
| |
|---|
| 只接受来自该 Peer、源 IP 在 AllowedIPs 范围内的数据包 |
| 把 AllowedIPs 里的网段加入路由表,指向 wg0 接口 |
| | |
|---|
0.0.0.0/0 | | |
0.0.0.0/0, ::/0 | | |
10.13.0.0/24 | | |
10.13.0.0/24, 192.168.1.0/24 | | |
10.13.0.1/32 | | |
# 图解:AllowedIPs 的路由效果## AllowedIPs = 0.0.0.0/0(全局代理)# 所有流量 → wg0 → 服务端 → 互联网# 客户端 IP 显示为服务端公网 IP## AllowedIPs = 10.13.0.0/24(分流模式)# 访问 10.13.0.x → wg0 → 服务端 → VPN 内网# 访问其他 IP → 本地网卡 → 互联网(不走 VPN)
⚠️ 注意: 全局模式 0.0.0.0/0 会让所有流量走 VPN,包括 DNS。如果 VPN 服务端的网络不通外网,客户端会完全断网。先用 10.13.0.0/24 测试连通性,再切全局模式。
5.3 Windows 客户端
- 下载官方客户端:从 wireguard.com 下载 Windows 安装包
- 打开 WireGuard → 点击"添加隧道" → "添加空隧道"
- 会自动生成密钥对,把公钥复制到服务端的
[Peer] 段
[Interface]Address = 10.13.0.3/24PrivateKey = <Windows客户端自动生成的私钥>DNS = 223.5.5.5[Peer]PublicKey = GtL7fZc/bLnqZldpVofMCD6hDjrKbioS1A82lSDwXWQ=Endpoint = your-server.com:51820AllowedIPs = 0.0.0.0/0PersistentKeepalive = 25
💡 提示: Windows 客户端创建空隧道时会自动生成密钥对并显示公钥。把这个公钥复制到服务端配置的 [Peer] 段,设置好 AllowedIPs,然后在服务端 sudo systemctl reload wg-quick@wg0 即可。
5.4 Android 客户端
- 从 Google Play 或 F-Droid 安装 WireGuard
- 打开 App → 点击 "+" → "Create from scratch"
- Endpoint:your-server.com:51820
5.5 iOS 客户端
- 也可以用服务端生成配置二维码,手机扫码导入(见后文)
iOS 客户端对 DNS 字段更敏感,如果 DNS 不生效,可以在 iOS 设置中手动配置 DNS。
六、启动与连接
6.1 服务端启动
# 启动 WireGuard(wg0 是配置文件名去掉 .conf)sudo wg-quick up wg0# 输出示例:# [#] sysctl -w net.ipv4.ip_forward=1# [#] iptables -A FORWARD -i wg0 -j ACCEPT# [#] iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE# [#] ip link add wg0 type wireguard# [#] wg setconf wg0 /dev/fd/63# [#] ip -4 address add 10.13.0.1/24 dev wg0# [#] ip link set mtu 1420 up dev wg0# 停止sudo wg-quick down wg0# 查看状态sudo wg show# 输出示例:# interface: wg0# public key: GtL7fZc/bLnqZldpVofMCD6hDjrKbioS1A82lSDwXWQ=# private key: (hidden)# listening port: 51820## peer: xTIBA5rboUvnH4htodjb6e697QjLERt1NQ434kLdPEE=# endpoint: 123.45.67.89:43210# allowed ips: 10.13.0.2/32# latest handshake: 1 minute ago# transfer: 1.50 MiB received, 2.30 MiB sent
6.2 开机自启
# 设置开机自启sudo systemctl enable wg-quick@wg0# 启动sudo systemctl start wg-quick@wg0# 停止sudo systemctl stop wg-quick@wg0# 重启(修改配置后)sudo systemctl restart wg-quick@wg0# 或者用 reload(不断开现有连接)sudo systemctl reload wg-quick@wg0
💡 提示:wg-quick@wg0 中的 wg0 对应配置文件 /etc/wireguard/wg0.conf。如果有多个 VPN 接口,可以创建 wg1.conf、wg2.conf,分别用 wg-quick@wg1、wg-quick@wg2 管理。
6.3 客户端连接测试
# Linux 客户端启动sudo wg-quick up wg0# 测试 VPN 连通性# 1. ping VPN 服务端ping -c 3 10.13.0.1# 2. 查看自己的 VPN IPip addr show wg0# 3. 查看出口 IP(全局模式时应该显示服务端公网 IP)curl ifconfig.me# 4. 访问服务端局域网内的其他设备ping -c 3 192.168.1.100# 5. 查看连接状态sudo wg show# 看到 "latest handshake: x seconds ago" 说明连接正常
6.4 wg show 输出解读
interface: wg0 public key: GtL7fZc/bLnqZldpVofMCD6hDjrKbioS1A82lSDwXWQ= # 本机公钥 private key: (hidden) # 私钥隐藏显示 listening port: 51820 # 监听端口peer: xTIBA5rboUvnH4htodjb6e697QjLERt1NQ434kLdPEE= # 对端公钥 endpoint: 123.45.67.89:43210 # 对端地址 allowed ips: 10.13.0.2/32 # 允许的 IP latest handshake: 1 minute ago # 最后一次握手 transfer: 1.50 MiB received, 2.30 MiB sent # 流量统计
| | |
|---|
| | |
| | 只有 sent 没有 received = 对端没收到 |
| | |
| | |
如果 latest handshake 显示 never,说明从未握手成功,检查公钥和端口。
七、多客户端管理
7.1 添加新客户端
# 1. 生成新客户端密钥cd /etc/wireguardsudo bash -c 'wg genkey | tee client3_private.key | wg pubkey > client3_public.key'# 2. 编辑服务端配置,添加新的 [Peer]sudo nano /etc/wireguard/wg0.conf# 在文件末尾添加:[Peer]PublicKey = <client3_public.key 的内容>AllowedIPs = 10.13.0.4/32PersistentKeepalive = 25# 3. 重载配置(不断开现有连接)sudo systemctl reload wg-quick@wg0# 或者用 wg 命令热加载(更优雅)sudo wg set wg0 peer <client3_public_key> allowed-ips 10.13.0.4/32
7.2 客户端 IP 分配表
建议维护一张 IP 分配表,避免冲突:
7.3 删除客户端
# 方法一:编辑配置文件删除对应 [Peer] 段sudo nano /etc/wireguard/wg0.conf# 删除该客户端的 [Peer] 段sudo systemctl restart wg-quick@wg0# 方法二:用 wg 命令热删除sudo wg set wg0 peer <客户端公钥> remove# 删除后该客户端的密钥对作废,需要重新生成才能连接
7.4 生成客户端配置二维码
对于手机客户端,可以生成二维码直接扫码导入:
# 安装二维码工具sudo apt install qrencode# 生成客户端配置文件# 把客户端的完整配置写入一个文件cat > /tmp/client1.conf << 'EOF'[Interface]Address = 10.13.0.2/24PrivateKey = cPEt6T7gN3xL5pVq2bN5bG5L5pVq2bN5bG5L5pVq0=DNS = 223.5.5.5[Peer]PublicKey = GtL7fZc/bLnqZldpVofMCD6hDjrKbioS1A82lSDwXWQ=Endpoint = your-server.com:51820AllowedIPs = 0.0.0.0/0PersistentKeepalive = 25EOF# 在终端显示二维码qrencode -t ansiutf8 < /tmp/client1.conf# 如果显示乱码,可以用 qrencode -t UTF8 或转成图片格式 -o client.png。# 手机 WireGuard App → 扫码导入
💡 提示: 生成二维码后立即删除临时文件,避免私钥泄露:rm /tmp/client1.conf
八、防火墙配置
8.1 服务端防火墙
WireGuard 使用 UDP 端口,必须在防火墙放行:
# UFW 防火墙sudo ufw allow 51820/udpsudo ufw reload# iptablessudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT# firewalldsudo firewall-cmd --permanent --add-port=51820/udpsudo firewall-cmd --reload
8.2 UFW 与 WireGuard
如果服务端开了 UFW,还需要允许 wg0 接口的转发:
# 允许 wg0 接口的流量sudo ufw allow in on wg0sudo ufw route allow in on wg0 out on eth0# 或者更宽松sudo ufw allow in on wg0sudo ufw default allow routed
8.3 云服务商安全组
如果服务器在云上(阿里云/腾讯云/AWS),除了系统防火墙,还要在云控制台的安全组里放行 UDP 51820 端口:
| |
|---|
| |
| |
| EC2 → Security Groups → Inbound |
| |
⚠️ 注意: 安全组规则只认 UDP/TCP,WireGuard 只走 UDP。如果只开了 TCP 51820,WireGuard 连不上。一定要选 UDP 协议。
九、进阶配置
9.1 访问服务端局域网
VPN 客户端不仅想访问服务端本身,还想访问服务端所在局域网的其他设备(如公司内网的其他服务器)。
服务端配置改动:
# /etc/wireguard/wg0.conf[Interface]Address = 10.13.0.1/24ListenPort = 51820PrivateKey = <server_private_key># 开启转发PostUp = sysctl -w net.ipv4.ip_forward=1PostUp = iptables -A FORWARD -i wg0 -j ACCEPTPostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEPostDown = iptables -D FORWARD -i wg0 -j ACCEPTPostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
客户端配置改动:
[Interface]Address = 10.13.0.2/24PrivateKey = <client_private_key>[Peer]PublicKey = <server_public_key>Endpoint = your-server.com:51820# 把服务端局域网段也加进来AllowedIPs = 10.13.0.0/24, 192.168.1.0/24PersistentKeepalive = 25
这样客户端就能同时访问 VPN 内网(10.13.0.x)和服务端局域网(192.168.1.x)。
9.2 Site-to-Site VPN(两个局域网互联)
节点 A 配置:
[Interface]Address = 10.13.0.1/24ListenPort = 51820PrivateKey = <A_private_key># 开启转发PostUp = sysctl -w net.ipv4.ip_forward=1PostUp = iptables -A FORWARD -i wg0 -j ACCEPTPostDown = iptables -D FORWARD -i wg0 -j ACCEPT[Peer]PublicKey = <B_public_key>Endpoint = 5.6.7.8:51820# 允许 B 的 VPN IP + B 的局域网AllowedIPs = 10.13.0.2/32, 192.168.2.0/24PersistentKeepalive = 25
节点 B 配置:
[Interface]Address = 10.13.0.2/24ListenPort = 51820PrivateKey = <B_private_key>PostUp = sysctl -w net.ipv4.ip_forward=1PostUp = iptables -A FORWARD -i wg0 -j ACCEPTPostDown = iptables -D FORWARD -i wg0 -j ACCEPT[Peer]PublicKey = <A_public_key>Endpoint = 1.2.3.4:51820AllowedIPs = 10.13.0.1/32, 192.168.1.0/24PersistentKeepalive = 25
💡 提示: Site-to-Site 的关键是 AllowedIPs 互写对方的局域网段。节点 A 的配置里写 B 的局域网 192.168.2.0/24,节点 B 的配置里写 A 的局域网 192.168.1.0/24。这样 A 局域网的设备就能直接访问 B 局域网的设备。
9.3 动态 IP 的 Endpoint
如果服务端有动态公网 IP,可以用域名 + DDNS:
# 客户端配置[Peer]PublicKey = <server_public_key># 用域名代替 IPEndpoint = myddns.example.com:51820AllowedIPs = 0.0.0.0/0PersistentKeepalive = 25
WireGuard 在发起握手时会解析域名,因此如果域名 IP 变化,下次握手时会自动更新。
9.4 多 VPN 接口
一台服务器可以同时运行多个 WireGuard 接口,用不同的端口和网段:
# /etc/wireguard/wg0.conf → 端口 51820,网段 10.13.0.0/24(工作 VPN)# /etc/wireguard/wg1.conf → 端口 51821,网段 10.14.0.0/24(个人 VPN)# 分别启动sudo wg-quick up wg0sudo wg-quick up wg1# 分别设置开机自启sudo systemctl enable wg-quick@wg0sudo systemctl enable wg-quick@wg1
十、一键脚本部署
如果觉得手动配置太麻烦,可以用开源的一键脚本:
# 下载并运行一键安装脚本(社区维护)# 该脚本会自动完成:安装、生成密钥、配置服务端、生成客户端配置curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.shchmod +x wireguard-install.shsudo ./wireguard-install.sh
脚本交互过程:
⚠️ 注意: 一键脚本方便但不要盲目信任。建议先手动配置一遍理解原理,再用脚本提高效率。脚本生成的配置和手动写的完全一样,只是省去了重复操作。
十一、常见问题排查
11.1 连不上 VPN
如果连接失败,按这个顺序排查——1、端口通不通;2、公钥对不对;3、AllowedIPs 对不对。
| | |
|---|
| | 服务端 sudo tcpdump -i eth0 udp port 51820 看有没有收到包 |
| | 确认客户端配置的 Endpoint IP/域名正确 |
| | 检查客户端的 PublicKey 是服务端的,服务端的 PublicKey 是客户端的 |
| | sudo modprobe wireguard |
| | 确认客户端 AllowedIPs 包含 VPN 网段 |
| | sysctl net.ipv4.ip_forward |
| AllowedIPs 0.0.0.0/0 但服务端 NAT 没配 | 检查 PostUp 的 MASQUERADE 规则 |
11.2 连接频繁断开
| |
|---|
| 客户端加 PersistentKeepalive = 25 |
| |
| 换端口(如 53/443),或用 UDP2RAW 伪装成 TCP |
| |
11.3 速度慢
| |
|---|
| |
| |
| |
| 升级到 5.10+ 获得更好的 WireGuard 性能 |
| |
11.4 用 tcpdump 抓包排查
# 在服务端抓 WireGuard 端口的 UDP 包sudo tcpdump -i eth0 udp port 51820 -n# 看到客户端的包到达 → 说明客户端发出正常,问题在服务端# 没看到任何包 → 说明包被防火墙/安全组拦了# 抓 wg0 接口的包(解密后的内网流量)sudo tcpdump -i wg0 -n# 看到 ICMP echo request 但没有 reply → 说明目标设备没响应或路由不对
11.5 查看详细日志
# WireGuard 没有传统日志,用 wg show 查看状态sudo wg show all# 开启内核动态调试sudo modprobe wireguardecho 1 | sudo tee /sys/module/wireguard/parameters/debug# 用 dmesg 查看调试信息sudo dmesg | grep wireguard
💡 提示: WireGuard 的设计理念是"静默"——不输出日志,不响应非法请求。这让排查变得困难,但也让攻击者无法通过日志探测 VPN。排查连接问题时,tcpdump + wg show 是最重要的两个工具。
十二、安全最佳实践
| |
|---|
| chmod 600 /etc/wireguard/*.conf |
| |
| |
| |
| |
| 如果只有固定 IP 客户端,用防火墙限制来源 IP |
| |
| 定期 wg show 检查有没有未知的 Peer 连接 |
十三、速查表
常用命令速查
| |
|---|
sudo wg-quick up wg0 | |
sudo wg-quick down wg0 | |
sudo wg show | |
sudo wg show wg0 latest-handshakes | |
sudo wg show wg0 transfer | |
sudo systemctl enable wg-quick@wg0 | |
sudo systemctl restart wg-quick@wg0 | |
sudo wg set wg0 peer allowed-ips | |
sudo wg set wg0 peer remove | |
配置文件速查
排查速查
| | |
|---|
| tcpdump udp port 51820 | wg show |
| | sysctl ip_forward |
| | |
| | |
| | |
小结
WireGuard 的核心配置流程:
- 安装 —
apt install wireguard-tools,一行搞定 - 生成密钥 —
wg genkey | tee private | wg pubkey > public,每台机器一对 - 写服务端配置 — Interface 段写自己的 IP/端口/私钥,Peer 段写每个客户端的公钥和 IP
- 写客户端配置 — Interface 段写自己的 IP/私钥,Peer 段写服务端公钥/地址/AllowedIPs
- 开防火墙
- 启动 —
wg-quick up wg0 + systemctl enable - 验证
记住三个容易踩的坑:
- 公钥和私钥配反了 — 客户端 [Peer] 里写的是服务端的公钥,不是私钥
- AllowedIPs 搞混了 — 服务端每个 Peer 的 AllowedIPs 是该客户端的 IP(/32),客户端的 AllowedIPs 是要路由的网段(/0 或 /24)
- 防火墙没开 UDP — WireGuard 只走 UDP,安全组只开了 TCP 的话连不上
💡 提示: 如果觉得手动配置繁琐,推荐先用一键脚本体验,理解原理后再手动配置多客户端和进阶场景。WireGuard 的配置文件非常简洁,一个 20 行的配置就能完成 OpenVPN 200 行配置的工作。
下篇预告:《Linux 网络进阶——从零搭一个对外服务》——把 Nginx + HTTPS + 负载均衡 + 安全加固 + WireGuard VPN 串起来,从零开始搭一个完整的对外服务架构。