Article

用 WireGuard 把家里的开发环境接出来

家里的服务器没有公网 IP。用一台阿里云 ECS 做 WireGuard 中转后,笔记本可以连上家里的机器,Cursor 和 Codex 也能 SSH 过去开发、跑测试。

家里的服务器没有公网 IP。NAS、路由器和其他机器都在这层内网里。人在外面时,笔记本连不进去,Cursor 和 Codex 也碰不到这些环境。

我加了一台有公网 IP 的阿里云 ECS,只拿它做中转。家里的服务器和开发机器 2 主动连上去,笔记本也连上去,流量由 ECS 转发。

网络架构:笔记本和开发机器 2 通过 WireGuard 连到阿里云 ECS,家里服务器再通往 NAS、路由器和其他内网设备

VPN 网段是 10.0.0.0/24。ECS 是 10.0.0.1,家里服务器是 10.0.0.2,笔记本是 10.0.0.3,开发机器 2 是 10.0.0.4。

密钥

每台机器装好 WireGuard 之后,各自生成一对密钥,放在 ~/.wgkeys。机器之间只交换公钥。

mkdir -p ~/.wgkeys
chmod 700 ~/.wgkeys
wg genkey | tee ~/.wgkeys/privatekey | wg pubkey > ~/.wgkeys/publickey
chmod 600 ~/.wgkeys/privatekey

私钥留在本机,不要放进仓库。

阿里云 ECS

Ubuntu 上安装:

sudo apt update
sudo apt install wireguard -y

配置写在 /etc/wireguard/wg0.conf。密钥换成 ~/.wgkeys 里的内容。

[Interface]
PrivateKey = ECS_private_key
Address = 10.0.0.1/24
ListenPort = 51820

PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0

[Peer]
PublicKey = HOME_public_key
AllowedIPs = 10.0.0.2/32

[Peer]
PublicKey = LAPTOP_public_key
AllowedIPs = 10.0.0.3/32

[Peer]
PublicKey = DEV2_public_key
AllowedIPs = 10.0.0.4/32

ip_forward 要打开,这几台机器才能互通。AllowedIPs 写对方的地址,ECS 靠它把包转给对应的机器。

sudo chmod 600 /etc/wireguard/wg0.conf
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

安全组入方向放行 UDP 51820。

家里的服务器

安装方式和 ECS 一样。配置:

[Interface]
PrivateKey = HOME_private_key
Address = 10.0.0.2/24
PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0

[Peer]
PublicKey = ECS_public_key
Endpoint = ECS公网IP:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

家里没有公网 IP,所以由这台机器主动连出去。PersistentKeepalive = 25 用来保住宽带上的映射。AllowedIPs 只写 VPN 网段,平时上网还是走原来的宽带。

启动命令和 ECS 相同。这台机器要能 SSH 登录。

开发机器 2

Linux 上照家里服务器配,Address 写成 10.0.0.4/24。

Windows 则安装 WireGuard 客户端。打开后选择 Add Tunnel → Add empty tunnel,客户端会生成密钥。公钥填进 ECS 上 DEV2_public_key 那一段,隧道配置写成:

[Interface]
PrivateKey = DEV2_private_key
Address = 10.0.0.4/24

[Peer]
PublicKey = ECS_public_key
Endpoint = ECS公网IP:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

保存后点 Activate。Windows 不用写 PostUp。要让 Cursor 或 Codex 连上这台电脑,在系统里启用 OpenSSH 服务器。

笔记本

Mac 上执行 brew install wireguard-tools。配置放在 Homebrew 的 etc/wireguard/wg0.conf。Apple 芯片一般是 /opt/homebrew/etc/wireguard/wg0.conf,Intel 是 /usr/local/etc/wireguard/wg0.conf。

[Interface]
PrivateKey = LAPTOP_private_key
Address = 10.0.0.3/24

[Peer]
PublicKey = ECS_public_key
Endpoint = ECS公网IP:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25
sudo wg-quick up wg0

不用的时候执行 sudo wg-quick down wg0。

确认隧道是通的

sudo wg show
ping 10.0.0.2
ssh dev@10.0.0.2

wg show 里能看到 latest handshake,SSH 能登录,隧道就通了。dev 换成家里服务器上的账号。

访问家里的局域网

上面只能连到 10.0.0.2。要访问 NAS 和其他内网设备,把家里的网段加进 AllowedIPs。下面用 192.168.1.0/24 举例,换成实际网段。

ECS 上,家里服务器那一段写成:

AllowedIPs = 10.0.0.2/32, 192.168.1.0/24

笔记本和 Windows 上的开发机器 2 写成:

AllowedIPs = 10.0.0.0/24, 192.168.1.0/24

然后在路由器上加一条静态路由,把 10.0.0.0/24 指向家里服务器的局域网地址。回包才找得到路。改完重新拉起隧道,再 ping 一台 NAS。

用 Cursor 和 Codex 连上去开发

笔记本的 ~/.ssh/config:

Host home
  HostName 10.0.0.2
  User dev

Host dev2
  HostName 10.0.0.4
  User dev

先确认 ssh home 和 ssh dev2 能用密钥登录。

Cursor 在命令面板里运行 Remote-SSH: Connect to Host,选 home 或 dev2。Codex 在 ChatGPT 桌面版的 Settings → Connections 里启用对应的机器,再打开远端项目。文件和命令都在那台机器上执行,编辑器还在笔记本上。远端装好对应工具,并且要能访问外网。

这样就可以把编译和测试放在家里服务器或开发机器 2 上,笔记本只负责开编辑器。

测试环境放在内网

服务可以跑在家里服务器或开发机器 2 上,例如打开 http://10.0.0.2:8080 或 http://10.0.0.4:8080。数据库也连这些地址。

这些端口只给连进 VPN 的机器用,不在 ECS 上做端口映射。

人在外面时,先把笔记本的 wg0 拉起来。