NAT traverse by ssh
Contents
还在为计算机无法实现远程操控而郁闷吗?还在为出差时无法登陆公司主机而发愁吗?还在为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:
Author Qiang
LastMod 2018-11-11