如何在两台 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

1
sudo sysctl -p

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

第四部分:启动并验证

  1. 先在 VPS-B (服务端) 上启动

    Bash

    1
    
    sudo wg-quick up wg0
    
  2. 然后在 VPS-A (客户端) 上启动

    Bash

    1
    
    sudo wg-quick up wg0
    
  3. 验证连接状态 (在两台机器上都执行)

    Bash

    1
    
    sudo wg show
    

    检查输出,关键是要看到 latest handshake (最近一次握手) 有时间记录。

  4. 测试隧道连通性 (在 VPS-A 上执行)

    Bash

    1
    
    ping 10.10.10.1
    

    应该能 ping 通服务端的隧道地址。

  5. 最终验证 (在 VPS-A 上执行)

    Bash

    1
    
    curl ip.info
    

    如果一切正常,返回的 IP 地址必须是您 VPS-B 的公网 IP


第五部分:设置开机自启

为了让服务在服务器重启后自动运行,请在 VPS-A 和 VPS-B 两台服务器上都执行以下命令:

Bash

1
sudo systemctl enable wg-quick@wg0

至此,您已经拥有一个稳定、高效、开机自启的 WireGuard 全局代理方案。