WireGuard 配置实录

网页存档预览:您说: 用一个ubuntu22云服务器当作网关,把几个不同地域的个人电脑连成一个vpn <path d=”M12.668 10.667C12.668 9.95614 12.668 …(正文为原页面完整内容)

您说:
用一个ubuntu22云服务器当作网关,把几个不同地域的个人电脑连成一个vpn
ChatGPT 说:

非常好的目标 👍 ——你想用 Ubuntu 22 云服务器 做一个 中心网关(VPN Hub),把多个不同地域的个人电脑(Windows / macOS / Linux)都连进同一个虚拟内网。

这个需求实际上就是自建一个 多端 VPN 集中网关,类似于「自己搭建的 Zerotier / Tailscale / OpenVPN 服务器」。


🧭 一句话总结方案

最稳妥且易管理的方案是:

在 Ubuntu 22 上部署 WireGuard(推荐)或 OpenVPN,作为中心 VPN 服务器。
各地电脑安装相应客户端,通过该服务器组网。

WireGuard 更现代、轻量、速度快、安全强,配置简单,非常适合这种自建内网组网。


✅ 推荐方案:WireGuard 组网实现步骤

以下以 Ubuntu 22 LTS 云服务器 为例。


1. 安装 WireGuard

bash
sudo apt update sudo apt install wireguard -y

2. 生成密钥对

在服务器上执行:

bash
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key

查看生成的密钥:

bash
cat /etc/wireguard/server_private.key cat /etc/wireguard/server_public.key

3. 创建 WireGuard 配置文件

编辑 /etc/wireguard/wg0.conf:

bash
sudo nano /etc/wireguard/wg0.conf

内容如下(请修改对应 IP):

ini
[Interface] Address = 10.0.0.1/24 ListenPort = 51820 PrivateKey = <服务器的私钥>

# 启用 IP 转发
PostUp = sysctl -w net.ipv4.ip_forward=1
# 启动时开启 NAT 转发(允许客户端访问互联网)
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE



⚠️ 如果云服务器的网卡名不是 eth0,请用 ip addr 查实际网卡名替换。





4.
启动服务


bash
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0

如果没有错误,你的 VPN 服务端就已启动。




5.
添加客户端节点


每个客户端也需要生成密钥。


例如在 Windows / Linux 客户端上:


bash
wg genkey | tee client1_private.key | wg pubkey > client1_public.key

然后在服务器端 /etc/wireguard/wg0.conf 添加:


ini
[Peer]
# 客户端1
PublicKey = <client1 公钥>
AllowedIPs = 10.0.0.2/32

客户端配置 client1.conf:


ini
[Interface]
PrivateKey = <client1 私钥>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <服务器 公钥>
Endpoint = <服务器公网IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25




6.
开放防火墙端口


bash
sudo ufw allow 51820/udp
sudo ufw reload



7.
在客户端导入配置



连接后,你的电脑将获得一个虚拟内网 IP(10.0.0.x)。




8.
测试


在任何客户端执行:


bash
ping 10.0.0.1

如果能通,就成功接入虚拟内网。

不同电脑之间也能 ping 各自的 10.0.0.x
地址,形成私有局域网。




🌍 进阶拓展





























功能 方法

所有节点能互相访问
确保
AllowedIPs
中包含各节点的子网(如 10.0.0.0/24)
VPN
出口访问互联网
服务端开启
NAT
转发(上文已配置)
图形化管理
可部署 wg-easy ,自带 Web 管理界面

持久在线、自动重连
PersistentKeepalive = 25






⚙️ 可视化管理(可选)


在服务器上快速安装 wg-easy:


bash
docker run -d
--name=wg-easy
-e WG_HOST=<服务器公网IP>
-e PASSWORD=admin123
-v ~/.wg-easy:/etc/wireguard
-p 51820:51820/udp
-p 51821:51821/tcp
--cap-add NET_ADMIN
--cap-add SYS_MODULE
--sysctl
"net.ipv4.ip_forward=1"
weejewel/wg-easy

然后访问 http://<服务器IP>:51821

通过网页一键创建、下载客户端配置,超方便。





是否希望我帮你生成一个 完整自动化脚本(一键部署
WireGuard + Web 管理端 wg-easy + 客户端配置示例)?

这样你只需在云服务器执行一次脚本即可完成所有配置。













您说:







sudo wg genkey | tee
/etc/wireguard/server_private.key
| wg pubkey > /etc/wireguard/server_public.key
-bash: /etc/wireguard/server_public.key: Permission denied
tee: /etc/wireguard/server_private.key: Permission denied












ChatGPT 说:







很好 👍,你遇到的这个报错是 权限问题。

命令中 sudo 只作用于 wg genkey,但 tee 和重定向输出 (>) 并没有被提升为 root 权限,因此无法写入 /etc/wireguard/。




✅ 正确写法(两种安全做法)


方式
1:拆分成两步执行


这是最清晰、最推荐的做法:


bash
sudo wg genkey | sudo tee /etc/wireguard/server_private.key
sudo
cat /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key



方式 2:使用
sudo bash -c 一次执行


bash
sudo bash -c "wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key"


🔒 /etc/wireguard/ 是系统配置目录,只有 root 有写权限,

