使用SSH远程转发让远程服务器使用代理
使用SSH远程转发让远程服务器使用代理
SSH远程转发是一种常用的技术手段,可以帮助用户在不同网络环境下访问受限资源。本文将详细介绍如何使用SSH远程转发让远程服务器使用代理,包括服务器端设置、vscode连接服务器、检测远程服务器端口是否可用等具体操作步骤。
SSH远程转发
为远程服务器配置的核心任务是将远程服务器的访问请求转到本机。SSH连接的同时可以建立转发:
ssh -R <remote-port>:<dest-ip>:<dest-port> <user>@<server-ip>
例如:
# dest-port在这里设置为7890是因为本机的某c开头的软件监听的端口是7890
# SSR也是同理
ssh -R 12000:localhost:7890 root@123.123.123.123 #虚构的用户名和服务器ip
上面-R
后面的部分是指把服务器(123.123.123.123)上的12000端口转发到本机(localhost)的7890端口,准确地说,任何到达服务器12000端口的请求都会被转到本机的7890端口。7890是本机工具监听的端口,所以最后该工具拿到了请求,将它发往了正确的网站,至此完成了一次完整的请求。
服务器端设置
服务器按照远程转发设置本地科研工具连接的前提是必须存在一个建立起上述远程转发的SSH连接。粗略地讲,就是得先执行一次:
ssh -R 12000:localhost:7890 root@123.123.123.123 #虚构的用户名和服务器ip
只有这样建立一次连接,才能把对应端口转发到本机,而且在使用过程中这个连接不能断,否则端口转发也停止了,请求就发送不到本机。
vscode连接服务器
为了方便操作,可以用vscode来登录服务器设置。先在vscode中下载remote-ssh
插件:
配置SSH信息
安装成功之后,点击左下角蓝色图标。上面的User、HostName请填写准确信息,SSH的Port一般是22(如果做了其他转发,可以修改),没动过关于SSH端口的话Port这一行直接不写就好了。
这里就是通过配置SSH的config文件来实现远程转发,config文件位置一般是~/.ssh/config
,Windows下的位置是%USERPROFILE%/.ssh/config
,添加的RemoteForward
与之前的-R
对应。
书写顺序仍然是RemoteForward <远程port> <接收请求的机器的ip>:<接收请求的机器的科研工具端口>
。例如:
Host Server
# HostName写服务器ip地址 或者主机名(要保证dns服务器能解析,或者直接在hosts里手动解析主机名,这样就不用来回输ip地址了)
HostName address
# 你在服务器上的用户名
User name
# 你的私钥文件路径,没有就去掉这一行
IdentityFile D:\....
# 把服务器上的12000端口转发到本地的7890端口
RemoteForward 12000 localhost:7890
检测远程服务器端口是否可用
还要保证设置转发的远程port没有被占用,建议转发前先在服务器上确认一次,被转发的服务器端口号不要取特殊端口,比如80,443这种,尽量取个大于10000的,还要保证小于65535。
在服务器上输入下面内容来确定端口有没有占用:
# netstat -apu | grep port
# 比如
netstat -apu | grep 12000
如果只有下面的内容,可以用:
如果还有额外信息,比如:
那么这个端口被占用了,请换一个,需要注意的是,在建立连接之前测试有没有占用,因为一旦你建立了远程转发的连接,端口就被占用了,所以在连接之前先做一次不包含远程转发的连接,测试一下哪些端口可以使用。
或者在连接的时候也能看到端口是否被占用:下面就是被占用了:
注意,如果有一次带转发的连接成功了,并且连接一直保持着没有断开,那么你后面再连接也会显示这个,所以一切以服务器是否成功连接为准,ping几个网站看看。
服务器设置
然后只要与对应服务器建立一次包含远程转发的SSH连接(也就是要么手动输入ssh -R ...
,要么给对应的服务器在~/.ssh/config
里配置了RemoteForward
),基本就完成了百分之九十的工作。
一般会用Windows Terminal建立一次带远程转发的连接,使用MobaXterm等工具连接也可以,然后保证带远程转发连接的窗口不要关闭,所以这里就建议配置config文件来实现远程转发,这样的话每次连接都是带远程转发的,只要有一个连接窗口开着就可以。
接下来就是在服务器端配置,输入:
export http_proxy=localhost:12000
export https_proxy=localhost:12000
这里的12000和-R
/RemoteForward
后面的第一个端口是一致的。
测试一下是否成功:
curl -L google.com
这就OK了。
SSH转发能做的事情还有很多,包括转发TensorBoard服务啊、转发Web服务等等。
速通版
假设你是Windows系统连接Ubuntu服务器,实测下来Mac连接Ubuntu也是一样的:
- 修改SSH配置文件
对于Windows而言,文件在%USERPROFILE%/.ssh/config
。没有这个文件的话就进%USERPROFILE%/.ssh
创建一个。内容格式:
Host Server
# HostName写服务器ip地址 或者主机名(要保证dns服务器能解析,或者直接在hosts里手动解析主机名,这样就不用来回输ip地址了)
HostName address
# 你在服务器上的用户名
User name
# 你的私钥文件路径,没有就去掉这一行
IdentityFile D:\....
# 把服务器上的12000端口转发到本地的7890端口
# 7890 是你的科研工具监听的端口
RemoteForward 12000 localhost:7890
- 使用Windows Terminal/MobaXterm/vscode(remote-ssh插件)连接
下面是CMD里执行:
登录成功:
- 服务器设置
export http_proxy=127.0.0.1:12000 #端口要和RemoteForward里设置的第一个端口一致
export https_proxy=127.0.0.1:12000
服务器关闭代理:
unset http_proxy
unset https_proxy
12.19 修改
之前一直混用localhost
和127.0.0.1
,直到今天发现:
export http_proxy=localhost:12000
export https_proxy=localhost:12000
在其他网站好像没什么问题,就是huggingface连不上。换成:
export http_proxy=127.0.0.1:12000
export https_proxy=127.0.0.1:12000
就好了。