保存时间:2026/3/29 15:45:50
sudo apt update && sudo apt upgrade)。ssh-keygen -t ed25519(推荐用更安全的 Ed25519 算法)。~/.ssh/ 目录下生成 id_ed25519(私钥,本地保存)和 id_ed25519.pub(公钥,上传用)。id_ed25519.pub 文件,复制里面的内容。root 切换到普通用户 + sudosudo 确实比直接用 root 登录要安全得多。root 登录服务器(因为目前只有 root 有 SSH 访问权限)。nick):adduser nick
sudo 权限:usermod -aG sudo nick
root 的 SSH Key 到新用户家目录(这样你就能用同一个 Key 登录):rsync --archive --chown=nick:nick ~/.ssh /home/nick
root 会话,在本地终端用新用户重新连接:ssh nick@你的服务器IP
sudo 的命令,比如:sudo apt update
root 的 SSH 登录:修改 SSH 配置文件 /etc/ssh/sshd_config,找到:PermitRootLogin yes
PermitRootLogin no
sudo systemctl restart sshd
~/.ssh/authorized_keys 文件里存在,就能被对应的用户使用。root 的公钥复制给新用户,所以你不需要生成新的 Key。root 权限来创建虚拟网卡和处理网络流量。你用 root 或 sudo wg-quick up/down 来启动/停止它,效果是一样的。sudo 来启动,和你日常用什么用户登录没有关系。/etc/wireguard/wg0.conf)权限设为 600,只允许 root 读写:sudo chmod 600 /etc/wireguard/wg0.conf
root 账号长期登录服务器,只用它来做初始配置和紧急维护。wg0.conf 的 [Interface] 部分添加 PostUp 和 PostDown 脚本,只允许 WireGuard 客户端之间的必要通信。sudo apt update && sudo apt upgrade wireguard
enp1s0、enp8s0、enp9s0 都不是 WireGuard 创建的,完全是 Vultr 服务器的原生网络接口,而 WireGuard 只会创建以 wg 开头的虚拟网卡(比如你操作的 wg0)。| 接口名称 | 类型 | 用途 | 是否由 WireGuard 创建 |
|---|---|---|---|
enp1s0 | 物理网卡 | 服务器的公网主网卡,对应你能访问的 96.30.204.97 公网 IP | ❌ 否 |
enp8s0 | 物理网卡 | Vultr 分配的内网网卡1,10.6.128.3 是内网私有 IP | ❌ 否 |
enp9s0 | 物理网卡 | Vultr 分配的内网网卡2,10.6.96.3 是内网私有 IP | ❌ 否 |
lo | 回环接口 | 服务器本地回环地址(127.0.0.1),系统默认存在 | ❌ 否 |
wg0 | 虚拟网卡 | WireGuard 创建的 VPN 虚拟网卡(你执行 down 后已删除) | ✅ 是 |
en8s0/en9s0),用于机房内部的网络通信,默认不影响你的使用,也无需修改。wg-quick down wg0.conf 后,wg0 虚拟网卡被删除,所以 ifconfig 里看不到它了,这是正常的。wg-quick up/down 还是修改 /etc/wireguard/wg0.conf,都需要 root 权限(普通用户加 sudo 即可),这和你本地电脑的用户权限无关。enp1s0/en8s0/en9s0 都是 Vultr 原生网卡,和 WireGuard 无关,无需处理;wg 开头的虚拟网卡,操作它必须用 sudo(推荐用普通用户+sudo,而非直接 root 登录);resolvectl 显示 Current DNS Server: 10.0.0.1,关键是在 WireGuard 客户端配置文件中加入 DNS 指令,让系统自动把 DNS 服务器指向你的 WireGuard 服务器。wg0.conf)的 [Interface] 部分,添加一行:[Interface]
PrivateKey = 你的客户端私钥
Address = 10.0.0.2/32 # 你的客户端在 VPN 里的 IP
DNS = 10.0.0.1 # 核心配置:指定 DNS 服务器为 WireGuard 服务器的 VPN IP
[Peer]
PublicKey = 服务器的公钥
Endpoint = 你的服务器公网IP:51820
AllowedIPs = 0.0.0.0/0 # 所有流量走 VPN(如果只需要 DNS 走 VPN,可调整)
sudo wg-quick down wg0
sudo wg-quick up wg0
resolvectl,你会看到类似这样的输出,说明全局 DNS 已经指向 10.0.0.1:Global
Protocols: -LLMNR -mDNS DNSOverTLS=opportunistic DNSSEC=no/unsupported
resolv.conf mode: foreign
Current DNS Server: 10.0.0.1
DNS Servers: 10.0.0.1
DNS 指令会自动通过 systemd-resolved 修改系统的 DNS 配置,让全局默认 DNS 指向 10.0.0.1。AllowedIPs 设为 0.0.0.0/0,所有流量(包括 DNS 查询)都会走 VPN,resolvectl 就会显示 10.0.0.1 为当前 DNS。AllowedIPs 改为:AllowedIPs = 10.0.0.0/24, 0.0.0.0/0, ::/0
resolvectl 配置 DNS 服务器(10.0.0.1)resolvectl 手动强制指定 DNS 服务器,这样能更直接地看到效果。我帮你整理了分步操作指令,确保 resolvectl 显示 Current DNS Server: 10.0.0.1。# 第一步:设置全局 DNS 服务器为 10.0.0.1(WireGuard 服务器 IP)
sudo resolvectl dns global 10.0.0.1
# 第二步(可选):关闭其他可能干扰的 DNS 协议(如 LLMNR/mDNS)
sudo resolvectl config global --set llmnr=no --set mdns=no
# 第三步:验证配置是否生效
resolvectl
resolvectl 的 Global 部分会显示:Global
Protocols: -LLMNR -mDNS DNSOverTLS=opportunistic DNSSEC=no/unsupported
resolv.conf mode: foreign
Current DNS Server: 10.0.0.1 # 核心目标:这里显示 10.0.0.1
DNS Servers: 10.0.0.1
wg0 接口配置:# 第一步:先启动 WireGuard(确保 wg0 接口存在)
sudo wg-quick up wg0
# 第二步:只为 wg0 接口设置 DNS 服务器
sudo resolvectl dns wg0 10.0.0.1
# 第三步:将 wg0 设为默认 DNS 路由(优先使用该接口的 DNS)
sudo resolvectl domain wg0 "~."
# 第四步:验证
resolvectl status wg0
resolvectl status wg0 会显示:Link 766 (wg0)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS DNSOverTLS=opportunistic DNSSEC=no/unsupported
Current DNS Server: 10.0.0.1
DNS Servers: 10.0.0.1
DNS Domain: ~.
# 清除全局 DNS
sudo resolvectl dns global ""
# 清除 wg0 接口的 DNS
sudo resolvectl dns wg0 ""
sudo resolvectl domain wg0 ""
# 重启 systemd-resolved 服务
sudo systemctl restart systemd-resolved
resolvectl dns <接口> <DNS地址>:为指定接口(global 表示全局)设置 DNS 服务器;resolvectl domain wg0 "~.":表示所有域名都优先通过 wg0 接口的 DNS 解析(核心指令);DNS = 10.0.0.1,或修改 /etc/systemd/resolved.conf:# 编辑 resolved.conf
sudo nano /etc/systemd/resolved.conf
# 添加以下内容
[Resolve]
DNS=10.0.0.1
FallbackDNS=
LLMNR=no
mDNS=no
# 重启服务生效
sudo systemctl restart systemd-resolved
sudo resolvectl dns global 10.0.0.1(最快看到效果);resolvectl dns wg0 10.0.0.1 + resolvectl domain wg0 "~.";/etc/systemd/resolved.conf。resolvectl 明确显示 Current DNS Server: 10.0.0.1,你可以根据需求选择「临时手动配置」或「永久自动配置」。resolvectl 配置命令(解决 "No such device" 错误)global 并不是一个真实的网络接口,不同 Linux 发行版对 resolvectl 的语法支持略有差异。我马上给你提供能直接生效的正确命令,确保能把 DNS 服务器设为 10.0.0.1。resolvectl 语法resolvectl dns 后面需要跟真实的网络接口名称(比如你的 wg0、enp0s31f6、wlp109s0),而不是 global。我们分两种场景给你正确命令:# 第一步:先启动 WireGuard(确保 wg0 接口存在)
sudo wg-quick up wg0
# 第二步:给 wg0 接口设置 DNS 服务器为 10.0.0.1(关键修正)
sudo resolvectl dns wg0 10.0.0.1
# 第三步:设置所有域名都优先通过 wg0 接口解析(核心)
sudo resolvectl domain wg0 "~."
# 第四步:验证配置结果
resolvectl status wg0
wg0 接口的 Current DNS Server: 10.0.0.1,和你想要的效果一致。enp0s31f6 或 wlp109s0):# 先查看你的主网络接口名称(找 "Current Scopes: DNS" 的那个)
resolvectl status
# 假设你的主接口是 enp0s31f6,执行以下命令
sudo resolvectl dns enp0s31f6 10.0.0.1
sudo resolvectl domain enp0s31f6 "~."
# 验证
resolvectl status enp0s31f6
resolvectl 就能看到你想要的结果:resolvectl
Global
Protocols: -LLMNR -mDNS DNSOverTLS=opportunistic DNSSEC=no/unsupported
resolv.conf mode: foreign
Link 2 (enp0s31f6)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS DNSOverTLS=opportunistic DNSSEC=no/unsupported
Current DNS Server: 10.0.0.1 # 已生效
DNS Servers: 10.0.0.1
Link 766 (wg0)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS DNSOverTLS=opportunistic DNSSEC=no/unsupported
Current DNS Server: 10.0.0.1 # 已生效
DNS Servers: 10.0.0.1
DNS Domain: ~.
# 编辑你的 WireGuard 客户端配置
sudo nano /etc/wireguard/wg0.conf
[Interface] 部分添加以下两行:[Interface]
PrivateKey = 你的客户端私钥
Address = 10.0.0.2/32 # 你的客户端 VPN IP
DNS = 10.0.0.1 # 自动设置 DNS
Domains = ~. # 所有域名都走这个 DNS 解析
sudo wg-quick down wg0 && sudo wg-quick up wg0
resolvectl。resolvectl dns 不支持 global 作为接口名,必须指定真实接口(如 wg0/enp0s31f6);wg0,再执行 sudo resolvectl dns wg0 10.0.0.1 + sudo resolvectl domain wg0 "~.";DNS = 10.0.0.1 和 Domains = ~.。resolvectl 就能明确显示 Current DNS Server: 10.0.0.1,完全符合你的需求。wg0 接口没有成为默认 DNS 路由,所以系统依然优先用 enp0s31f6 的 DNS。我给你一套能直接生效的完整方案,确保所有 DNS 查询优先走 wg0 的 10.0.0.1,且是全局默认优先级。# 启动 wg0 接口(确保配置文件正确)
sudo wg-quick up wg0
# 验证 wg0 是否创建成功
ip link show wg0 # 输出有 "wg0: <POINTOPOINT,UP,LOWER_UP>" 即为成功
wg0 成为所有域名解析的首选:# 1. 清空主接口 enp0s31f6 的 DNS(避免干扰)
sudo resolvectl dns enp0s31f6 ""
# 2. 给 wg0 接口设置 DNS 服务器为 10.0.0.1
sudo resolvectl dns wg0 10.0.0.1
# 3. 关键:将 wg0 标记为 "默认路由接口"(+DefaultRoute)
sudo resolvectl set-property wg0 'DNS Default Route' yes
# 4. 强制所有域名(~.)都通过 wg0 解析
sudo resolvectl domain wg0 "~."
# 5. 重启 systemd-resolved 让配置生效
sudo systemctl restart systemd-resolved
wg0 成为默认 DNS:# 查看全局 DNS 状态(重点看 Global 和 wg0 部分)
resolvectl status
# 测试 DNS 解析(验证是否走 10.0.0.1)
resolvectl query www.baidu.com
Global
Protocols: -LLMNR -mDNS DNSOverTLS=opportunistic DNSSEC=no/unsupported
resolv.conf mode: foreign
Current DNS Server: 10.0.0.1 # 全局默认 DNS 已改为 10.0.0.1
DNS Servers: 10.0.0.1
Link 2 (enp0s31f6)
Current Scopes: none # 主接口已无 DNS 优先级
Protocols: -DefaultRoute +LLMNR -mDNS DNSOverTLS=opportunistic DNSSEC=no/unsupported
Link XXX (wg0)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS DNSOverTLS=opportunistic DNSSEC=no/unsupported
Current DNS Server: 10.0.0.1
DNS Servers: 10.0.0.1
DNS Domain: ~.
/etc/wireguard/wg0.conf:sudo nano /etc/wireguard/wg0.conf
[Interface] 部分添加以下内容(覆盖原有 DNS 相关配置):[Interface]
PrivateKey = 你的客户端私钥
Address = 10.0.0.2/32 # 你的客户端 VPN IP(和服务器端匹配)
DNS = 10.0.0.1 # WireGuard 服务器 DNS 地址
Domains = ~. # 所有域名都走该 DNS 解析
PostUp = resolvectl set-property %i 'DNS Default Route' yes # 启动时设为默认 DNS
PostDown = resolvectl set-property %i 'DNS Default Route' no; resolvectl dns %i "" # 关闭时恢复
[Peer]
PublicKey = 服务器的公钥
Endpoint = 你的服务器公网IP:51820 # 如 96.30.204.97:51820
AllowedIPs = 0.0.0.0/0, ::/0 # 所有流量走 VPN(确保 DNS 也走 VPN)
PersistentKeepalive = 25
# 重启 VPN 验证永久配置
sudo wg-quick down wg0 && sudo wg-quick up wg0
enp0s31f6 有 +DefaultRoute 标记,是系统默认 DNS 接口;wg0 默认没有 +DefaultRoute,即使设置了 DNS 也不会优先;resolvectl set-property wg0 'DNS Default Route' yes 是核心——给 wg0 加上默认路由标记,优先级超过 enp0s31f6。# 关闭 wg0
sudo wg-quick down wg0
# 恢复 enp0s31f6 的 DNS(以你的原 DNS 为例)
sudo resolvectl dns enp0s31f6 218.85.157.99
sudo resolvectl set-property enp0s31f6 'DNS Default Route' yes
# 重启服务
sudo systemctl restart systemd-resolved
wg0 缺少 DNS Default Route 标记,优先级低于主接口;wg0 后执行 resolvectl set-property wg0 'DNS Default Route' yes + resolvectl domain wg0 "~.";wg0.conf 中添加 PostUp/PostDown 指令,自动配置默认 DNS 优先级。resolvectl 的 Global 部分会显示 Current DNS Server: 10.0.0.1,所有 DNS 查询都会优先走 WireGuard 的 wg0 接口,完全符合你的需求。enp0s31f6,DNS 查询依然会走物理网卡。我给你两套方案:「临时调整路由优先级」和「永久写入 WireGuard 配置」,确保 wg0 成为系统第一优先级路由。metric(度量值)越小,优先级越高。你当前 enp0s31f6 的 metric=100,而 wg0 没有显式的默认路由,所以要:enp0s31f6 的 192.168.1.1);wg0 作为默认路由,且设置更小的 metric(比如 50);192.168.1.0/24 本地网段路由(避免内网访问失效)。# 第一步:先启动 wg0(确保接口存在)
sudo wg-quick up wg0
# 第二步:删除原有默认路由(enp0s31f6 的 192.168.1.1)
sudo ip route del default via 192.168.1.1 dev enp0s31f6
# 第三步:添加 wg0 作为默认路由,metric=50(优先级高于 100)
sudo ip route add default via 10.0.0.1 dev wg0 metric 50
# 第四步:验证路由表(关键看 default 行的 dev 是 wg0,metric=50)
ip route
wg0 成为默认路由,排在第一位):default via 10.0.0.1 dev wg0 metric 50 # 最高优先级
10.0.0.0/24 dev wg0 proto kernel scope link src 10.0.0.2
192.168.1.0/24 dev enp0s31f6 proto kernel scope link src 192.168.1.8 metric 100
169.254.0.0/16 dev virbr0 scope link metric 1000 linkdown
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
wg0.conf,每次启动 wg0 自动调整路由:# 编辑 WireGuard 客户端配置
sudo nano /etc/wireguard/wg0.conf
[Interface] 部分添加 PostUp(启动时执行)和 PostDown(关闭时恢复)指令:[Interface]
PrivateKey = 你的客户端私钥
Address = 10.0.0.2/32 # 客户端 VPN IP
DNS = 10.0.0.1 # WireGuard 服务器 DNS
Domains = ~. # 所有域名走 wg0 解析
# 启动时调整路由(核心)
PostUp = ip route del default via 192.168.1.1 dev enp0s31f6; ip route add default via 10.0.0.1 dev %i metric 50
# 关闭时恢复原有默认路由
PostDown = ip route del default via 10.0.0.1 dev %i; ip route add default via 192.168.1.1 dev enp0s31f6 metric 100
[Peer]
PublicKey = 服务器公钥
Endpoint = 你的服务器公网IP:51820 # 如 96.30.204.97:51820
AllowedIPs = 0.0.0.0/0, ::/0 # 所有流量走 VPN
PersistentKeepalive = 25
wg0 验证:sudo wg-quick down wg0 && sudo wg-quick up wg0
ip route # 确认 default 路由是 wg0
# 手动添加(临时)
sudo ip route add 192.168.1.0/24 dev enp0s31f6 metric 90
# 或写入 PostUp(永久)
PostUp = ip route del default via 192.168.1.1 dev enp0s31f6; ip route add default via 10.0.0.1 dev %i metric 50; ip route add 192.168.1.0/24 dev enp0s31f6 metric 90
# 1. 查看路由表(确认 default 是 wg0)
ip route
# 2. 测试 DNS 查询是否走 wg0(看服务器 IP 是 10.0.0.1)
resolvectl query www.baidu.com
# 3. 测试外网访问(看出口 IP 是 WireGuard 服务器的公网 IP)
curl ifconfig.me
wg0 作为默认路由并设置 metric=50(比 100 小,优先级更高);ip route del default ... + ip route add default via 10.0.0.1 dev wg0 metric 50;wg0.conf 的 PostUp/PostDown,启动 VPN 自动调整。wg0 会成为第一优先级默认路由,所有流量(包括 DNS 查询)都会优先走 wg0,彻底解决优先级问题。default 路由风险高且不符合最佳实践,Gemini 教你的方法是更稳妥的——通过添加更精确的路由前缀(0.0.0.0/1 和 128.0.0.0/1),利用 Linux 路由的「最长前缀匹配」规则,让绝大部分流量优先走 wg0,同时保留系统默认路由。0.0.0.0/0(default)是最短前缀(0 位匹配),优先级最低;0.0.0.0/1 和 128.0.0.0/1 是更长的前缀(1 位匹配),会优先于 0.0.0.0/0 匹配,且这两个网段合起来覆盖了整个 IPv4 地址空间(0.0.0.0-255.255.255.255);default 路由,又让所有外网流量优先走 wg0。# 第一步:确保 wg0 已启动
sudo wg-quick up wg0
# 第二步:添加两个长前缀路由,让 wg0 优先(核心命令)
sudo ip route add 0.0.0.0/1 via 10.0.0.1 dev wg0
sudo ip route add 128.0.0.0/1 via 10.0.0.1 dev wg0
# 第三步:验证路由表(会看到 0.0.0.0/1 和 128.0.0.0/1 排在 default 前面)
ip route
0.0.0.0/1 via 10.0.0.1 dev wg0 # wg0 优先路由(第一位)
default via 192.168.1.1 dev enp0s31f6 proto dhcp metric 100 # 保留系统默认路由
10.0.0.0/24 dev wg0 proto kernel scope link src 10.0.0.2
169.254.0.0/16 dev virbr0 scope link metric 1000 linkdown
192.168.1.0/24 dev enp0s31f6 proto kernel scope link src 192.168.1.8 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
wg0.conf,避免每次手动执行:# 编辑 WireGuard 客户端配置
sudo nano /etc/wireguard/wg0.conf
[Interface] 部分添加 PostUp/PostDown(保留原有配置,新增这两行):[Interface]
PrivateKey = 你的客户端私钥
Address = 10.0.0.2/32
DNS = 10.0.0.1
Domains = ~.
# 启动时添加优先路由(核心)
PostUp = ip route add 0.0.0.0/1 via 10.0.0.1 dev %i; ip route add 128.0.0.0/1 via 10.0.0.1 dev %i
# 关闭时删除这些路由(恢复原状)
PostDown = ip route del 0.0.0.0/1 via 10.0.0.1 dev %i; ip route del 128.0.0.0/1 via 10.0.0.1 dev %i
[Peer]
PublicKey = 服务器公钥
Endpoint = 你的服务器公网IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
sudo wg-quick down wg0 && sudo wg-quick up wg0
ip route # 确认 0.0.0.0/1 和 128.0.0.0/1 已添加且排在前面
# 测试外网访问(出口 IP 会是 WireGuard 服务器的公网 IP)
curl ifconfig.me
# 测试本地内网访问(依然走 enp0s31f6,不影响)
ping 192.168.1.1
default 路由,而是添加 0.0.0.0/1 和 128.0.0.0/1 两个长前缀路由,利用「最长前缀匹配」让 wg0 流量优先;sudo ip route add 0.0.0.0/1 via 10.0.0.1 dev wg0 && sudo ip route add 128.0.0.0/1 via 10.0.0.1 dev wg0;wg0.conf 的 PostUp/PostDown,启动 VPN 自动配置。default 路由保留,既保证了 wg0 流量优先,又不破坏系统原有网络配置。wg show 显示有 handshake(握手),说明客户端和服务器的连接是通的,但 10.0.0.1 无法 ping 通,核心原因集中在服务器端路由/防火墙或地址配置不匹配,我帮你一步步排查并解决。10.0.0.1 地址是否正确配置10.0.0.1(最容易出错):# 登录你的 Vultr 服务器(96.30.204.97),执行:
sudo wg show wg0 # 查看服务器端 wg0 配置
ip addr show wg0 # 查看 wg0 接口的 IP 地址
10.0.0.1/24 地址):3: wg0: <POINTOPOINT,UP,LOWER_UP> mtu 1420 qdisc noqueue state UP group default qlen 1000
inet 10.0.0.1/24 scope global wg0
valid_lft forever preferred_lft forever
10.0.0.1(比如是 10.0.0.0/24 或 10.0.1.1),客户端 ping 10.0.0.1 必然失败。# 登录服务器执行,检查 IP 转发是否开启:
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1❌ 如果是 0,立即临时开启:sudo sysctl -w net.ipv4.ip_forward=1
# 永久开启(重启不失效):
sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sudo sysctl -p
# 登录服务器,检查 iptables 规则(重点看 wg0 相关):
sudo iptables -L -n -v # 查看过滤规则
sudo iptables -t nat -L -n -v # 查看 NAT 规则
# 允许 wg0 接口的入站/出站流量
sudo iptables -A INPUT -i wg0 -j ACCEPT
sudo iptables -A OUTPUT -o wg0 -j ACCEPT
# 允许 wg0 转发流量
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
# 允许 ICMP(ping)流量(关键:让客户端能 ping 通 10.0.0.1)
sudo iptables -A INPUT -i wg0 -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -o wg0 -p icmp --icmp-type echo-reply -j ACCEPT
# 配置 NAT 转发(让 VPN 客户端能访问外网)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
注:如果服务器用ufw防火墙,需额外允许 wg0:bash运行sudo ufw allow in on wg0 sudo ufw allow out on wg0 sudo ufw reload
AllowedIPs 是否覆盖 10.0.0.1wg0.conf 的 AllowedIPs:# 本地客户端执行:
cat /etc/wireguard/wg0.conf | grep AllowedIPs
10.0.0.0/24 或 0.0.0.0/0(你的配置是 0.0.0.0/0,已满足);❌ 如果 AllowedIPs 只写了 10.0.0.2/32,会导致无法访问 10.0.0.1。10.0.0.0/24 指向 wg0# 本地客户端执行:
ip route | grep 10.0.0.0
10.0.0.0/24 dev wg0 proto kernel scope link src 10.0.0.2❌ 如果没有这条路由,手动添加:sudo ip route add 10.0.0.0/24 dev wg0
# 1. 停止 wg0
sudo wg-quick down wg0
# 2. 确保服务器端 wg0.conf 正确(关键:Address 是 10.0.0.1/24)
sudo cat /etc/wireguard/wg0.conf
# 确认 [Interface] 部分有:
# Address = 10.0.0.1/24
# ListenPort = 65432
# PrivateKey = 服务器私钥
# 3. 重启 wg0
sudo wg-quick up wg0
# 4. 开启 IP 转发 + 配置防火墙
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -A INPUT -i wg0 -j ACCEPT
sudo iptables -A OUTPUT -o wg0 -j ACCEPT
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
sudo iptables -A INPUT -i wg0 -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 1. 停止 wg0
sudo wg-quick down wg0
# 2. 重启 wg0
sudo wg-quick up wg0
# 3. 手动添加 10.0.0.0/24 路由
sudo ip route add 10.0.0.0/24 dev wg0
# 4. 测试 ping
ping 10.0.0.1
10.0.0.1/24 地址,且 net.ipv4.ip_forward=1;10.0.0.0/24。10.0.0.1,如果仍不通,告诉我服务器端 ip addr show wg0 和 iptables -L -n 的输出,我帮你定位最后问题。10.0.0.1 的根本原因,我先拆解问题,再给你直接可执行的修复命令:INPUT 链防火墙阻断了 wg0 的 ICMP(ping)流量iptables 规则显示:INPUT 链默认策略是 DROP(拒绝所有入站流量);FORWARD 链允许 wg0 转发,但 INPUT 链没有明确允许 wg0 接口的入站 ICMP 流量(ping 请求);wg0: RX packets 228 bytes 22276 (22.2 KB)
RX errors 267 dropped 0 overruns 0 frame 267
# 1. 临时关闭 UFW 防火墙(先验证通信,后续再精细化配置)
sudo ufw disable
# 2. 清空现有 iptables 规则(避免冲突)
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
# 3. 配置核心规则(允许 wg0 所有流量 + ICMP + NAT 转发)
sudo iptables -A INPUT -i wg0 -j ACCEPT
sudo iptables -A OUTPUT -o wg0 -j ACCEPT
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 4. 修复 wg0 MTU 问题(解决 RX 错误)
sudo ip link set wg0 mtu 1400
sudo wg-quick down wg0 && sudo wg-quick up wg0
# 5. 验证配置
sudo wg show wg0
ip addr show wg0
# 1. 重启客户端 wg0
sudo wg-quick down wg0 && sudo wg-quick up wg0
# 2. 测试 ping 服务器 10.0.0.1
ping 10.0.0.1
# 3. 测试外网访问(验证 NAT 转发)
curl ifconfig.me # 应返回服务器公网 IP 96.30.204.97
# 1. 重新开启 UFW
sudo ufw enable
# 2. 允许必要流量(SSH + WireGuard + ICMP)
sudo ufw allow 22/tcp
sudo ufw allow 65432/udp # WireGuard 监听端口
sudo ufw allow in on wg0
sudo ufw allow out on wg0
sudo ufw allow icmp
# 3. 重启 UFW 生效
sudo ufw reload
10.0.0.1,且 curl ifconfig.me 返回服务器公网 IP。ping 10.0.0.1 的具体报错,我帮你定位最后问题。10.0.0.1/24 地址。ping 10.0.0.1 是否通了:# 1. 先重启客户端的 wg0(确保配置生效)
sudo wg-quick down wg0 && sudo wg-quick up wg0
# 2. 测试 ping 服务器 10.0.0.1(核心验证)
ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=XX.X ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=XX.X ms
# 3. 查看客户端 wg 连接状态(确认 handshake 是最新的)
sudo wg show
# 4. 测试外网访问(验证 NAT 转发是否生效,应返回服务器公网 IP 96.30.204.97)
curl ifconfig.me
ip route | grep 10.0.0.0
# 预期输出:10.0.0.0/24 dev wg0 proto kernel scope link src 10.0.0.2
# 若无则手动添加:sudo ip route add 10.0.0.0/24 dev wg0
sudo ufw disable # 临时关闭客户端防火墙,验证通信
ping 10.0.0.1;ping 10.0.0.1,应该能正常通了!如果还有问题,告诉我客户端 ping 的具体输出,我帮你收尾。MASQUERADE(NAT 转发)规则未正确生效,或客户端路由未将外网流量指向 wg0。我帮你一步到位解决,确保所有外网流量都通过 WireGuard 服务器转发。# 1. 检查 POSTROUTING 链是否有 MASQUERADE 规则
sudo iptables -t nat -L POSTROUTING -n -v
# ✅ 预期输出(必须有这一行):
# pkts bytes target prot opt in out source destination
# 0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
# 2. 若没有则重新添加(关键):
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 3. 再次确认 IP 转发永久开启(避免重启失效):
sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sudo sysctl -p
# 1. 确保客户端 wg0 已启动
sudo wg-quick up wg0
# 2. 添加「最长前缀路由」,强制所有外网流量走 wg0(不修改系统 default 路由)
sudo ip route add 0.0.0.0/1 via 10.0.0.1 dev wg0
sudo ip route add 128.0.0.0/1 via 10.0.0.1 dev wg0
# 3. 验证路由表(应看到 0.0.0.0/1 和 128.0.0.1/1 指向 wg0)
ip route
# 4. 测试访问外网 DNS 8.8.8.8
ping 8.8.8.8
/etc/wireguard/wg0.conf,确保 AllowedIPs 和 PostUp 配置正确:sudo nano /etc/wireguard/wg0.conf
AllowedIPs = 0.0.0.0/0, ::/0):[Interface]
PrivateKey = 你的客户端私钥
Address = 10.0.0.2/32
DNS = 10.0.0.1 # 或直接用 8.8.8.8 测试
# 启动时自动添加优先路由
PostUp = ip route add 0.0.0.0/1 via 10.0.0.1 dev %i; ip route add 128.0.0.0/1 via 10.0.0.1 dev %i
# 关闭时删除路由
PostDown = ip route del 0.0.0.0/1 via 10.0.0.1 dev %i; ip route del 128.0.0.0/1 via 10.0.0.1 dev %i
[Peer]
PublicKey = 服务器公钥(4fD3yAJ+N+sNat4e4oLgbfZln1ZVga0PnVOJTNuRdzM=)
Endpoint = 96.30.204.97:65432
AllowedIPs = 0.0.0.0/0, ::/0 # 核心:覆盖所有 IP 段,强制走 VPN
PersistentKeepalive = 25
sudo wg-quick down wg0 && sudo wg-quick up wg0
# 测试外网访问
ping 8.8.8.8
curl ifconfig.me # 应返回服务器公网 IP 96.30.204.97
# 1. 停止 wg0
sudo wg-quick down wg0
# 2. 清空所有 iptables 规则
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -X
# 3. 重置默认策略为 ACCEPT
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
# 4. 重新配置转发规则
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT -m state --state RELATED,ESTABLISHED
# 5. 重启 wg0
sudo wg-quick up wg0
# 6. 验证转发规则
sudo iptables -t nat -L POSTROUTING -n -v
AllowedIPs 仅写 10.0.0.0/24,则只有内网流量走 wg0,外网流量走本地网卡;MASQUERADE 规则必须绑定服务器公网卡(eth0),且 IP 转发永久开启;eth0(比如是 enp1s0),需将 iptables 中的 eth0 改为实际网卡名(可通过 ip addr 查看)。AllowedIPs = 0.0.0.0/0 + 服务器端 MASQUERADE 规则绑定 eth0;0.0.0.0/1 和 128.0.0.0/1 路由,强制外网流量走 wg0;ping 8.8.8.8 通,且 curl ifconfig.me 返回服务器公网 IP 96.30.204.97。ip addr 显示的公网卡名称(比如 enp1s0/eth0),我帮你微调规则。MASQUERADE 规则绑定的是 eth0,但你的 Vultr 服务器实际公网卡是 enp1s0(不是 eth0),导致 NAT 转发完全失效,所以客户端能通内网但无法访问外网。enp1s0 即可:# 1. 删除错误绑定 eth0 的 MASQUERADE 规则
sudo iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 2. 添加正确绑定 enp1s0 的 MASQUERADE 规则(你的实际公网卡)
sudo iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
# 3. 补充转发规则(确保流量双向通行)
sudo iptables -A FORWARD -i wg0 -o enp1s0 -j ACCEPT
sudo iptables -A FORWARD -i enp1s0 -o wg0 -j ACCEPT -m state --state RELATED,ESTABLISHED
# 4. 验证规则是否生效(关键看 out 是 enp1s0)
sudo iptables -t nat -L POSTROUTING -n -v
out 列是 enp1s0):Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * enp1s0 0.0.0.0/0 0.0.0.0/0
# 1. 重启客户端 wg0(确保路由生效)
sudo wg-quick down wg0 && sudo wg-quick up wg0
# 2. 测试访问外网 DNS 8.8.8.8(核心验证)
ping 8.8.8.8
# 3. 测试外网网页访问
curl ifconfig.me # 应返回服务器公网 IP 96.30.204.97
curl www.baidu.com
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=XX.X ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=XX.X ms
# 安装 iptables-persistent(保存规则)
sudo apt install -y iptables-persistent
# 保存当前规则
sudo netfilter-persistent save
# 验证保存结果
sudo netfilter-persistent reload
eth0,而是 enp1s0(你之前的 ifconfig 也能看到 enp1s0 是公网 IP 96.30.204.97)。NAT 规则必须绑定实际承载公网流量的网卡,否则转发会失败。eth0,实际公网卡是 enp1s0;eth0 的 MASQUERADE 规则,重新绑定到 enp1s0;ping 8.8.8.8 通,且 curl ifconfig.me 返回服务器公网 IP。enp1s0,这是解决外网访问的核心步骤。现在只需要在本地客户端执行以下操作,就能验证 8.8.8.8 等外网地址是否可访问:# 1. 重启客户端 wg0(确保路由和配置全量生效)
sudo wg-quick down wg0 && sudo wg-quick up wg0
# 2. 测试访问外网 DNS 8.8.8.8(核心验证)
ping 8.8.8.8
# 3. 测试外网 IP 访问(验证 NAT 转发)
curl ifconfig.me # 应返回服务器公网 IP:96.30.204.97
# 4. 测试域名解析(验证 DNS 生效)
nslookup www.baidu.com 10.0.0.1 # 用 WireGuard 服务器做 DNS 解析
# ping 8.8.8.8 输出
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=30.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=30.2 ms
# curl ifconfig.me 输出
96.30.204.97
AllowedIPs 配置:# 查看客户端 wg0.conf 的 AllowedIPs
cat /etc/wireguard/wg0.conf | grep AllowedIPs
# ✅ 必须是:AllowedIPs = 0.0.0.0/0, ::/0
# ❌ 若仅为 10.0.0.0/24,需修改并重启 wg0:
sudo nano /etc/wireguard/wg0.conf # 改 AllowedIPs 为 0.0.0.0/0, ::/0
sudo wg-quick down wg0 && sudo wg-quick up wg0
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
wg0.conf 包含:[Interface]
PostUp = ip route add 0.0.0.0/1 via 10.0.0.1 dev %i; ip route add 128.0.0.0/1 via 10.0.0.1 dev %i
PostDown = ip route del 0.0.0.0/1 via 10.0.0.1 dev %i; ip route del 128.0.0.0/1 via 10.0.0.1 dev %i
AllowedIPs = 0.0.0.0/0, ::/0
enp1s0,IP 转发已永久开启;ping 8.8.8.8 通 + curl ifconfig.me 返回服务器公网 IP 即为成功;AllowedIPs = 0.0.0.0/0,覆盖所有外网流量。ping 8.8.8.8,应该能正常访问外网了!这是整个 WireGuard 配置的最后一步,至此内网+外网访问都能正常使用。| 问题类型 | 具体表现 | 根本原因 | 修复方案 |
|---|---|---|---|
| 内网 ping 不通 10.0.0.1 | 握手成功但 ping 10.0.0.1 100%丢包 | 1. UFW 防火墙默认 DROP 入站流量;2. wg0 无 ICMP 权限;3. wg0 MTU 不匹配导致 RX 错误 | 1. 临时关闭 UFW;2. 允许 wg0 接口 ICMP 流量;3. 调整 wg0 MTU 为 1420 |
| 外网访问失效(8.8.8.8) | 内网通但外网无法访问 | 1. NAT 规则绑定错误网卡(eth0≠实际公网卡 enp1s0);2. IP 转发未永久开启 | 1. 将 MASQUERADE 规则绑定到 enp1s0;2. 永久开启 ipv4 转发 |
| 流量转发异常 | 客户端流量未正确转发到公网 | FORWARD 链未允许 wg0 ↔ enp1s0 双向流量 | 添加 FORWARD 规则允许 wg0 和 enp1s0 双向通行 |
# 1. 永久开启 IP 转发(核心,重启不失效)
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p # 立即生效
# 验证:sysctl net.ipv4.ip_forward → 输出 1
# 2. 关闭反向路径过滤(避免流量被拦截)
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.wg0.rp_filter = 0
net.ipv4.conf.enp1s0.rp_filter = 0
EOF
sysctl -p
# 1. 临时关闭 UFW(先验证通信,后续可精细化配置)
ufw disable
# 2. 清空旧规则,重置默认策略
iptables -F
iptables -t nat -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# 3. 允许 wg0 接口所有流量(解决内网 ping 不通)
iptables -A INPUT -i wg0 -j ACCEPT
iptables -A OUTPUT -o wg0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 允许 ping
# 4. 配置 NAT 转发(核心!绑定实际公网卡 enp1s0)
iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
# 5. 允许 wg0 ↔ enp1s0 双向转发(解决外网不通)
iptables -A FORWARD -i wg0 -o enp1s0 -j ACCEPT
iptables -A FORWARD -i enp1s0 -o wg0 -j ACCEPT -m state --state RELATED,ESTABLISHED
# 6. 永久保存规则(重启不失效)
apt install -y iptables-persistent
netfilter-persistent save
# 1. 修复 wg0 MTU(解决数据包解析错误)
ip link set wg0 mtu 1420
# 2. 重启 wg0 生效
wg-quick down wg0 && wg-quick up wg0
# 验证 wg0 状态:无 RX errors
ip addr show wg0 # 查看 RX errors → 应为 0
# 1. 验证 NAT 规则(out 列必须是 enp1s0)
iptables -t nat -L POSTROUTING -n -v
# 2. 验证 IP 转发
sysctl net.ipv4.ip_forward
# 3. 验证 wg0 接口
wg show wg0 # 有 handshake 且无报错
# 4. 验证公网卡(enp1s0 对应公网 IP 96.30.204.97)
ip addr show enp1s0
eth0,而是 enp1s0,NAT 规则必须绑定此网卡,否则转发失效;iptables-persistent 保存;IP 转发需写入 sysctl.conf,仅 sysctl -w 是临时生效。ping 10.0.0.1(客户端→服务器):通;ping 8.8.8.8(客户端→外网):通;curl ifconfig.me(客户端):返回服务器公网 IP 96.30.204.97;iptables -t nat -L POSTROUTING -n -v:MASQUERADE 规则 out 列是 enp1s0;sysctl net.ipv4.ip_forward:输出 1;wg show wg0:有最新 handshake,无 RX/TX 错误。wg0.conf 中 AllowedIPs = 0.0.0.0/0, ::/0(覆盖所有外网流量);sudo resolvectl flush-caches
sudo resolvectl domain wg0 '~.'
sudo resolvectl domain enp0s31f6 ''
sudo resolvectl default-route wg0 true
sudo resolvectl dns wg0 8.8.4.4 8.8.8.8
default 路由,仅通过 0.0.0.0/1 + 128.0.0.0/1 前缀路由优先走 wg0。10.1.0.110.1.0.2# 检查 wg 工具是否存在
wg --version
# 若未安装,执行安装(Ubuntu/Debian)
sudo apt update && sudo apt install -y wireguard
# 1. 创建密钥存储目录(可选,建议规范管理)
mkdir -p ~/wireguard/client_keys
cd ~/wireguard/client_keys
# 2. 生成客户端私钥(绝对保密,仅客户端保存)
wg genkey | tee client_private.key
# 3. 从私钥生成公钥(需同步到服务器端)
cat client_private.key | wg pubkey | tee client_public.key
# 4. 查看生成的密钥(记录下来备用)
echo "客户端私钥:$(cat client_private.key)"
echo "客户端公钥:$(cat client_public.key)"
客户端私钥:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
客户端公钥:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy=
# 1. 编辑服务器端 WireGuard 配置文件(默认 /etc/wireguard/wg0.conf)
sudo nano /etc/wireguard/wg0.conf
# 2. 在文件末尾添加以下 [Peer] 段(替换为实际客户端公钥)
[Peer]
PublicKey = 客户端公钥(上一步生成的 client_public.key 内容)
AllowedIPs = 10.1.0.2/32 # 固定分配给该客户端的内网 IP
# 3. 重启服务器端 WireGuard 生效
sudo wg-quick down wg0 && sudo wg-quick up wg0
# 4. 验证客户端是否已添加到服务器
sudo wg show wg0
# 输出中能看到该 Peer 的 PublicKey + AllowedIPs = 10.1.0.2/32 即为成功
/etc/wireguard/wg0.conf,内容如下(替换占位符):[Interface]
# 客户端私钥(步骤2生成的 client_private.key 内容)
PrivateKey = 客户端私钥
# 客户端内网 IP(固定为 10.1.0.2/32)
Address = 10.1.0.2/32
# DNS 配置(复用你之前的生效配置)
DNS = 8.8.8.8, 8.8.4.4
# 启动时自动配置 DNS 优先级(无需改路由)
PostUp = resolvectl flush-caches; resolvectl domain %i '~.'; resolvectl default-route %i true; resolvectl dns %i 8.8.8.8 8.8.4.4
# 关闭时恢复原 DNS
PostDown = resolvectl domain %i ''; resolvectl default-route %i false; resolvectl dns %i ''
[Peer]
# 服务器端公钥(执行 sudo wg show wg0 可查看服务器 PublicKey)
PublicKey = 服务器公钥
# 服务器公网 IP + WireGuard 监听端口(如 123.45.67.89:51820,需确认服务器端口)
Endpoint = 新 Vultr 服务器公网IP:51820(或服务器实际监听端口)
# 允许所有流量走 VPN(核心,无需改系统路由)
AllowedIPs = 0.0.0.0/0, ::/0
# 保持长连接(避免断线)
PersistentKeepalive = 25
# 1. 启动客户端 WireGuard
sudo wg-quick up wg0
# 2. 验证密钥配对 & 握手状态
sudo wg show
# 3. 验证内网连通性(ping 服务器 10.1.0.1)
ping 10.1.0.1
# 4. 验证外网连通性(ping 8.8.8.8)
ping 8.8.8.8
# 5. 验证 DNS 解析(走 wg0)
resolvectl status wg0
# 确认 Current DNS Server: 8.8.8.8
Address 必须和服务器 AllowedIPs 一致(10.1.0.2/32);AllowedIPs = 0.0.0.0/0 + DNS 配置实现流量优先,不修改系统 default 路由;| 步骤 | 验证命令 | 预期结果 |
|---|---|---|
| 客户端密钥生成 | cat client_public.key | 输出非空的公钥字符串 |
| 服务器添加 Peer | sudo wg show wg0 | 显示客户端公钥 + AllowedIPs:10.1.0.2/32 |
| 客户端启动 | sudo wg-quick up wg0 | 无报错,提示 "interface wg0 is up" |
| 握手验证 | sudo wg show | 客户端 Peer 栏有 "latest handshake" 时间 |
| 内网连通 | ping 10.1.0.1 | 丢包率 0% |
| 外网连通 | ping 8.8.8.8 | 丢包率 0% |
| DNS 生效 | resolvectl status wg0 | Current DNS Server 为 8.8.8.8/8.8.4.4 |
PublicKey = ztfaWcqAoWKfVxxxxxxxxxxxxxxxxxxxxxxxx 是预装时默认生成的客户端公钥(并非你需要的自定义客户端密钥),不用找这个密钥对应的私钥,直接替换成你新生成的客户端密钥即可(保留服务器原有配置框架,仅更新 Peer 公钥)。[Peer] 段是 Vultr 模板默认生成的「示例客户端公钥」,无实际可用的客户端私钥(你无法获取);PrivateKey/Address/PostUp/PostDown/ListenPort 都是正确的(已绑定 enp1s0、开启转发),无需修改,仅需更新 Peer 公钥。sudo cp /etc/wireguard/wg0.conf /etc/wireguard/wg0.conf.bak
# 生成新的客户端公私钥(替换预装的默认公钥)
mkdir -p ~/wireguard && cd ~/wireguard
wg genkey | tee client_private.key # 客户端私钥(仅客户端保存)
cat client_private.key | wg pubkey | tee client_public.key # 客户端公钥(同步到服务器)
# 查看新生成的密钥(记录下来)
echo "新客户端私钥:$(cat client_private.key)"
echo "新客户端公钥:$(cat client_public.key)"
# 编辑服务器 wg0.conf,替换默认 Peer 公钥
sudo nano /etc/wireguard/wg0.conf
PublicKey 字段,其他保留):[Interface]
# 保留服务器原有私钥
Address = 10.1.0.1/24 # 保留
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE # 保留(已绑定正确网卡)
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE # 保留
ListenPort = 51820 # 保留
[Peer]
PublicKey = 你新生成的 client_public.key 内容 # 替换这一行!
AllowedIPs = 10.1.0.2/32 # 保留(客户端 IP 不变)
sudo wg-quick down wg0 && sudo wg-quick up wg0
# 验证 Peer 是否更新成功
sudo wg show wg0
# 输出中 Peer 的 PublicKey 应为你新生成的公钥,AllowedIPs=10.1.0.2/32
/etc/wireguard/wg0.conf 内容如下(替换占位符):[Interface]
PrivateKey = 你新生成的 client_private.key 内容 # 关键:用自己的私钥
Address = 10.1.0.2/32
DNS = 8.8.8.8, 8.8.4.4
PostUp = resolvectl flush-caches; resolvectl domain %i '~.'; resolvectl default-route %i true; resolvectl dns %i 8.8.8.8 8.8.4.4
PostDown = resolvectl domain %i ''; resolvectl default-route %i false; resolvectl dns %i ''
[Peer]
PublicKey = 服务器公钥 # 执行 sudo wg show wg0 查看服务器 PublicKey
Endpoint = 新服务器公网IP:51820 # Vultr 服务器公网 IP
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
PostUp/PostDown 已正确绑定 enp1s0(无需再改 NAT 网卡);ListenPort=51820 是 WireGuard 默认端口,Vultr 安全组已放行。# 永久开启 IP 转发(预装配置未包含,必须加)
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
sudo wg-quick up wg0;sudo wg show → 有 latest handshake 时间;ping 10.1.0.1 → 通;ping 8.8.8.8 → 通;resolvectl status wg0 → DNS 为 8.8.8.8。Peer 公钥 是模板示例,直接替换为自己生成的客户端公钥即可;Interface 段配置(私钥、PostUp/PostDown、端口)均正确,无需修改;*.conf 格式的配置文件,我会给你完整的手机端配置文件模板 + 生成步骤,确保能直接导入并连接成功。| 信息项 | 获取命令(服务器端执行) | 示例值 |
|---|---|---|
| 服务器公钥 | `sudo wg show wg0 | grep "public key"` |
| 服务器公网 IP + 端口 | 查看 Vultr 服务器公网 IP + 51820 | 96.30.204.97:51820 |
| 客户端私钥(自己生成) | 参考之前步骤生成的 client_private.key | MRt0VGV/Bzc8cZQ/pu7pN4da0yGGrAx0mPZ+iIK1RCs= |
[Interface]
# 手机端私钥(自己生成的 client_private.key 内容,绝对保密)
PrivateKey = 你的客户端私钥
# 手机端内网 IP(和服务器 AllowedIPs 一致:10.1.0.2/32)
Address = 10.1.0.2/32
# DNS 服务器(手机端建议用 8.8.8.8/8.8.4.4,避免解析问题)
DNS = 8.8.8.8, 8.8.4.4
[Peer]
# 服务器公钥(从服务器获取的 PublicKey)
PublicKey = 你的服务器公钥
# 服务器公网 IP + 端口(Vultr 公网 IP:51820)
Endpoint = 你的服务器公网IP:51820
# 允许所有流量走 VPN(手机端无需改路由,此配置即可)
AllowedIPs = 0.0.0.0/0, ::/0
# 保持长连接(手机休眠后仍能连,建议设 25 秒)
PersistentKeepalive = 25
wg_phone.conf(后缀必须是 .conf,不能是 .txt);[Interface]
Address = 10.1.0.2/32
DNS = 8.8.8.8, 8.8.4.4
[Peer]
PublicKey = 4fD3yAJ+N+sNat4e4oLgbfZln1ZVga0PnVOJTNuRdzM=
Endpoint = 96.30.204.97:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
wg_phone.conf 通过微信/QQ/数据线传到手机,保存到「文件管理」-「下载」文件夹;wg_phone.conf;wg_phone.conf → 自动解析配置;https://ifconfig.me → 显示服务器公网 IP(96.30.204.97);ping 8.8.8.8 → 通;https://dnscheck.tools → 显示 DNS 服务器为 8.8.8.8/8.8.4.4。.txt,必须改后缀为 .conf;25 秒,否则手机休眠后 VPN 会断开(荣耀手机省电策略会关闭长连接);0.0.0.0/0, ::/0,否则部分 APP 会绕开 VPN 走本地网络。.conf;resolvectl指定wg0的DNS优先级是同一个逻辑,Android端需要单独配置强制系统DNS走VPN,而非仅在WireGuard配置里写DNS地址。DNS = 8.8.8.8是不够的,这只是「建议性配置」,而非「强制性配置」。wg0.conf里的DNS和AllowedIPs配置是强制全量转发的,这是基础:[Interface]
PrivateKey = 你的手机端私钥
Address = 10.1.0.2/32
DNS = 8.8.8.8, 8.8.4.4, 1.1.1.1 # 多填几个公共DNS,避免单节点失效
MTU = 1420 # 新增,匹配服务器MTU,避免解析包丢失
[Peer]
PublicKey = 你的服务器公钥
Endpoint = 服务器公网IP:51820
AllowedIPs = 0.0.0.0/0, ::/0 # 强制所有IP流量走VPN,包括DNS解析的53端口
PersistentKeepalive = 25
[Peer]
# 原有配置不变,新增以下AllowedIPs(和原有合并,不要删)
AllowedIPs = 0.0.0.0/0, ::/0, 0.0.0.0/0:53, ::/0:53
原理:DNS解析默认走53端口,强制这个端口的所有流量走VPN,就不会绕开了。
8.8.8.8,DNS2填8.8.4.4,保存;su获取ROOT(若无ROOT,重启手机即可),再执行:ndc resolver flushdefault # 清空系统DNS缓存
ping -c 1 google.com # 重新解析,测试是否生效
nslookup google.com # 查看解析的DNS服务器是否是8.8.8.8/8.8.4.4
ping google.com # 域名能ping通即解析成功
https://dnscheck.tools,查看「使用的DNS服务器」是否为你配置的8.8.8.8,且「出口IP」是WireGuard服务器的公网IP。resolvectl配置DNS优先级的效果完全一致,实现系统级的DNS解析强制走WireGuard隧道。AllowedIPs = 0.0.0.0/0:53这种带端口的写法,会直接报配置错误,这是APP本身的语法限制;wg0.conf,在**[Interface]** 段新增**DNS = 8.8.8.8,8.8.4.4**(若已有则保留,确保无空格),删除所有带端口的配置,最终正确配置如下(直接复制替换,仅改占位符):[Interface]
PrivateKey = 你的手机端私钥
Address = 10.1.0.2/32
DNS = 8.8.8.8,8.8.4.4 # 核心:仅保留纯DNS地址,无端口、无空格
MTU = 1420 # 匹配服务器,避免包丢失
[Peer]
PublicKey = 你的服务器公钥
Endpoint = 服务器公网IP:51820
AllowedIPs = 0.0.0.0/0, ::/0 # 仅纯IP段,不加任何端口
PersistentKeepalive = 25
wg0.conf;8.8.8.8、8.8.4.4,保存;8.8.8.8、8.8.4.4,保存;8.8.8.8/8.8.4.4,且「出口IP」是服务器公网IP,说明DNS解析已成功走VPN**;google.com,就能正常访问了。AllowedIPs加:53端口:WireGuard APP不支持带端口的IP段写法,仅服务端iptables支持,客户端配置加端口必报错;dnscheck.tools,验证DNS和出口IP均走VPN。| 厂商 | 起步价(月) | 基础配置 | 价格套路 | 低配在售 | WireGuard适配性 | 国内访问延迟 |
|---|---|---|---|---|---|---|
| Vultr | 2.5美元(引流) | 1核/512M/10G SSD | 有(涨价/低配下架) | 否 | 中等 | 中等 |
| DigitalOcean | 4美元 | 1核/1G/25G SSD | 无 | 是 | 高 | 中等 |
| Linode | 5美元 | 1核/1G/50G SSD | 无 | 是 | 极高 | 低(东京节点) |
| AWS Lightsail | 3.5美元 | 1核/512M/20G SSD | 无 | 是 | 极高 | 中等 |
iptables在服务器内部做了NAT转发(对应你之前备忘录里的MASQUERADE规则)。iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE,已经在服务器内部完成了「私网流量→公网流量」的NAT转发,完全覆盖了需求;iptables规则即可实现WireGuard的流量转发,这个页面可以忽略~eth0(公网)/eth1(内网),但 iptables 里残留了 enp1s0 的 MASQUERADE 规则(来自 Vultr 配置复刻),需要清理无效规则+确认网卡状态,无需物理删除网卡(enp1s0 本就不存在,仅需删规则)。# 1. 删除 enp1s0 的 MASQUERADE 规则(关键,无效规则)
sudo iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE
# 2. 验证删除结果(确认 enp1s0 规则消失)
sudo iptables -t nat -L POSTROUTING -n -v
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
100 13674 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
4 346 MASQUERADE all -- * eth1 0.0.0.0/0 0.0.0.0/0
/etc/wireguard/wg0.conf 中的 PostUp/PostDown 规则,确保绑定的是 DigitalOcean 实际公网卡 eth0(而非 enp1s0):# 编辑 WireGuard 配置文件
sudo nano /etc/wireguard/wg0.conf
[Interface] 段(关键看 PostUp/PostDown):[Interface]
PrivateKey = 你的服务器私钥
Address = 10.1.0.1/24
# 核心:绑定 eth0(DigitalOcean 公网卡),删除 enp1s0 相关
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
sudo wg-quick down wg0 && sudo wg-quick up wg0
eth0(公网 IP)、eth1(内网 VPC IP)、lo(回环),enp1s0 是 Vultr 的网卡命名,在 DO 上本就不存在,因此:# 可选:删除 eth1 无效的 MASQUERADE 规则(仅保留 eth0 公网转发)
sudo iptables -t nat -D POSTROUTING -o eth1 -j MASQUERADE
# 安装 iptables 持久化工具(若未装)
sudo apt install -y iptables-persistent
# 保存当前规则
sudo netfilter-persistent save
# 验证保存
sudo netfilter-persistent reload
enp1s0 作为公网卡;eth0(公网)/eth1(内网),复刻配置时需替换网卡名;# 1. 检查 wg 状态(有 handshake 则正常)
sudo wg show wg0
# 2. 测试外网转发(客户端 ping 8.8.8.8 通则生效)
enp1s0 的 MASQUERADE 规则(无效残留);eth0(DO 公网卡);eth0 即可!eth1 确实是内网设备,完全可以忽略/清理eth0 和 eth1 分工明确,对你搭建 WireGuard 来说,仅需保留 eth0 的配置,eth1 可直接清理(不影响任何功能),具体说明如下:| 网卡名 | 作用 | 是否需要保留 | 对 WireGuard 的影响 |
|---|---|---|---|
eth0 | 公网网卡(绑定 178.128.125.166) | ✅ 必须保留 | WireGuard 所有外网流量都通过它转发 |
eth1 | 内网/VPC 网卡(绑定 10.104.0.2) | ❌ 可删除 | 仅用于 DO 内部 VPC 通信,和外网无关 |
enp1s0 | 无效残留(Vultr 网卡名) | ❌ 已删除 | 无实际网卡,仅残留规则,已清理 |
eth1 对你没用,可删除其 MASQUERADE 规则,仅保留 eth0 核心规则,避免冗余:# 删除 eth1 的 NAT 规则(无影响,仅简化配置)
sudo iptables -t nat -D POSTROUTING -o eth1 -j MASQUERADE
# 验证最终规则(仅保留 eth0,最简洁)
sudo iptables -t nat -L POSTROUTING -n -v
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
100 13674 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
# 1. 重启 WireGuard(应用新规则)
sudo wg-quick down wg0 && sudo wg-quick up wg0
# 2. 查看 wg 连接状态(有 latest handshake 即正常)
sudo wg show wg0
# 3. 客户端测试(ping 8.8.8.8 通,域名解析正常)
eth0 的 MASQUERADE 规则,是最适配 DigitalOcean 服务器的极简状态,和你之前 Vultr 用 enp1s0 的逻辑完全一致,只是网卡名不同而已。AllowedIPs是否覆盖服务器内网IPAllowedIPs决定了“哪些流量会走隧道”,若客户端AllowedIPs未包含10.2.0.0/24(服务器内网段),流量会绕开隧道走本地网络,导致无法访问。wg0.conf,检查[Peer]段的AllowedIPs:# 客户端配置必须包含服务器内网段(10.2.0.0/24),正确写法:
AllowedIPs = 10.2.0.0/24, 0.0.0.0/0 # 或直接写0.0.0.0/0(覆盖所有IP)
AllowedIPs仅写了公网IP或其他网段,修改后重启客户端:sudo wg-quick down wg0 && sudo wg-quick up wg0
wg0接口的IP是否为10.2.0.1wg0的Address配置被意外修改,导致内网IP不匹配。# 查看wg0接口的IP
ip addr show wg0
10.2.0.1/24:wg0: <POINTOPOINT,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
inet 10.2.0.1/24 scope global wg0
valid_lft forever preferred_lft forever
10.2.0.1,修改服务器端/etc/wireguard/wg0.conf的Address字段,重启wg0:sudo nano /etc/wireguard/wg0.conf
# 确保[Interface]段有:Address = 10.2.0.1/24
sudo wg-quick down wg0 && sudo wg-quick up wg0
iptables转发规则是否生效MASQUERADE规则可能因服务器重启/配置变更失效,导致内网流量无法转发。# 检查POSTROUTING链是否有eth0的MASQUERADE规则
sudo iptables -t nat -L POSTROUTING -n -v
pkts bytes target prot opt in out source destination
x xxx MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
# 添加eth0的NAT转发规则
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 保存规则(避免重启失效)
sudo netfilter-persistent save
IP转发是否永久开启sysctl.conf),服务器重启后会失效,导致内网流量无法转发。# 检查IP转发状态
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1❌ 若为0,永久开启:echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
10.2.0.0/24指向wg0AllowedIPs配置正确,客户端路由表可能未自动生成对应条目,导致流量走默认路由。# 查看路由表中10.2.0.0/24的条目
ip route | grep 10.2.0.0
10.2.0.0/24 dev wg0 proto kernel scope link src 10.2.0.2❌ 若缺失,手动添加:sudo ip route add 10.2.0.0/24 dev wg0
traceroute定位流量中断点traceroute查看数据包是否进入隧道:# 客户端执行,查看10.2.0.1的路由路径
traceroute 10.2.0.1
10.2.0.1(直接走wg0隧道)❌ 异常路径:第一跳是本地路由器IP(流量未走隧道)→ 回到步骤一检查AllowedIPsAllowedIPs未包含10.2.0.0/24:修改为0.0.0.0/0并重启客户端;wg0的Address不是10.2.0.1:修正配置并重启wg0。10.2.0.1了!iptables 规则重复+错误(eth1优先级高于eth0,流量走了内网)iptables 存在重复+错误的MASQUERADE规则# 你的输出中,eth1规则的pkts/bytes远高于eth0,说明流量被错误转发到内网eth1
pkts bytes target prot opt in out source destination
122 9460 MASQUERADE all -- * eth1 0.0.0.0/0 0.0.0.0/0
1 106 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
eth1 是内网网卡,流量走eth1会被限制在DO的VPC内网,无法访问公网;eth0 有重复规则(2条),但优先级低于eth1,导致流量未走公网。FORWARD 链规则缺失(内网流量无法转发到wg0)POSTROUTING规则,但缺少**FORWARD链允许wg0↔eth0流量**的规则,导致内网包被防火墙拦截。# 1. 清空所有iptables规则(彻底重置)
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
# 2. 配置正确的转发规则(仅保留eth0公网转发)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 仅eth0公网
sudo iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT # wg0→eth0公网
sudo iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT -m state --state RELATED,ESTABLISHED # eth0→wg0内网
# 3. 保存规则(永久生效)
sudo netfilter-persistent save
# 4. 重启WireGuard
sudo wg-quick down wg0 && sudo wg-quick up wg0
sudo wg-quick down wg0 && sudo wg-quick up wg0
ping 10.2.0.1(通)ping 8.8.8.8(通)10.2.0.1,也能正常访问外网,不会再出现断连问题!| 资源 | 作用 | 512MB 内存的问题 | 1GB 内存的改善效果 | CPU 升级的必要性 |
|---|---|---|---|---|
| 内存 | 缓存数据包、维持连接状态、系统运行 | 可用内存不足,系统频繁使用交换分区(SWAP),导致转发延迟升高 | 可用内存充足(~600-700MB 空闲),数据包缓存不丢失,转发速度直接提升,卡顿消失 | 无(1 核 vCPU 足够支撑 WireGuard 加密/解密,即使多设备连接也无压力) |
| CPU | 数据包加密(ChaCha20)、解密、路由计算 | 1 核 vCPU 完全够用,WireGuard 对 CPU 消耗占比通常 <10% | 升级到 2 核 vCPU 后,速度无明显变化(瓶颈不在 CPU) | 仅当连接设备 >20 台或同时跑其他高负载服务时才需要,你的场景完全不需要 |
# 停止并禁用不需要的服务(如 snapd、apache2 等,按需执行)
sudo systemctl stop snapd
sudo systemctl disable snapd
MTU 从 1420 改为 1450(DigitalOcean 网络支持更高 MTU,减少数据包分片):# 服务器端/客户端 wg0.conf 中添加
MTU = 1450
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab # 永久关闭
iptables 规则里 eth1 优先级高于 eth0,导致流量误走内网,但删除 eth1 规则后仍无法连接,说明它只是 “次要干扰项”,真正的核心瓶颈是 DigitalOcean 的付费状态限制(这是云厂商的常见机制)。Endpoint 会失效,需要重新修改);Endpoint 都不用改;iptables -t nat -L POSTROUTING -n -v,确保仅保留 eth0 的 MASQUERADE 规则,避免系统自动恢复无效规则。