ssh -D 参数的妙用
1. 背景
在学校使用的服务器连接的是校园网,如果不进行登录认证,只能访问内网资源,无法访问互联网资源。而让服务器登录校园网登录有以下痛点:
- 每次登录校园网需要给服务器连接显示器、键盘和鼠标,然后在浏览器中请求登录网站,输入账号密码。
- 异常断电后需要重新登录连网;校园网有设备登录数量上限,服务器可能会被挤下线(下线又需重连)。
- 服务器离我们日常
工作搬砖的地方较远,登录一次非常麻烦。
2. 国内外研究现状
2019 年 9 月,有了彬锅的校园网登录脚本:https://github.com/siliconx/hitsz_net
在服务器内运行脚本,通过 Google Chrome 提供的驱动,在无图形界面的环境下,模拟登录请求,即可完成身份认证。
这种方案的环境配置过程较为繁琐(其实也还好),只能针对某一台服务器进行配置。我所在的课题组有两台服务器,当时每台服务器都单独配置了一遍。如果你所在的课题组财力雄厚,有 10 台服务器……
同时,存在浏览器驱动和浏览器版本相差太多,功能出现异常的可能性。因为驱动是通过离线包安装,浏览器是用apt
管理的,每次用apt
更新系统软件,浏览器都会自动更新,多年以后,驱动可能驱不动新版本的浏览器了。
考虑到在服务器中使用浏览器的需求很少,可以在apt
中禁用浏览器自动更新即可,从而保证两者版本的匹配:https://github.com/siliconx/hitsz_net/issues/1
3. 校园网的认证逻辑
前面分析了一堆,当然是为了给更好的方案做一个铺垫,介绍新方法之前,需要对校园网认证的逻辑有一个简单了解。
首先我们去访问 http://10.248.98.2/,在网页上输入用户名和密码,点击登录,然后我们就可以访问互联网了。
对于这个认证系统来说,其实不难猜到它的逻辑。对端的服务器应该是维护了这样一张表:
IP 地址(内网) | 是否认证 | 有效时间 |
---|---|---|
10.xxx.xxx.xxx | 是 | xx 分钟 |
…… | ……… | ……… |
认证成功后,后面所有通过我这个内网 IP 发出的外网请求,都会被放行,允许访问。这里的认证是和 IP 绑定上的,如果我们的另外一台设备(肯定不是当前 IP)没有经过认证,就不能访问外网。
4. ssh -D 动态转发
4.1 原理介绍
现在要回归标题了。ssh 我们都用过,-D 参数有啥用呢?直接 Read The Fucking Manual,说得很清楚了。
我们会这样使用它:
|
|
简单来说就是它开启了一个动态转发的功能,在本地绑定的端口处启动一个 socks 代理,通过它的数据请求都被转发到 remote_server,然后以 remote_server 的名义转发给目标主机。(是不是有点像 FQ)
4.2 使用流程
不如举个例子,把整个流程走一遍。我手上有如下设备:
首先在我的电脑上执行如下命令,启动一个 socks 服务,输入 ssh 的登录密码即可:
|
|
-D
绑定一个端口,用来动态转发该端口的数据请求。cheney@10.249.41.173
本质上还是使用的 ssh,这里要认证登录创建 ssh 连接-N
默认情况下,登录成功会出现一个终端,我们可以在这个终端中输入命令远程控制服务器。这个参数用来禁用该功能,登录只做身份验证,不执行远程命令,此时登录成功啥也不会出现。
登录成功后,本机的 2021 端口处会启动一个 socks 服务,通过该端口的数据请求都会被转发到 10.249.41.173 来执行。光这样还不行,因为本机上没有哪个程序会往 2021 端口发数据。
一般情况下,如果我们用浏览器访问一个网站,这个请求是直接被发送出去的。
通过配置 socks 代理,这个 HTTP 请求会被重定向到该 socks 服务,也就是发往 2021 端口。
我在本机的火狐浏览器上进行了配置。火狐要方便一点,有应用级别的代理,修改后只对该应用生效。其他的浏览器好像都是使用的系统代理,修改后影响范围比较大。经过如下配置后,所有使用火狐浏览器产生的HTTP请求,都会被发送到本机的 2021 端口。
发送之后,具体这个请求会被怎样处理,那就要看本地的这个服务到底干了啥。前面提到过(文档截图里也说的很明白),这个请求会被再转一次,转到使用 ssh 连接上的 10.249.41.173 服务器上,让它去做相同的请求。同样的道理,产生的响应也会沿着这条链接发送回来。
玩过小飞机的同学应该都很熟悉这个流程,这里就是借用 ssh 的传输方式实现了一个代理服务器。
4.3 校园网认证
怎样用这个逻辑来实现校园网的认证,让服务器连上网呢?执行完上述命令,启动好 socks 服务后,直接在我们的电脑上请求 http://10.248.98.2/ 即可。
为啥?因为按照上述的流程,最终是服务器用它的 IP 去完成了校园网的认证,它的 IP 地址被加到了我们所谓的表中,从而能够访问外网。
IP 地址(内网) | 是否认证 | 有效时间 |
---|---|---|
10.249.41.173 | 是 | xx 分钟 |
…… | ……… | ……… |
5. 结束语
彬锅的自动登录脚本非常容易理解,模拟了用户进行网络认证的行为,充分体现了脚本自动化的便利。
今天介绍的方法几乎不用在服务器上进行任何配置,只要能登录 ssh 即可,只不过方法比较巧妙,逻辑不太容易想明白。
一直都觉得计算机网络是最实用的技术,但是比较难学,琢磨琢磨这些底层原理,不比背八股文有意思多了>_<
socks 服务也可以直接在服务器上启动,实现相同的功能;对应的参数怎么设置,有兴趣的同行们可以试一下。