还在为计算机无法实现远程操控而郁闷吗?还在为出差时无法登陆公司主机而发愁吗?还在为Teamviewer响应时间长而烦恼吗?

0. 废话

对于一般用户,用 Teamviewer 几乎可以满足需求呢。优点如:安装操作都很简单(图形界面),有免费个人版、中文版,支持所有平台、而且不同平台间可以互相操控,极少出现故障,安全性高,响应时间在可接受范围内。

但是,对于有些对隐私比较在意的人来说,总不太愿意相信 Teamviewer 这种第三方后台运行软件,举例来说,国内大多数人在windows上都会选择用QQ来传输文件,而不选择邮箱,原因除了QQ好友功能提供的方便性以外,它的传输时间确实快,特别体现在体积较大的文件。这可能是因为大多数人给予 QQ 开机自启权限,不在用的时候,也会选择让它后台运行,这个时候它假如扫描硬盘里的文件,提前把文件吸取到自己的云端,当我们需要发送某文件的时候,它只需要在云端里提取该文件,然后发送到另一端,就会节省上传的时间(几乎一半的传输时间)。

对于每天和计算机打交道的广大猿们来说,要借助一个第三方图形软件才能实现远程控制,那要这磨满茧的双手何用?


正文开始,前面的ssh博客内容(Login sever with ssh)里提到在同一局域网里进行ssh穿透登录的基本操作。这儿分享在不同局域网下用ssh远程登录服务器的方法。

1. 内网和外网

简单来说,自己的单位、家庭、小区内部有局域网(LAN);单位、家庭之外有覆盖范围极大的网络,称为广域网(WAN),这个大网络延伸到了我们的单位、家庭(通过光纤、网线、电话线等)。我们把自己的局域网连接到广域网上,那么我们的访问范围就从局域网扩展到了整个广域网。这时候,就说局域网是内网,或称私网广域网是外网(Internet),或称公网。如下图,我们的电脑不是直接连到Internet(外网)的,而是通过路由器(第一层),交换机(第二层)连接的。内网就是从路由器一下开始的,而且IP都是以192开头的IP。

ssh能在同一内网下连接,是以一个Wifi路由器为中心的,基于此思路,我们实现不同局域网(即内网)间连线的步骤是:在任意网络下自己的笔记本用ssh连接到服务器端的外网,然后此外网再连接到它的内网,从而达到不同内网间地穿透登陆。也就是说,知道外网的ip(惯称公网ip),然后ssh到该ip地址,再通过路由器NAT(网络地址转换)进行外网与内网间连接。

2. 路由器+SSH

用路由器结合ssh连接,过程相对简单:利用路由器端口映射功能实现外网与内网间的连通,再用ssh登陆外网ip地址(确保具有公网ip)。

2.1. 设置路由器

TP-LINK路由器为例(其他路由器大同小异),说明如何打开路由器端口映射功能(又称路由器端口转发,路由器虚拟服务器)。点击查看官网图形教程

路由器背面都有网络的的管理地址,连接到该网络后在浏览器输入该地址。登录页面要求输入用户名和密码,按路由器背面提示填写(默认一般都是admin)。进入管理界面,找到端口映射功能(端口转发,虚拟服务器)界面,选择添加。IP地址请填写被访问电脑内网的ip(ifconfig命令查询),内部端口请填写22(如是区间范围,填写22-22),外部端口请写一个5000+的即可,协议类型选择TCP。 保存提交。

2.2. 查看ip

在路由器管理界面可以查看WAN口ip地址,即外网ip。再用m.ip138.com/或者命令行 $ curl ipinfo.io查看外网ip,看是否一致。

正常的网络应该是动态公网ip,也就是路由器里面的WAN口IP地址与m.ip138.com/上面显示的是一致的,不一致的话则说明该网络被电信或者联通做了NAT转发,导致您获取到了一个虚假的IP地址,无法用于外网访问;您已经处于电信或者联通构建的一个大型局域网里面了,不是真正的互联网,动态域名也只能解析到运营商公用网关的那个IP地址。原因是,在当前IPV4下,公网IP作为不可再生资源已经捉襟见肘,而上网用户和上网设备越来越多,所以运营商无法给所有用户提供充足的独立公网IP地址资源了,因此运营商就通过NAT转发技术(网络地址转换)的方法,使部分用户都处于一个大型局域网内,共用同一个外网出口,从而缓解IP压力。

