打通内外网
很多科研单位的工作服务器是放在内网的,没有互联网连接。这让工作及其痛苦。其一,你无法使用包管理器,这导致非常严重的问题,因为别人早就可以一条 conda install
完成任务了,你还在很辛苦地配环境。更不必说有的传统的 C++ 软件,本身就要依赖这个依赖那个,别人一条apt install
万事大吉了,你还在折腾。还有一种情况就是机器没问题,人不在单位,连不上内网的服务器。
这些问题困扰了我们很长时间。原来很多的工作还是基于传统的编译型语言的,也就一个一个编译过去得了。最近越来越多的工作落在在 Python 和 Julia 这样的语言上,对于人家有包管理器的人,包的依赖是一个套一个一个接一个的。(写FORTRAN出身的人应该很难理解为什么转个单位也要一个包。)打通内外网的界限因此成为了必须。
这些问题解决的总开关是端口转发,port tunneling。以下分几种情况,分类介绍。
临时让服务器连上外网的方法
这需要让计算服务器的所有对外的流量通过代理。
首先在桌面端搭建代理服务器,具体地,安装Squid for Windows。这个软件可以把你的桌面(Windows 系统电脑)变成一个代理服务器。安装好以后,运行,在系统右下角托盘找到它的章鱼图标,右击编辑配置文件。在 Squid 配置文件末尾加入 http_access allow all
并重启Squid。Squid 默认监听端口是3128,需要改的话请自便(但是其实没有修改的必要)。
当然搭建代理服务器的方式不是只有这一种,Squid 只是单纯的把计算服务器对外的流量通过自己的桌面正常发送出去。同理你可以把这个流量通过别的信道发到别的什么地方去,例如软件经销商的升级服务器网络。
而在计算服务器上,你需要做这些。首先,请系统管理员用root权限修改 /etc/ssh/sshd_config
,其中 GatewayPorts
应为 yes
。如有必要重启sshd。这件事只需要做一次,所以你可以先跳过这这步,说不定管理员已经修改过了。
然后在你自己的.bashrc
里面添加
export http_proxy=127.0.0.1:3129
export https_proxy=127.0.0.1:3129
这里选定了服务器端的3129端口为代理。注意和下面的远程端口转发对照。
接下来,打开桌面的终端。输入
ssh -R 3129:localhost:3128 user@server_address
这样可以正常登入服务器,而且建立了服务器端的3129端口到桌面的3128的通道。你当然需要自己修改你的 user
和 server_address
。
如果一切顺利的话,你可以测试,在服务器端输入
curl -O https://www.zhaiysci.net/index.html
可以成功我网站的首页,那就证明设置成功了。你应该就可以正常使用conda
之类的包管理器。
使用 AngDesk 建立远程访问服务器终端的方法
这个问题我做过一个视频,可以看看。