ssh实验室内网电脑
18/05/2020 3条评论
最近的新冠疫情迫使我干了这么一件事情,找了一个办法可以用外网ssh我在实验室的内网电脑。
情况是这样的:
* 首先,我在的实验室用的是内网,无数层的路由网关,我的电脑显然是深度埋在了内网,直接ssh是没戏的。
* 为了能ssh内网机器,我需要架一个反向ssh隧道,但是这样仍然需要有一个IP相对固定或者暴露的外网服务器来搭建外网的接入点。这时候我想到了家里的联通宽带。
* 然而联通宽带给家庭用户分配的外网IP是动态的,每隔几天就会更新一次。我肯定不能每次都手动修改,需要一个自动化的方法。
所以,总结问题之后,主要是以下两点:
* 找到一个办法,能够自动更新家内联通宽带的外网IP,并在家架设一个外网可登陆的入口点(家庭服务器)。
* 在实验室电脑和家庭服务器之间假设一个反向隧道,并且该反向隧道可以在家庭服务器IP发生变化时自动重连。
先看第一点,自动更新家庭服务器外网地址。其实一台内网电脑要获得自己的外网地址没那么困难,用下面的Linux命令就可以:
curl http://ifconfig.me/ip/ >extern-ip 2>/dev/null
http://ifconfig.me 这个网站会动态生成一个访问者的IP地址,curl命令则把这个地址存到了extern-ip文件中。有了这个,我们其实就可以用Linux的cronb服务,定时的获得最新的IP地址。但是,这个IP地址只是存在了家庭服务器本地,当IP改变但是我并不在家的时候,还需要有个办法获得该IP。我想到的办法是架设一个github的私有repo,然后写一个脚本,该脚本由cronb定期执行,获得最新的IP,如果发现IP变更,则用commit/push自动上传至github私有repo,当然,需要先设好ssh key省去密码环节。最后一点,我们还需要设置家里的路由器,将家庭服务器暴露给外网(DMZ主机服务)。哒哒,现在我可以随处ssh登陆家里的家庭服务器了。
有了家庭服务器,现在我们需要一个反向ssh隧道来连接实验室电脑。这时候我选择了frp(https://github.com/fatedier/frp)。这个家伙真的很傻瓜(感觉也很裸奔,防护完全靠密码)。将家庭服务器设置为server,然后实验室电脑为client。注意唯一需要注意的问题是,家庭服务器的IP是动态的。所以我们需要用一个cronb任务定期的从github上获得最新的IP地址,然后通过frp环境变量的方式设定server的IP地址。当然,我们也需要一个cronb任务定期的重启ssh隧道(我现在是每6个效时重新建立一次,这样在IP更新的时候,我最多由6个效时不能访问实验室电脑)。
最后还要提示一点,现在实验室的电脑和家庭服务器都暴露给外网了。外网很危险,如果你看/var/log/auth.log,基本连到外网的机器无时无刻不受到ssh扫描的攻击。所以一定要设置强密码和禁止root登陆。此外,我还建议在两个电脑上都安装fail2ban,自动黑名单ssh扫描攻击。当然这样也许会时不时地误伤自己,导致自己不能登录实验室电脑,但是总之有防护还是能睡安稳觉的。
OK,非常粗略的攻略写到这里,应该不是拿来玩的,有实际需求的可以按步骤思考后重现。