2.3. 连接

如果是公司的网,或者通过投诉获得了动态公网ip,那么直接登录就可以呢。

$ ssh usrname@服务器公网IP -p 对外端口
输入密码:
yes [回车]

但是如果没有公网ip,我们可以使用下面的端口转发方法来进行中转,以回避这个问题。

3. NATAPP端口转发

没有公网ip,我们就需要一个中继站,来实现内网穿透。支持端口转发的软件有很多,比如ngrok,花生壳,natapp等。我用的是natapp,一款基于ngrok的反向代理软件,通过在公网和本地运行的 Web服务器之间建立一个安全的通道。Natapp实际是外网链接的桥梁,客户端链接natapp服务端后,便建立了一个隧道(tunneling),当访问隧道网址的时候,natapp服务端会将数据通过隧道转发到客户端上,实现内网穿透。natapp所有数据都是经过TLS高强度加密,确保数据不会被监听,截取,篡改等。

大致操作过程:在服务器端运行natapp,使natapp主动向服务器某个端口发起ssh连接,形成一个ssh隧道。当我们用自己的笔记本,通过ssh连接到服务器的这一端口时,natapp会把通信内容接力到上述ssh隧道里,最终抵达服务器。这一技术又称ssh反向隧道(reverse tuneling)

3.1. natapp购买及配置

进入natapp官网,注册登录、实名认证之后,开始购买隧道,里面有详细说明每个套餐特征,可以先用免费版试试水。然后开始配置,隧道协议选TCP,本机地址可以不用修改,本地端口改为22,其他空随意填写。注意authtoken一会会用到。

3.2. 安装运行

官网安装页面下载适合服务器系统的版本。然后进入下载好的目录下:

$ unzip natapp_***.zip
$ chmod a+x natapp
$ ./natapp -authtoken=xxx  [note:xxx is your authtoken id]

此时,代表穿透成功。s1.natapp.cc 就是natapp分配的ip地址,端口就是6553,会根据不同的隧道会有所改变,以实际显示为准。

后台运行:

$ nohup ./natapp -authtoken=xxxx -log=stdout &

查看运行状态:

$ ps -ef | grep natapp

Ubuntu开机自启:

$ sudo vi /etc/rc.local
添加 nohup /usr/local/Natapp/natapp -authtoken=xxxx -log=stdout &

更多操作请查看linux后台运行natapp(ngrok)教程,以及natapp(ngrok) Linux 开机自启动.

3.3. 登录

$ ssh myuser@s1.natapp.cc -p 6553
Are you sure you want to continue connecting (yes/no)? yes

当然也可以建立密钥方式登录,注意ssh-copy-id过程中要加-p port参数:

[假如usr:yq. ip:118.31.62.71. port:21921.你不会真试吧?]
$ ssh-keygen -t rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub yq@118.31.62.71 -p 21921
yq@118.31.62.71's password: 
$ ssh yq@118.31.62.71 -p 21921

scp拷贝, -P(大写)选项紧跟在scp后面:

$ scp -P 21921 IU.ADK.649588.dataless yq@118.31.62.71:/home/yq/

4. Teamviewer+SSH

ssh -X可以实现远程桌面操控,但灵活性不如Teamviewer,两者联合起来,岂不更爽!操作也很简单,先用ssh登录,在终端(安装)启动teamviewer,然后获取id和密码,就可以实现登录呢。

$ teamviewer  [启动服务]
$ sudo teamviewer --passwd [Your Password]  [设置密码]
$ teamviewer --info print id  [获取id]
$ teamviewer --deamon restart  [重启]
$ teamviewer --deamon stop  [停止服务]

References: