工程实践 2026年5月27日 7 分钟阅读 2171 字

服务器访问外网:Clash + SSH 反向代理 + 自动重连

本地Windows电脑开启 Clash 代理,然后通过SSH反向隧道,让服务器访问本地Clash代理,从而实现服务器访问外网。

服务器连接外网 封面图

一、整体原理

本地 Windows 电脑开启 Clash 代理,然后通过 SSH 反向隧道,让服务器访问本地 Clash 代理,从而实现服务器访问外网。


二、确认本地 Clash 端口

当前本地 Clash 的 HTTP 代理端口是:

7897

如果以后 Clash 端口变了,后面所有命令里的 7897 都要同步修改。

在 Windows 的 CMD 或 PowerShell 中测试本地代理是否正常:

curl.exe -x http://127.0.0.1:7897 https://api.ipify.org

再测试 GitHub:

curl.exe -I -x http://127.0.0.1:7897 https://github.com

如果能返回 IP 或 HTTP 响应头,说明本地 Clash 代理正常。


三、Windows 一键启动 SSH 隧道

在 Windows 桌面创建文件:

start_tunnel.bat

文件内容如下:

@echo off
title SSH Tunnel Auto Reconnect

:loop
echo =====================================
echo Starting SSH tunnel...
echo Time: %date% %time%
echo =====================================

ssh -NT -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -R 17890:127.0.0.1:7897 root@172.30.61.233 -p 1230

echo.
echo Connection lost. Reconnecting in 5 seconds...
timeout /t 5 >nul

goto loop

参数说明

1. ssh -NT

只建立 SSH 隧道,不进入交互式终端。

也就是说,运行这个 bat 文件后,窗口不会进入服务器命令行,而是专门用来保持代理隧道。

2. -R 17890:127.0.0.1:7897

这是 SSH 反向代理的核心参数。

含义是:

服务器的 127.0.0.1:17890
映射到
Windows 本机的 127.0.0.1:7897

也就是说,服务器访问自己的 127.0.0.1:17890,实际上会被转发到 Windows 本机的 Clash 代理端口 7897

3. ServerAliveInterval=60

每隔 60 秒检测一次 SSH 连接是否还活着。

4. ServerAliveCountMax=3

如果连续 3 次检测都没有响应,就认为连接断开。

5. goto loop

如果 SSH 连接断开,bat 会自动重新执行 SSH 命令,从而实现自动重连。

注意事项

bat 窗口不能关闭。

关闭 bat 窗口 = SSH 隧道断开 = 服务器无法继续通过本机代理访问外网

bat 窗口运行后如果看起来卡住不动,这是正常现象,说明 SSH 隧道正在保持连接。


四、如果更换服务器怎么办

如果换了服务器,只需要修改 bat 文件里的服务器地址和端口。

原来的命令是:

ssh -NT -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -R 17890:127.0.0.1:7897 root@172.30.61.233 -p 1230

需要修改的是这一部分:

root@172.30.61.233 -p 1230

例如,新服务器的登录命令是:

ssh -p 2349 root@172.30.61.108

那么 bat 里的 SSH 命令应该改成:

ssh -NT -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -R 17890:127.0.0.1:7897 root@172.30.61.108 -p 2349

其他内容不需要改。


五、服务器端测试 SSH 隧道

登录服务器后执行:

curl -I --proxy http://127.0.0.1:17890 https://github.com

成功时一般会看到类似结果:

HTTP/1.1 200 Connection established

或者:

HTTP/2 200

这说明服务器已经可以通过 Windows 本机的 Clash 访问外网。


六、服务器配置代理环境变量

为了让 gitpipwgetcurl 等命令默认走代理,可以在服务器上创建代理脚本。

执行:

cat > ~/proxy_on.sh << 'EOF'
export http_proxy=http://127.0.0.1:17890
export https_proxy=http://127.0.0.1:17890
export HTTP_PROXY=http://127.0.0.1:17890
export HTTPS_PROXY=http://127.0.0.1:17890
export ALL_PROXY=http://127.0.0.1:17890
export all_proxy=http://127.0.0.1:17890
export NO_PROXY=localhost,127.0.0.1,::1
export no_proxy=localhost,127.0.0.1,::1
EOF

启用代理:

source ~/proxy_on.sh

测试服务器是否能访问 GitHub:

curl -I https://github.com

成功时一般会看到:

HTTP/1.1 200 Connection established
HTTP/2 200

或者直接返回:

HTTP/2 200

七、让服务器每次打开终端自动加载代理

如果每次登录服务器都手动执行:

source ~/proxy_on.sh

会比较麻烦。

可以把它写入 ~/.bashrc

echo "source ~/proxy_on.sh" >> ~/.bashrc

然后立即生效:

source ~/.bashrc

以后每次新开终端,服务器都会自动加载代理环境变量。

注意

自动加载代理变量不等于自动建立 SSH 隧道。

也就是说:

服务器自动加载 proxy_on.sh

Windows 自动打开 start_tunnel.bat

Windows 上的 start_tunnel.bat 仍然必须保持运行。


服务器端

登录服务器后,如果已经把代理脚本写入 ~/.bashrc,一般不用手动执行 source

直接测试:

curl -I https://github.com

如果返回:

HTTP/2 200

说明服务器联网正常。

之后就可以正常使用这些命令:

git clone
pip install
wget
huggingface-cli
codex
openai
apt update

八、常见报错处理

1. curl: (7) Failed to connect to 127.0.0.1 port 17890

原因:

服务器上的 17890 端口没有监听。

解决方法:

检查 Windows 上的 start_tunnel.bat 是否正在运行。

如果没有运行,重新双击 bat 文件。


2. curl: (56) Proxy CONNECT aborted

原因:

SSH 隧道可能存在,但是 Clash 代理不正常。

解决方法:

检查 Clash 是否已经打开。

检查 Clash 的 HTTP 代理端口是否仍然是:

7897

必要时重启 Clash 和 start_tunnel.bat


3. aptpip 报错:Could not connect to 127.0.0.1:17890

原因:

服务器上的代理环境变量存在,但是 Windows 的 SSH 隧道断了。

解决方法:

重新打开 Clash,并重新运行:

start_tunnel.bat

4. Windows bat 打开后乱码

原因:

bat 文件中包含中文,可能出现编码问题。

解决方法:

bat 文件里的提示文字尽量使用英文。

这不会影响实际代理功能。


5. Windows bat 打开后卡住不动

这是正常情况。

说明 SSH 隧道正在保持连接。

不要关闭窗口。


相关文章

评论

#

评论正在加载。如果这里一直没有内容,请检查手机网络是否能访问 GitHub Discussions 和 giscus.app。