安装 WireGuard
在作为服务器和客户端的上,都下载并安装WireGuard ,服务器开放51820端口
Linux
首选方案:ELRepo 预编译模块(无需升级内核)
ELRepo 为 CentOS 7 提供了现成的 kmod-wireguard 包,直接安装即可,对系统改动最小。
1. 安装 EPEL 和 ELRepo 仓库
sudo yum install -y epel-release
sudo yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm2. 安装内核模块与用户工具
sudo yum install -y kmod-wireguard wireguard-toolskmod-wireguard 提供内核模块,wireguard-tools 提供 wg 和 wg-quick 命令。
3. 加载模块并验证
sudo modprobe wireguard
lsmod | grep wireguard如果 lsmod 能看到 wireguard 行,说明模块已成功加载,后续配置与之前讨论的 A/B 服务器方案完全兼容。
可能遇到的兼容性问题:某些较早版本的 CentOS 7 内核(例如 3.10.0-1127)可能低于 kmod-wireguard 要求的最低版本(3.10.0-1160)。如果安装时提示依赖不满足,先执行 sudo yum update kernel 将内核更新到当前 CentOS 7 仓库的最新版本,重启后再重试安装模块。
备选方案:使用内核自带 WireGuard 的 kernel-plus
CentOS 7 的 centosplus 仓库提供了一个名为 kernel-plus 的内核变体,已经将 WireGuard 作为签名模块内置其中,无需额外安装 kmod-wireguard。适合不希望使用第三方 ELRepo 模块、但又不想大规模升级内核的场景。
1. 启用 centosplus 仓库并固定 kernel-plus
sudo yum install -y yum-utils epel-release
sudo yum-config-manager --setopt=centosplus.includepkgs=kernel-plus --enablerepo=centosplus --save2. 安装 kernel-plus 和工具
sudo yum install -y kernel-plus wireguard-tools3. 设置默认从 kernel-plus 启动
sudo sed -e 's/^DEFAULTKERNEL=kernel-core$/DEFAULTKERNEL=kernel-plus-core/' -i /etc/sysconfig/kernelCentOS 7 的默认值可能是 kernel-core 或 kernel,检查系统是否真的从 kernel-plus 内核启动。
uname -r如果输出中包含 kernel-plus 字样(例如 3.10.0-1160.xxx.el7.centos.plus),说明内核正确。如果只是普通的 3.10.0-xxx.el7.x86_64,则说明系统仍在用旧内核启动,kernel-plus 并未生效。
如果内核不对,请检查 /etc/sysconfig/kernel 文件中的 DEFAULTKERNEL 值是否已设置为 kernel-plus,修改后必须重启服务器才能切换。
持久化 IP 转发:上面的 PostUp 只在接口启动时临时开启转发。为了重启后仍然有效,再写入 sysctl drop-in:
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-wireguard-forward.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard-forward.conf如果后续发现 NAT 后的回包被反向路径过滤丢弃,可以补充 net.ipv4.conf.all.rp_filter = 2,但多数常规 VPS 上只设置 ip_forward=1 即可。
密钥:
在 服务器和客户端 上分别执行,私钥绝不外传,只交换公钥:
umask 077
mkdir -p /etc/wireguard/keys
wg genkey | tee /etc/wireguard/keys/private.key | wg pubkey > /etc/wireguard/keys/public.key执行后,每台机器得到 private.key 和 public.key,最终只需要把三端的 public.key 互相填入配置。
启动服务并设置自启
在 A 服务器和 B 服务器上,分别执行以下命令。WireGuard 的 systemd 服务模板是 wg-quick@.service,其中的 %i 会自动替换为你的接口名(通常是 wg0)。
手动启动服务(立即生效)
sudo systemctl start wg-quick@wg0这个命令会读取 /etc/wireguard/wg0.conf 并创建 wg0 接口。
停止或重启服务
# 停止接口
sudo systemctl stop wg-quick@wg0
# 重启接口(常用于修改配置后重新加载)
sudo systemctl restart wg-quick@wg0设置为开机自启(重启后依然生效)
sudo systemctl enable wg-quick@wg0如果需要重新加载 systemd 配置(例如你手动创建过服务链接),可以额外执行 sudo systemctl daemon-reload。
一步完成启动与自启
sudo systemctl enable --now wg-quick@wg0这个命令等价于同时执行 enable 和 start。
检查服务状态
sudo systemctl status wg-quick@wg0如果状态显示 active (running),说明服务已成功启动。如果显示 failed,可以查看日志定位原因:
sudo journalctl -u wg-quick@wg0 -xe常见的失败原因包括配置文件语法错误、私钥路径不正确或 PostUp 中的 iptables 命令执行失败。
检查隧道状态
这是最关键的验证命令,它会显示接口和所有 peer 的实时信息:
sudo wg show重点观察输出中每个 peer 的 latest handshake 字段。如果显示了类似 1 minute ago 的近期握手时间,说明隧道已经成功建立并交换了密钥。如果该字段为空或显示很久以前,则隧道未连通。
在 A 服务器上,你应该能看到 B 服务器的 peer 有最近的握手记录。同时,可以在 A 上 ping B 的隧道 IP 进行端到端验证:
ping -c 3 10.0.0.2在 客户端上,连接后可以通过 curl https://ifconfig.me 检查出口 IP 是否已变为 A 服务器的公网 IP,以确认代理转发生效。
Windows
密钥:
直接在 WireGuard 图形界面中通过“添加空隧道”让软件自动生成密钥,但通过命令行生成可以更清晰地管理密钥对。
以管理员身份打开命令提示符,输入:
wg genkey将输出的私钥(PrivateKey)安全地复制并保存。接着,用这个私钥生成公钥(PublicKey):
echo 你的服务器私钥 | wg pubkey在客户端上生成密钥:在客户端电脑上重复上述步骤,得到客户端的私钥和公钥。
**开启系统 IP 转发:**Windows 服务器默认不转发流量,必须手动开启。以管理员身份运行 CMD,执行:
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v IPEnableRouter /t REG_DWORD /d 1 /f执行完毕后,重启服务器使设置生效。
配置
A服务器配置
编辑 /etc/wireguard/wg0.conf:
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <A_PRIVATE_KEY>
PostUp = sysctl -w net.ipv4.ip_forward=1
# 只允许从 wg0 发往公网接口的转发(客户端上网)
PostUp = iptables -A FORWARD -i %i -o eth0 -j ACCEPT
# 只允许公网接口回到 wg0 的已建立/相关连接
PostUp = iptables -A FORWARD -i eth0 -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 禁止隧道内部互转,即客户端 <-> B 不经过 A 转发
PostUp = iptables -A FORWARD -i %i -o %i -j DROP
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -o eth0 -j ACCEPT
PostDown = iptables -D FORWARD -i eth0 -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostDown = iptables -D FORWARD -i %i -o %i -j DROP
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# ---- B 服务器作为对等节点 ----
[Peer]
PublicKey = <B_PUBLIC_KEY>
AllowedIPs = 10.0.0.2/32
# ---- 客户端 1 ----
[Peer]
PublicKey = <CLIENT1_PUBLIC_KEY>
AllowedIPs = 10.0.0.10/32关于 PostUp 中的 iptables 规则:FORWARD -i %i -j ACCEPT 和 FORWARD -o %i -j ACCEPT 放行进入和离开 wg0 的转发流量;POSTROUTING -o eth0 -j MASQUERADE 让隧道内源 IP 在出公网接口时被伪装成 A 的公网 IP,这是客户端能通过 A 访问互联网的关键。%i 会被 wg-quick 自动替换为 wg0。
设置权限:
chmod 600 /etc/wireguard/wg0.confB服务器配置
**创建并配置服务器隧道:**打开 WireGuard,点击 “新建隧道” → “新建空隧道”,然后修改配置,将私钥和公钥填进去:
[Interface]
PrivateKey = <B_PRIVATE_KEY>
Address = 10.0.0.2/24
ListenPort = 51820
# ---- A 服务器作为对等节点 ----
[Peer]
PublicKey = <A_PUBLIC_KEY>
Endpoint = <A_PUBLIC_IP>:51820
AllowedIPs = 10.0.0.1/32
PersistentKeepalive = 25
# ---- 客户端 1 ----
[Peer]
PublicKey = <CLIENT1_PUBLIC_KEY>
AllowedIPs = 10.0.0.10/32在服务器配置中,[Peer] 段的 AllowedIPs 应设置为客户端的虚拟 IP 地址并使用 /32 掩码,以进行精确控制。
B 的 AllowedIPs 只写 10.0.0.1/32,因为 B 只需要与 A 的隧道地址互通,不需要把客户端或其他流量路由进 wg0。Endpoint 填写 A 的公网 IP 或域名,PersistentKeepalive = 25 在 B 位于 NAT 后时帮助维持会话。
B 不需要配置 PostUp NAT 规则,也不需要开启 ip_forward,因为 B 在这套拓扑中只作为被访问的一方,不承担转发职责。
配置 Windows 防火墙:需要在服务器上放行 WireGuard 的 UDP 监听端口(51820)。以管理员身份运行 CMD:
netsh advfirewall firewall add rule name="WireGuard Server" dir=in action=allow protocol=UDP localport=51820如果你的服务器前面还有路由器,还需要在路由器上设置端口转发,将公网 IP 的 51820 端口映射到服务器的内网 IP。
如果只通过 WireGuard 图形界面“激活”隧道,重启服务器后隧道可能不会自动恢复。需要在管理员 CMD 中执行以下命令,将配置安装为 Windows 服务:
wireguard.exe /installtunnelservice "C:\path\to\wg0.conf"这会创建一个名为 WireGuardTunnel$wg0 的服务,隧道会在系统启动时自动建立,不依赖用户登录。
配置客户端
在客户端电脑的 WireGuard 中,同样创建一个新隧道,配置如下:
[Interface]
PrivateKey = <CLIENT1_PRIVATE_KEY>
Address = 10.0.0.10/32
DNS = 1.1.1.1
[Peer]
PublicKey = <A_PUBLIC_KEY>
Endpoint = <A_PUBLIC_IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
[Peer]
PublicKey = <B_PUBLIC_KEY>
Endpoint = <B_PUBLIC_IP>:51820
AllowedIPs = 10.0.0.2/32
PersistentKeepalive = 25AllowedIPs = 10.0.0.0/24表示只有访问 VPN 内部网络的流量才走隧道。如果你想让客户端的所有上网流量都经过 VPN,可以将其设为0.0.0.0/0。PersistentKeepalive = 25有助于在客户端处于 NAT 后方时维持连接。
连接
先在服务器上激活其隧道,然后在客户端上激活客户端隧道。激活后,能看到数据收发的统计信息。
在客户端上打开 CMD,尝试 ping 服务器的虚拟 IP 地址:
ping 10.0.0.1
ping 10.0.0.2







Comments | NOTHING