如何保持sshsocks5代理在后台运行

背景

在ssh命令中有一个-D参数,这个参数可以使得ssh命令能够建立一条socks5代理。

那socks5代理有什么用?举个简单的例子,公司服务器隔离外网,但是这个时候我们又需要访问一些应用的管理界面,但是内部服务器通常没有图形化界面,无法使用浏览器,这个时候就可以通过socks5建立代理来访问。

故事就是发生在这里,由于前段时间公司部分服务器禁用外网,导致不得不使用socks5代理来访问。但是但是ssh的socks5连接虽然不难(命令ssh -fD2222 [email protected]),但是却存在不小的问题,ssh超过一定时长就会自动断开连接。对于一个希望将socks5长期驻留在后台的需求者来说这是不可忍受的。

问题1 ssh超过一定时长就会自动断开连接

解决方法

1. autossh

上面我们遇到了问题1,这个问题还是比较容易解决的,网上搜一下,一下子就能找到相关的解决方案,我这边采用了autossh这个工具来解决这个问题。(autossh的安装过程此处就不详解了)

2. 在切换网络时也能保持连接

autossh的确解决了问题1,但是随着几天的使用,我又发现了一个新的问题

问题2 一旦网络长时间断开,或者切换网络,autossh所建立的socks5通道会有两分钟左右的时间无法访问

于是乎,一个想法就在脑海中诞生了,就是定时检查网络,一旦发生变化,就杀掉原先的autossh进程,然后再创建一个新的进程。下面是代码(仅供参考,部分语句根据机器不同可能需要微调)

#!/bin/bash trap clean; exit SIGINT trap clean; exit SIGTERM trap clean; exit SIGHUP function clean() { kill $(ps -ef | grep autossh | grep "\-D2222" | awk {print $2}) } function work() { while : do net=$(ifconfig -L en0 | grep status | awk {print $2}) if [ $net = active ] then old=$(ifconfig) new=$(ifconfig) /usr/local/bin/autossh -M 2223 -f -CNo "ProxyJump [email protected]" -D2222 [email protected] while [ $net = active ] && [ "$old" = "$new" ] do sleep 1 net=$(ifconfig -L en0 | grep status | awk {print $2}) new=$(ifconfig) done clean fi sleep 1 done } clean work

只需一直保持代码在后台执行即可,不过网络切换时仍然会存在几秒的无法连接的时间,不过相对之前的方式,已经明显在可接受范围之内了。

3. 后续

开机自启动

此步不详解,mac可能会稍微麻烦,我捣鼓了很久才搞定。

借助工具访问代理

对于网页浏览,可以借助一些插件,例如chrome的SwitchyOmega等。

对于命令行程序的运行,可以使用proxychains。