如何通过SSH访问网关后方的Web服务器(无网关及服务器权限)
如何通过SSH访问网关后方的Web服务器(无网关及服务器权限)
别发愁,你的这个场景完全有解!而且不需要网关或者Web服务器的任何额外权限——刚好你有本地Ubuntu电脑的root权限,用SSH动态端口转发就能搞定,原理其实就是把你的本地浏览器请求通过SSH隧道“借道”网关发出去,和网关自己用wget访问Web服务器的逻辑一模一样。
直接上实操步骤:
第一步:在本地建立SSH动态代理隧道
打开本地Ubuntu的终端,运行这条命令(把里面的user换成你登录网关的用户名,gateway-ip换成网关的实际IP或者域名):
ssh -D 1080 -C -q -N user@gateway-ip
给你拆解下每个参数的作用:
-D 1080:在本地的1080端口开启一个SOCKS5代理,所有发往这个端口的网络请求都会自动通过SSH隧道转发到网关-C:压缩传输的数据,能提升一些访问速度-q:安静模式,避免输出一堆无关日志-N:只建立SSH连接,不执行远程命令,专门用来做代理的参数,保持连接稳定
运行后如果没有报错,终端会停在那里,这说明隧道已经建立成功了。
第二步:配置浏览器使用这个代理
接下来让你的浏览器把请求发往这个本地代理端口就行,分两种常用浏览器的配置方法:
Firefox 配置
- 打开Firefox,右上角点击设置图标,进入设置页面
- 搜索框输入“代理”,找到“网络设置”部分,点击“设置”按钮
- 选择“手动配置代理”,然后:
- SOCKS主机填
localhost,端口填1080 - 代理类型选择“SOCKS v5”
- 一定要勾选“远程DNS”选项(这样Web服务器的域名解析会由网关来做,避免本地解析不到内部域名的问题)
- SOCKS主机填
- 保存设置后,直接在地址栏输入Web服务器的URL就能访问了
Chrome 配置
Chrome可以直接用命令行启动并指定代理,这样不用改全局设置:
google-chrome --proxy-server="socks5://localhost:1080" --host-resolver-rules="MAP * 0.0.0.0 , EXCLUDE localhost"
这条命令会启动一个单独的Chrome实例,所有请求都会走我们的SSH代理隧道,关闭这个实例后,原来的Chrome还是用正常网络。
几个实用小技巧
- 如果本地1080端口被占用了,随便换个没被用的端口就行,比如1081,只要命令里的端口号和浏览器配置对应上就好
- 不想一直开着终端保持连接?可以用
screen把这个SSH进程放到后台:
按screen -S proxy-tunnel ssh -D 1080 -C -q -N user@gateway-ipCtrl+A+D就能把会话放到后台,之后想回来管理的话,运行screen -r proxy-tunnel就行 - 不想全局用代理?可以在本地装个
proxychains(因为你有root权限,直接sudo apt install proxychains就行),编辑/etc/proxychains.conf,把里面的代理配置改成socks5 localhost 1080,然后用proxychains firefox web-server-url启动浏览器,这样只有这个浏览器实例走代理,其他应用不受影响
纠正下你之前的误解
你之前以为需要Web服务器的SSH权限,其实完全不需要!我们用的动态端口转发,本质是让网关帮你转发请求——所有发往Web服务器的请求都是从网关发起的,和网关自己用wget访问的权限完全一致,只要网关能访问Web服务器,你就能通过这个隧道访问到,完美匹配你的场景。
备注:内容来源于stack exchange,提问作者Artificial Simon




