服务器访问外网: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 访问外网。
六、服务器配置代理环境变量
为了让 git、pip、wget、curl 等命令默认走代理,可以在服务器上创建代理脚本。
执行:
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. apt 或 pip 报错:Could not connect to 127.0.0.1:17890
原因:
服务器上的代理环境变量存在,但是 Windows 的 SSH 隧道断了。
解决方法:
重新打开 Clash,并重新运行:
start_tunnel.bat
4. Windows bat 打开后乱码
原因:
bat 文件中包含中文,可能出现编码问题。
解决方法:
bat 文件里的提示文字尽量使用英文。
这不会影响实际代理功能。
5. Windows bat 打开后卡住不动
这是正常情况。
说明 SSH 隧道正在保持连接。
不要关闭窗口。
相关文章
项目迁移到持久化目录后Git显示所有文件Modified
记录一次项目迁移到持久化目录后,Git将大量文件标记为modified的问题排查过程。
Linux 容器实验环境的数据持久化迁移
记录在 Linux 容器实验环境中,将 /home 下的项目、数据集、环境和输出迁移到持久化目录 /data,并通过软链接保持原路径可用的方法。
PPU显卡环境配置
PPU 显卡服务器深度学习环境配置指南,介绍如何继承系统 PPU 版 PyTorch、创建虚拟环境、安装安全依赖,并处理 torch 不可用和依赖冲突等常见问题。
评论
#评论正在加载。如果这里一直没有内容,请检查手机网络是否能访问 GitHub Discussions 和 giscus.app。