所以要用 sudo 让整个命令链条都在 root 下执行。





🔍 验证生成结果


执行:


bash
sudo ls -l /etc/wireguard/

你应该能看到:


diff
-rw-r--r-- 1 root root 45 Oct 30 16:35 server_private.key
-rw-r--r-- 1 root root 45 Oct 30 16:35 server_public.key

查看内容:


bash
sudo cat /etc/wireguard/server_private.key
sudo
cat /etc/wireguard/server_public.key




是否希望我直接给你一个
完整的自动化脚本(一步生成密钥 + 写入配置 + 开启 NAT
+
启动 WireGuard 服务)?

你可以直接复制粘贴执行即可部署完成。













您说:







这么做了但是ping 10.0.0.1没反应












ChatGPT 说:







非常好 👍 我们来逐步排查。

你这一步——客户端连上了但 ping 不通 10.0.0.1(服务器 VPN 内网
IP)
,说明 WireGuard 通道建立不完全。


下面是系统化排查指南(按顺序操作,不跳步),我帮你定位是哪里卡住。




🧭 目标


目标是让客户端能 ping 通服务器的 VPN 地址 10.0.0.1。

所以我们先确保三件事:




  1. WireGuard 接口 wg0 在服务端 启动正常。




  2. 客户端配置正确,且已连接。




  3. 防火墙、路由、NAT 没拦截。






✅ Step 1:查看服务端接口是否正常


在 服务器 执行:


bash
sudo wg

看输出是否类似:


yaml
interface: wg0
public key: <服务器公钥>
private key: (hidden)
listening port: 51820

peer: <client 公钥>
endpoint: <客户端公网IP>:xxxxx
allowed ips: 10.0.0.2/32
latest handshake: 5 seconds ago
transfer: 4.32 KiB received, 3.12 KiB sent


🟢 正常情况:




  • 出现 latest handshake: X seconds ago → 表示隧道已连接。




  • 如果 latest handshake: (none) → 客户端根本没连上。






✅ Step 2:检查 WireGuard 网卡是否存在


在服务端执行:


bash
ip addr show wg0

应该能看到:


sql
wg0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1420
inet
10.0.0.1/24 scope global wg0

若没有 inet 10.0.0.1/24,说明服务器配置没生效,执行:


bash
sudo systemctl restart wg-quick@wg0
sudo systemctl status wg-quick@wg0



✅ Step 3:检查客户端状态


在客户端执行:


bash
wg

正常应看到:


yaml
interface: wg0
public key: <client 公钥>
endpoint: <服务器公网IP>:51820
allowed ips: 0.0.0.0/0, ::/0
latest handshake: 10 seconds ago

如果 latest handshake 也是 (none) → 说明连接失败,请检查:




  • 服务器公网 IP 是否正确;




  • 端口 51820/UDP 是否放通;




  • 云服务商安全组(AWS / 阿里云 / 腾讯云)是否开放 UDP 51820;




  • PersistentKeepalive = 25 是否在客户端配置里。






✅ Step 4:检查防火墙 / NAT


在服务端执行:


bash
sudo ufw status

若开启了防火墙,确保:


bash
51820/udp ALLOW Anywhere

如果没看到,执行:


bash
sudo ufw allow 51820/udp
sudo ufw reload



✅ Step 5:确认 IP 转发和 NAT


确认转发是否开启:


bash
sysctl net.ipv4.ip_forward

应返回:


ini
net.ipv4.ip_forward = 1

如果不是:


bash
sudo sysctl -w net.ipv4.ip_forward=1

检查 NAT 规则(PostUp 命令):


bash
sudo iptables -t nat -L POSTROUTING -n -v

应该有一行:


kotlin
MASQUERADE all -- 10.0.0.0/24 anywhere out interface eth0

若没有,手动执行:


bash
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE


⚠️ 如果你的云服务器网卡不是 eth0,先执行 ip route 查看实际网卡名再替换。





✅ Step 6:用最小测试配置验证(排除路由问题)


服务器 /etc/wireguard/wg0.conf 保持最简单:


ini
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <服务器私钥>
PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0

[Peer]
PublicKey = <客户端公钥>
AllowedIPs = 10.0.0.2/32


客户端配置:


ini
[Interface]
Address = 10.0.0.2/24
PrivateKey = <客户端私钥>

[Peer]
PublicKey = <服务器公钥>
Endpoint = <服务器公网IP>:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25


然后:


bash
sudo systemctl restart wg-quick@wg0
wg-quick down wg0 && wg-quick up wg0
# 客户端
ping 10.0.0.1

如果此时能 ping 通,就说明 NAT 或出口流量配置问题;

如果依旧不通 → 隧道层面没通,重点检查 handshake。




✅ Step 7:如仍不通,导出调试日志


服务端查看:


bash
sudo journalctl -u wg-quick@wg0 -n 50 --no-pager

客户端查看:


bash
sudo wg show
sudo dmesg | grep wg




如果你愿意,我可以帮你生成一个「调试版配置文件对」,带详细日志与逐步检测命令。

要不要我帮你直接写出那个完整的可执行脚本(自动检测 + 修复)?



















wg set wg0 peer allowed-ips 10.0.0.3/32
服务器不停实时增加节点