一、前言
因为某种原因办公室没有互联网,而寝室是可以联网的,所以配置的一台台式机是放在寝室使用的。但是平常做课题大部分时间还是在办公室,所以就产生了在办公室远程登陆寝室电脑的需求。最初的时候是想利用向日葵、VNC、teamviewer等远程登陆软件直接进行界面操作,后来觉得移动流量消耗太大,而且网络不稳定,所以就放弃了这种方法。以前项目开发时有用过一些远程登录的工具,如Xmanager套件的Xshell、Winscp、vnc等工具,所以决定采用这种无界面的远程访问模式。
根据以前项目开发的经验,远程访问的需求主要有三个方面:
远程界面访问
利用向日葵、VNC、teamviewer等软件实现远程界面控制,但是该方式是实时视频流传输,因此对网络速度的要求较高。此外,这类软件大多属于商业软件,部分服务收费。
由于我远程控制的是Ubuntu系统,对界面操作的需求不高,绝大部分工作都可以通过命令行下的指令完成,所以,我选择舍弃这个需求。
远程指令操作
因为是工作需求,没有娱乐等需求,绝大部分的操作都是文件浏览、代码编写、实验运行等工作,基本都可以通过指令操作完成,所以需要能够进行远程的指令操作。这里选择常用的SSH服务实现远程登陆,然后输入指令进行命令操作。SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。windows下常用的软件是putty、Xshell等。
远程文件交互
有时候还需要进行一些文件的交互,比如把远程电脑的文件拷贝到本地电脑或者把本地电脑的文件拷贝到远程电脑上。虽然在命令行也可以通过TCP服务来完成,但是每次都需要输入指令,操作复杂,而且对于多个文件的处理比较麻烦,所以需要选择一个可以进行远程文件交互的软件,进行可视化操作。
明白了需求之后开始进行技术实现。因为之前在项目中用到的远程访问中,远程电脑和本地电脑都在同一局域网下,所以进行基本的网络IP、端口配置即可很容易的实现。但是现在办公室和寝室不在同一局域网下,只能通过互联网进行远程访问,而这个过程中间必须要有一个代理服务器来做传输。在网上搜索后发现了一个开源项目ngrok。ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。ngrok 是一个开源程序,官网服务在国外,国内访问国外速度慢。国内也有一些基于ngrok的服务: natapp,frp,nat123端口映射,内网通 等。在尝试官方ngrok原声服务失败后,我选择了经过二次开发的国内ngrok服务。最初尝试了免费版的natapp服务,配置相对简单,使用也方便,所以就选择了购买VIP,一个月5块,价格也不贵。(非广告,因为其它几个没用过,所以不好评价。从原理上来说都属于ngrok服务,差别不打,主要看各家的服务器好坏了)。下面主要以natapp为例进行说明。
二、NATAPP配置
1.TCP型隧道配置
首先登录NATAPP官网(https://natapp.cn/)进行用户的注册与登录,然后进入用户界面,如下图所示
选择购买隧道,如下图所示
在“购买隧道”界面根据个人需要选择不同的服务。然后进入配置界面(这里以免费隧道为例)
这里需要注意的是需要将“隧道协议”改为TCP,因为我们要用的是TCP的转发服务。其它选择默认即可,然后“免费购买”。
之后会在“我的隧道”里看到配置完成的结果
这里需要将第四项的authtoken码拷贝下来,后面会用到。
以上就完成了官网的配置,下面就是配置远程端和本地端了。
2.Ubuntu 16.04/远程端操作
此部分可以参考官网文档。
下载客户端
首先在Ubuntu 16.04系统(远程端)下下载NATAPP客户端(http://download.natapp.cn/assets/downloads/clients/2_2_2/natapp_linux_amd64_2_2_2.zip),然后解压后得到一个可执行文件natapp。然后修改natapp的权限:
sudo chmod a+x natapp
编辑配置文件
增加配置文件conf.ini(https://natapp.cn/article/config_ini),免去每次运行都输入authtoken等基础配置。新建文件conf.ini,拷贝如下内容(也可直接 下载(右键另存为) 后自行修改)(http://download.natapp.cn/assets/downloads/config.ini):
#将本文件放置于natapp同级目录 程序将读取 [default] 段
#在命令行参数模式如 natapp -authtoken=xxx 等相同参数将会覆盖掉此配置
[default]
authtoken=隧道的authtoken #对应一条隧道的authtoken
clienttoken=#对应客户端的clienttoken,将会忽略authtoken,若无请留空,
logto=none #log 日志文件, 可以是 none 代表不记录 或者 stdout 代表直接屏幕输出 ,默认为none
loglevel=DEBUG #日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy= #代理设置 如 http://10.123.10.10:3128
将上面的authtoken后的”隧道的authtoken“修改为在上一节”TCP型隧道配置“中记录的authtoken码,保存即可。
注意需要将natapp文件与conf.ini文件放置在同一目录下。
运行服务
执行以下指令运行natapp服务:
./natapp
出现以下界面:
此时,代表穿透成功.
此时你的应用的 ip地址就是s1.natapp.cc (没有tcp://的前缀) 端口就是6553。(s1.natapp.cc 根据不同的隧道会有所改变,以实际显示为准)
3.OSX/本地端远程指令操作
由于我的笔记本是macbook pro,所以这里只能演示OSX下的操作。理论上,Windows下是类似的。
在OSX的终端输入以下指令:
ssh user@s1.natapp.cc -p 6553
其中,user为远程端的电脑用户名,s1.natapp.cc为前面远程端显示的ip地址,6553为前面的端口号。免费隧道的端口号每次启动natapp都会重新分配,所以每次都需要对应,而vip隧道为用户开通专属端口,所以是个固定的端口。此外,免费版存在掉线重连现象。所以个人还是建议开通VIP,5块钱/月也不贵。
之后会提示输入Ubuntu/远程端的电脑用户密码。输入正确后即可以在终端进行各种远程指令操作了。
4.OSX/本地端远程文件交互
osx系统可以选取Transmit或者commander等软件(Windows下选择其它类似软件)。这里以Transmit为例。
打开Transmit软件后,选取右边上方的“SFTP”出现以下窗口。
填入对应的内容即可,Server对应natapp服务的隧道ip地址,User Name为Ubuntu/远程端的电脑用户名,Password为Ubuntu/远程端的电脑用户密码,Port为natapp服务分配的端口号。配置完成后选择“Connect”,出现如下窗口:
此时即连接成功。此时窗口中,左侧窗口对应本地端的文件系统,右侧窗口对应远程端的文件系统,通过简单的拖拽操作即可实现简单的文件交互。
5.natapp Linux下使用 supervisor 后台运行&开机启动
官方给出了一个教程,不过这里的教程过于简单了,我在这里详细描述下。根据官方的教程,后台运行与开机启动的原理主要是用到了后台进程管理工具supervisor。supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。这里我参考网友文章的一些内容。
supervisor安装与配置
直接利用ubuntu的apt-get进行安装:
sudo apt-get install supervisor
然后是配置文件的编辑。在路径 /etc/supervisor/下应该有主配置文件supervisord.conf和配置文件夹conf.d,如果没有的话需要输入指令生成:
mkdir -m 755 -p /etc/supervisor/
mkdir -m 755 conf.d
natapp配置文件
打开主配置文件supervisord.conf,在最后添加
[include]
files = /etc/supervisor/conf.d/*.ini
然后在配置文件夹conf.d下新建natapp的配置文件natapp.ini,在文件内补充内容:
[program:natapp]
command = path_to_file_natapp -authtoken=xxxxxx -log=stdout ;设置natapp执行文件的路径以及authtoken码
directory = path_to_doc_natapp ;设置natapp执行文件所在目录
process_name= %(program_name)s_%(process_num)s
numprocs= 1 ;注意这里只能为1
autostart = true
autorestart = true
;以下为日志,按实际情况修改
stdout_logfile = /var/log/supervisor/natapp_stdout.log
stdout_logfile_maxbytes = 10MB
stderr_logfile = /var/log/supervisor/natapp_error.log
stderr_logfile_maxbytes = 10MB
测试
启动supervisor
sudo supervisord -c /etc/supervisor/supervisord.conf
查看supervisor服务运行情况:
pstree -p | grep supervisord
发现已经有个supervisor监控下的natapp在运行。
也用 supervisorctl 查看已经被监控的program
supervisorctl -c /etc/supervisor/supervisord.conf