在[上篇]中,我们聊了为什么放弃 EC2 转投 Lightsail,以及为什么“美西”比“美东”更靠谱。机器选好了(Lightsail + us-west-2 + Ubuntu 24.04 LTS),接下来就是动手搭建隧道。

中间我考虑过几种不同的协议方案,但最后还是回到了 WireGuard。原因很简单:配置干净、协议轻、性能好、不需要复杂的 Web 面板,后续的维护成本极低。如果你只是想给自己用,不想引入太多额外复杂度,WireGuard 是非常合适的方案。

下面是我最终跑通的完整搭建与多端接入流程,以及我踩过的坑。

一、基础环境准备

1. 记录公网 IP

在 Lightsail 创建好 wg-us-west 实例后,首先记下它的公网 IPv4 地址(假设为 35.xx.xx.xx)。

2. 配置防火墙

在 Lightsail 控制台的 Networking 页面里,修改防火墙规则:

  • 保留: SSH / TCP / 22(用于远程登录)

  • 新增: Custom / UDP / 51820(WireGuard 默认端口,注意是 UDP

建议:如果你不是跑网站,把没用的 HTTP 80HTTPS 443 都删掉,减少多余的端口暴露,提升安全性。

二、服务端:安装与配置 WireGuard

1. 安装软件与开启转发

通过 SSH 登录服务器,依次执行以下命令:

Bash

# 更新软件源并安装 WireGuard 和二维码工具
sudo apt update
sudo apt install -y wireguard qrencode curl

# 开启 IPv4 流量转发
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system

2. 确认真实网卡名称(重点避坑!)

这是一个极其容易踩坑的地方! 执行下面这条命令,查看你的公网出口网卡名:

Bash

ip route get 1.1.1.1

我这次查出来的是 dev ens5请务必记住你的网卡名(比如 ens5 或 eth0),后面的配置文件里必须填真实的网卡名,绝不能照抄网上的占位符。

3. 生成服务端密钥

Bash

umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key

# 查看并记录密钥(私钥绝不能公开!)
cat server_private.key
cat server_public.key

4. 编写服务端配置

编辑配置文件:

Bash

sudo vim /etc/wireguard/wg0.conf

写入以下内容(注意替换 <服务端私钥>ens5):

Ini, TOML

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <服务端私钥>
# 注意:下面的 ens5 必须替换成你刚才查到的真实网卡名!
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens5 -j MASQUERADE

5. 启动服务端

Bash

sudo systemctl enable --now wg-quick@wg0
sudo wg

如果出现 interface: wg0listening port: 51820 等信息,说明服务端已经成功跑起来了。

三、电脑客户端接入 (电脑与手机)

为了避免后期混乱,建议在开始配置客户端之前,先在心里(或记事本上)列一张分配表:

设备类型

分配的内网 IP

密钥对说明

配置文件名称

服务端 (Lightsail)

10.8.0.1/24

服务端独立生成

wg0.conf

MacBook (电脑端)

10.8.0.2/32

为电脑端独立生成

client1.conf

iPhone (手机端)

10.8.0.3/32

为手机端独立生成

phone1.conf

有了这张表,我们在写节点 [Peer] 配置时就不会把 IP 搞混了

1. 生成客户端密钥

在服务器上继续操作,为电脑生成独立密钥:

Bash

wg genkey | tee client1_private.key | wg pubkey > client1_public.key

2. 将电脑注册到服务端

编辑 /etc/wireguard/wg0.conf,在文件末尾追加电脑的节点信息:

Ini, TOML

# MacBook
[Peer]
PublicKey = <client1 公钥>
AllowedIPs = 10.8.0.2/32

重启服务端加载配置:

Bash

sudo systemctl restart wg-quick@wg0

3. 整理客户端配置

你需要把以下信息整理成一个 client1.conf 文件,导入到你电脑的 WireGuard 客户端中:

Ini, TOML

[Interface]
PrivateKey = <client1 私钥>
Address = 10.8.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <服务端公钥>
Endpoint = <Lightsail 公网 IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

(注:如果你使用的是 Clash Verge 等代理工具,也可以按照其文档将上述节点信息转换为 yaml 格式导入。)

四、手机客户端接入 (以 iPhone 为例)

避坑提醒:每台设备必须单独分配一个 IP 和一套密钥!手机绝对不能和电脑共用 10.8.0.2 或同一套私钥!

1. 生成手机密钥与注册

在服务器上执行:

Bash

wg genkey | tee phone1_private.key | wg pubkey > phone1_public.key

再次编辑 /etc/wireguard/wg0.conf,追加手机节点:

Ini, TOML

# iPhone
[Peer]
PublicKey = <phone1 公钥>
AllowedIPs = 10.8.0.3/32

重启服务端:sudo systemctl restart wg-quick@wg0

2. 生成二维码扫码接入

创建一个 phone1.conf 临时文件,写入和刚才电脑端类似的配置(注意 PrivateKey 换成手机私钥,Address 换成 10.8.0.3/24)。

然后在服务器端执行命令生成二维码:

Bash

qrencode -t ansiutf8 < phone1.conf

打开手机上的 WireGuard 官方 App,选择“从二维码扫描”,扫码保存后直接开启连接即可。

五、验收与排错

怎么判断是真的连上了,还是仅仅“看起来连上了”?

在服务器上执行排错终极命令:

Bash

sudo wg

如果你在输出信息中看到对应的客户端下出现了 latest handshake(最近握手时间)transfer(流量传输数据),那就说明设备真的已经和 WireGuard 服务端完成握手,并且有流量在走。

最后,在本地设备访问 https://ipinfo.io 验证一下出口 IP。只要看到出口已经变成了你的 Lightsail 节点 IP,整条线路就大功告成了!