如何在两台 Debian 12 服务器上,从零开始安装并配置 WireGuard,实现将一台服务器(客户端)的所有网络流量通过另一台服务器(服务端)进行代理转发。
目标场景#
- VPS-B (服务端/网关):网络线路良好,我们将用它作为流量出口。
- VPS-A (客户端):网络线路较差,我们希望它的所有流量都通过 VPS-B。
第一部分:准备工作 (在两台服务器上执行)#
在 VPS-A 和 VPS-B 上都需要完成以下操作。
1.1 更新系统#
保持系统最新是一个好习惯。
Bash
1
| sudo apt update && sudo apt upgrade -y
|
1.2 安装 WireGuard#
Debian 12 的官方源中已包含 WireGuard。
Bash
1
| sudo apt install wireguard -y
|
第二部分:配置 VPS-B (服务端/网关)#
所有操作均在线路好的 VPS-B 上进行。
2.1 开启内核的 IP 转发#
这是让服务器能够充当路由器的关键一步。
Bash
1
2
| # 编辑 sysctl 配置文件
sudo nano /etc/sysctl.conf
|
找到并取消下面这行的注释(删除前面的 #
),如果不存在就手动添加:
Ini, TOML
1
2
| net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1 # 如果需要转发IPv6流量,也一并开启
|
保存文件后,执行以下命令使配置立即生效:
Bash
2.2 生成密钥对#
Bash
1
2
3
4
5
| # 进入wireguard配置目录
cd /etc/wireguard/
# 设置umask确保私钥文件权限安全,然后生成密钥对
umask 077; wg genkey | tee privatekey_b | wg pubkey > publickey_b
|
privatekey_b
是 VPS-B 的私钥,绝不能泄露。publickey_b
是 VPS-B 的公钥,需要发给客户端 VPS-A。
请记下这两个密钥的内容,稍后会用到。
Bash
1
2
| cat privatekey_b
cat publickey_b
|
2.3 创建 WireGuard 配置文件#
Bash
1
| sudo nano /etc/wireguard/wg0.conf
|
将以下内容复制进去,并替换相应的值。这是我们最终优化过的版本,包含了解决“有握手但无法上网”问题的关键防火墙规则。
Ini, TOML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| [Interface]
# 服务端在WireGuard网络中的私有地址
Address = 10.10.10.1/24
# 监听的UDP端口,可以自定义,例如51820
ListenPort = 51820
# 填入刚才生成的VPS-B的私钥 (privatekey_b)
PrivateKey = <VPS-B的私钥内容>
# 【核心】当接口启动/关闭时,自动添加/删除防火墙规则
# 这套规则完整处理了流量转发和NAT,能应对FORWARD链为DROP的默认策略
PostUp = iptables -I FORWARD 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -I FORWARD 2 -i %i -j ACCEPT; iptables -t nat -I POSTROUTING 1 -s 10.10.10.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
[Peer]
# 这是对端VPS-A的信息
# 稍后在VPS-A上生成公钥后,填入此处
PublicKey = <VPS-A的公钥内容>
# 分配给VPS-A的私有IP地址
AllowedIPs = 10.10.10.2/32
|
注意:PostUp
/PostDown
中的 eth0
是公网网卡的名称,请用 ip a
命令确认,如果不是 eth0
(例如是 ens3
),请务必修改。
2.4 配置防火墙#
确保您选择的 ListenPort
(例如 51820
) 的 UDP 流量被允许。如果使用 ufw
:
Bash
1
2
| sudo ufw allow 51820/udp
sudo ufw reload
|
如果您使用云服务商(如 AWS, Google Cloud, Azure),请在其控制台的安全组或网络规则中放行此端口。
第三部分:配置 VPS-A (客户端)#
所有操作均在线路差的 VPS-A 上进行。
3.1 生成密钥对#
同样地,为 VPS-A 生成一套自己的密钥。
Bash
1
2
| cd /etc/wireguard/
umask 077; wg genkey | tee privatekey_a | wg pubkey > publickey_a
|
- 记下
publickey_a
的内容,并回到 VPS-B 的 wg0.conf
配置文件中,将其填入 [Peer]
-> PublicKey
字段。
3.2 创建 WireGuard 配置文件#
Bash
1
| sudo nano /etc/wireguard/wg0.conf
|
将以下内容复制进去,并替换相应的值:
Ini, TOML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| [Interface]
# 客户端在WireGuard网络中的私有地址
Address = 10.10.10.2/24
# 填入刚才生成的VPS-A的私钥 (privatekey_a)
PrivateKey = <VPS-A的私钥内容>
# 建议设置DNS,防止DNS泄露,确保所有查询都通过隧道
DNS = 8.8.8.8, 1.1.1.1
[Peer]
# 这是对端VPS-B的信息
# 填入之前在VPS-B上生成的公钥 (publickey_b)
PublicKey = <VPS-B的公钥内容>
# 【核心】告诉本机,所有流量都应通过此隧道发送
AllowedIPs = 0.0.0.0/0, ::/0
# VPS-B的公网IP地址和监听端口
Endpoint = <VPS-B的公网IP>:51820
# 保持心跳,有助于维持连接稳定
PersistentKeepalive = 25
|
第四部分:启动并验证#
先在 VPS-B (服务端) 上启动:
Bash
然后在 VPS-A (客户端) 上启动:
Bash
验证连接状态 (在两台机器上都执行):
Bash
检查输出,关键是要看到 latest handshake
(最近一次握手) 有时间记录。
测试隧道连通性 (在 VPS-A 上执行):
Bash
应该能 ping 通服务端的隧道地址。
最终验证 (在 VPS-A 上执行):
Bash
如果一切正常,返回的 IP 地址必须是您 VPS-B 的公网 IP。
第五部分:设置开机自启#
为了让服务在服务器重启后自动运行,请在 VPS-A 和 VPS-B 两台服务器上都执行以下命令:
Bash
1
| sudo systemctl enable wg-quick@wg0
|
至此,您已经拥有一个稳定、高效、开机自启的 WireGuard 全局代理方案。