非常好的目标 👍 ——你想用 Ubuntu 22 云服务器 做一个 中心网关(VPN Hub),把多个不同地域的个人电脑(Windows / macOS / Linux)都连进同一个虚拟内网。
这个需求实际上就是自建一个 多端 VPN 集中网关,类似于「自己搭建的 Zerotier / Tailscale / OpenVPN 服务器」。
最稳妥且易管理的方案是:
在 Ubuntu 22 上部署 WireGuard(推荐)或 OpenVPN,作为中心 VPN 服务器。
各地电脑安装相应客户端,通过该服务器组网。
WireGuard 更现代、轻量、速度快、安全强,配置简单,非常适合这种自建内网组网。
以下以 Ubuntu 22 LTS 云服务器 为例。
bashsudo apt update sudo apt install wireguard -y
在服务器上执行:
bashwg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
查看生成的密钥:
bashcat /etc/wireguard/server_private.key
cat /etc/wireguard/server_public.key
编辑 /etc/wireguard/wg0.conf:
bashsudo 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查实际网卡名替换。
bashsudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0
如果没有错误,你的 VPN 服务端就已启动。
每个客户端也需要生成密钥。
例如在 Windows / Linux 客户端上:
bashwg 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
bashsudo ufw allow 51820/udp sudo ufw reload
Windows:安装 WireGuard 官方客户端
→ “添加隧道” → 导入 client1.conf
macOS / Linux / Android / iOS 同理
连接后,你的电脑将获得一个虚拟内网 IP(10.0.0.x)。
在任何客户端执行:
bashping 10.0.0.1
如果能通,就成功接入虚拟内网。
不同电脑之间也能 ping 各自的 10.0.0.x
地址,形成私有局域网。
| 功能 | 方法 |
|---|---|
| 所有节点能互相访问 | 确保
AllowedIPs
中包含各节点的子网(如 10.0.0.0/24) |
| VPN 出口访问互联网 | 服务端开启 NAT 转发(上文已配置) |
| 图形化管理 | 可部署 wg-easy ,自带 Web 管理界面 |
| 持久在线、自动重连 | PersistentKeepalive = 25 |
在服务器上快速安装 wg-easy:
bashdocker 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 和重定向输出 (>) 并没有被提升为 root 权限,因此无法写入 /etc/wireguard/。
这是最清晰、最推荐的做法:
bashsudo 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
sudo bash -c 一次执行bashsudo bash -c "wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key"
🔒
/etc/wireguard/是系统配置目录,只有 root 有写权限,
所以要用sudo让整个命令链条都在 root 下执行。
执行:
bashsudo 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
查看内容:
bashsudo cat /etc/wireguard/server_private.key
sudo cat /etc/wireguard/server_public.key
是否希望我直接给你一个
完整的自动化脚本(一步生成密钥 + 写入配置 + 开启 NAT
+
启动 WireGuard 服务)?
你可以直接复制粘贴执行即可部署完成。
非常好 👍 我们来逐步排查。
你这一步——客户端连上了但 ping 不通 10.0.0.1(服务器 VPN 内网
IP),说明 WireGuard 通道建立不完全。
下面是系统化排查指南(按顺序操作,不跳步),我帮你定位是哪里卡住。
目标是让客户端能 ping 通服务器的 VPN 地址 10.0.0.1。
所以我们先确保三件事:
WireGuard 接口 wg0 在服务端 启动正常。
客户端配置正确,且已连接。
防火墙、路由、NAT 没拦截。
在 服务器 执行:
bashsudo wg
看输出是否类似:
yamlinterface: 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) → 客户端根本没连上。
在服务端执行:
baship addr show wg0
应该能看到:
sqlwg0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1420
inet 10.0.0.1/24 scope global wg0
若没有 inet 10.0.0.1/24,说明服务器配置没生效,执行:
bashsudo systemctl restart wg-quick@wg0 sudo systemctl status wg-quick@wg0
在客户端执行:
bashwg
正常应看到:
yamlinterface: 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 是否在客户端配置里。
在服务端执行:
bashsudo ufw status
若开启了防火墙,确保:
bash51820/udp ALLOW Anywhere
如果没看到,执行:
bashsudo ufw allow 51820/udp sudo ufw reload
确认转发是否开启:
bashsysctl net.ipv4.ip_forward
应返回:
ininet.ipv4.ip_forward = 1
如果不是:
bashsudo sysctl -w net.ipv4.ip_forward=1
检查 NAT 规则(PostUp 命令):
bashsudo iptables -t nat -L POSTROUTING -n -v
应该有一行:
kotlinMASQUERADE all -- 10.0.0.0/24 anywhere out interface eth0
若没有,手动执行:
bashsudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
⚠️ 如果你的云服务器网卡不是
eth0,先执行ip route查看实际网卡名再替换。
服务器 /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
然后:
bashsudo systemctl restart wg-quick@wg0
wg-quick down wg0 && wg-quick up wg0 # 客户端
ping 10.0.0.1
如果此时能 ping 通,就说明 NAT 或出口流量配置问题;
如果依旧不通 → 隧道层面没通,重点检查 handshake。
服务端查看:
bashsudo journalctl -u wg-quick@wg0 -n 50 --no-pager
客户端查看:
bashsudo wg show sudo dmesg | grep wg
如果你愿意,我可以帮你生成一个「调试版配置文件对」,带详细日志与逐步检测命令。
要不要我帮你直接写出那个完整的可执行脚本(自动检测 + 修复)?
This utility simply downloads, verifies, and executes one of the below MSIs: