Close

内网透传解决方案之ngrok(已转投Frp)

#2017/09/08 更新说明

因流量和带宽的限制缘故,本人已弃用ngrok,转而使用frp。frp比ngrok部署和使用更为简单,稳定性也很好,推荐使用。可以自行搭建中转服务器或者搜索国内共享的frp中转服务器。

详情请参考中文文档 https://github.com/fatedier/frp

#2015-12-04更新说明

tunnel.mobi已不能使用。自己尝试搭建一个服务,但是访问速度有些慢,于是废弃。目前新的可用的几个服务器:

http://natapp.cn/ (个人正在使用)

http://qydev.com/

1.背景介绍:

去年在家里组装了一个ITX机箱用来做黑群辉,并配了两块硬盘。主板是翔升迷你D525工控主板(凌动Atom双核四线程 1.8GHz, 2G RAM,1000M网卡),上面跑了aria2,svn,samba,ftp,web,迅雷远程等服务。主要用于下载资源,存储代码,电影和照片等,方便在不用设备上都可以浏览和修改。通过samba共享,也算是小米盒子的一个资源库。这块板子性能还行,作为下载的nas使用完全够了。不过由于群晖系统还是有些局限性,后来就安装了ubuntu系统,重新搭建了以上服务。这个时候这个主板就有点闲的性能不足了,主要体现在显卡方面。基本上没法用图像界面,只能是远程ssh登陆上去。前不久,在某宝上看到一块不错的板子,映泰 N3150NH 带集成整合英特尔四核CPU,功耗更低,性能更强。于是入手,再加了一个sata扩展器,下挂3块3T的硬盘,正常运行功耗在30W的样子,由于是24小时开机,这个功耗还算是可以接受,一个月也就是十多块钱的电费。

前几个月家里宽带升级到了50M,上行4M。平时白天大部分时间都不在家,宽带闲着也是浪费,自然是要充分利用起来。由于电信宽带IP地址分配的“不稳定”(有时候分配到公网IP,有时候分配到私网IP),大部分时候分配到的是100.x.x.x的私网IP地址。也懒得打电话去跟电信客服扯这个事,估计用处也不大,凡事最终还得靠自己。这种情况下由于没有公网IP,ddns这条路算是走不通了。为了图方便,年初的时候买过一个“花生棒”,也就是一个花生壳的内网版硬件。这算是一个比较坑的产品,本来是很简单的一个硬件产品,标价近200块钱的价格。在特价的时候花了98买了一个。使用上是免费级别,每个账号可以有两条映射,每个月2G的流量(目前已经增加到4G),带宽是1M。如果闲不够用也可以升级服务到商业级或者旗舰级,那价格也是贵的离谱。(主要是提供的服务不值那个价)。流量倒是还好,但是1M的带宽和最多两条映射,实在是捉襟见肘。目前映射了aria2(用于远程控制nas进行下载)和ssh(远程管理和配置nas),其他服务就没法管理了,只有干瞪眼。最近放假期间,逛openwrt论坛的时候看见有人提到可以使用ngrok或netcat实现这种功能,于是很是感兴趣,就上网收集了一番资料。发现使用的人还不少。

先谈谈自己之前对内网透传的认识。之前做过一些网络设备相关的底层开发,对数据交换过程还是有一些了解。一般的网络设备都有默认的防火墙,这类防火墙默认情况下一般都是“只管进,不管出”,即对于LAN侧往WAN的数据包基本上不会有阻拦,而对没有允许的WAN侧发我LAN侧的数据包则是直接丢弃。这种情况下,如果WAN侧的数据包要想进到LAN侧,要么防火墙有专门配置允许WAN侧某种特定端口,协议,IP的报文可进入到LAN侧并转发到LAN侧某个设备,要么就是根据防火墙中已经建立的连接跟踪的记录进来。所谓的连接跟踪就是对数据连接的一个临时记录表,放置在内存中,属于防火墙的一个模块,用途是提高防火墙的识别效率。一个陌生的报文经过防火墙时,如果是合法的,防火墙会进行记录它的源地址,目的地址,源端口,目的端口,协议类型等信息,这每一条记录就是一条连接跟踪记录。下次有匹配这条记录的报文到达防火墙模块时,可以直接根据这个记录进行甄别,省去了去匹配防火墙规则表的时间,效率就很高。比如最常用的web浏览器上网,LAN的电脑访问baidu.com,当报文顺利通过路由器防火墙去往WAN侧时,防火墙会记录这条请求的LAN侧主机IP,端口号协议等,以及WAN侧baidu的IP地址端口等。baidu的服务器收到请求后回复给路由器相关的信息报文,路由器在链接跟踪表中查到这条记录是LAN侧请求所需要的,就放行并转发到LAN侧特定的电脑。如果没有查询到这条记录,就回去匹配防火墙的规则表,如果规则表中没有运行这种报文进入,这个报文默认就会被丢掉。这就是为什么上网的时候WAN侧的报文可以回到LAN侧特定主机的原因。同样的,如果是LAN侧没有请求,而是WAN侧主动发起的,这个时候就得去匹配防火墙规则了,看有没有开发这个协议和端口到LAN侧。

外网WAN侧的主机主动发起连接到内网LAN侧的某个主机,要么路由器本身有一个公网IP,WAN侧主机可以访问到路由器,路由器再开启相应的端口将数据包转发到LAN侧特定的主机。如果这个IP是固定的,那么直接访问就是了。如果这个IP不是固定的,即路由器每次PPPoE拨号上网都分配到的是一个不同的公网IP,那么使用路由器的DDNS功能,将动态IP转成特定的域名,WAN侧主机通过域名也是可以访问到LAN侧主机的。 如果路由器拨号获取到的是一个私网地址,即电信运营商为了解决IPv4地址不够的问题,在自己的内部网络中已经做了一次NAT操作了。这个时候路由器获取到的就始终是一个私网地址。网上其他电脑通过这个IP地址是无法访问到路由器的,就更别提转到路由器的LAN侧了。

在这之前,我所知道的几种解决内网透传的方法有以下几种。

1. QQ,Teamviewer等,这类软件可以实现远程数据传输,远程桌面控制等高级操作,甚至是p2p的文件传输。利用的原理其实也是连接跟踪。即LAN侧的主机,例如A,不停地和公网的服务提供商的服务器,例如B,保持联系,这样服务器就能及时获取LAN侧客户端软件的状态,甚至进行控制。只要这个A发往B的请求不断开,那么连接跟踪就一直存在,服务器B就可以随时对A进行控制。如果网上的另外一台电脑C想和这台A进行聊天或者远程桌面,服务器B就可以将A的信息高速给C,经由B的信息传递和转发,A和C之间就可以进行数据通信。

优点是方便,功能强大,缺点是需要特定的客户端软件,数据类型和端口不可指定,自由度不高。

2. vpn,N2N,netcat等,这类软件实际是在LAN侧和WAN侧的主机之间建立了一个隧道,即一个虚拟的专用网,在这个网络中两者的通信不受其他任何设备的干扰,如果带上加密功能,通信过程中的保密性也很高。

优点是比较稳定,缺点是vpn经常被封杀,也是需要客户端,尽管这个客户端很简单。还有就是太过复杂。

3. nat123,花生棒,ngrok等,这类和第一类的teamviewer有些类似,都是通过第三方服务器进行数据中转,不同的是这几个更加侧重于数据本身。nat123使用起来比较麻烦,花生棒太贵,限制太多,而ngrok本身代码是开源的,国内也有提供免费的公共服务,使用起来就一句命令,算是很简单了。

 

2. ngrok相关使用

之前在网上搜过不少ngrok的资料,今年初的时候ngrok官网被墙,国内有人搭建了一个功能功能的服务,试过一下还不错,但还是存在一些问题,后面会提到。

以下是ngrok源代码的GitHub地址

https://github.com/inconshreveable/ngrok

目前官方只公布了1.x版本的源代码,2.0版本的还没有开源,也许不会公布。不过1.x版本的已经够用了,最新的版本是1.7。之前下载了一个linux版本的客户端,死活无法运行,总是提示“可执行文件格式错误”。后来自己觉得可能是下载的64位版本了,我的nas是32位的linux版本。于是又去官网找了一下,果然有个32位的版本藏在一个隐蔽的地方,下载后终于运行成功。如果你也是用的32位的linux系统,可以翻墙去官网下载。另外,1.x的ngrok指令格式和2.0是完全不一样的,不要用错或者混用。

以下是国内的提供的公共的服务器,官方的已经被墙不能用了。具体的使用方法,此网站有详细的介绍。另外此网站下载的linux客户端是64位的版本,在32位机器上是用不了的,如果用32位的linux机器,还是得去官网下载。

http://www.tunnel.mobi/

 

一篇写的很好的ngrok原理分析的文章

http://tonybai.com/2015/05/14/ngrok-source-intro/

 

以下是官方提供的搭建ngrok私有服务器的方法文档

https://github.com/inconshreveable/ngrok/blob/master/docs/SELFHOSTING.md

 

以下是网友分享的私有服务器的搭建方法

http://tonybai.com/page/4/

https://imququ.com/post/self-hosted-ngrokd.html

 

3. 遇到的问题

在使用tunnel.mobi提供的服务过程中,映射http相关的服务是没有问题的,比如aria2,web等等,但是映射ssh时遇到一些问题,隧道建立之后ssh服务连接不上,尝试过很多次,应该是服务器那边有问题。如果ssh不行,那么svn也是不行的。已经发邮件给tunnel.mobi寻求帮助,到目前为止还未收到回复。如果后面有必要的话还是自己搭建一个私有的ngrok服务。主要是当前使用的vps在国外,估计网速比较慢。

 

最后附件为ngrok相关的命令操作说明,是官网说明文档的滚动截图。可以另存为后查看。

2015-09-27_095212

 

2015年10月9日更新:

之前因为ssh不能映射的问题发邮件给tunnel.mobi的管理员寻求过帮助。根据tunnel.mobi管理员的邮件回复,目前没有开发TCP tunnel,后期也不计划开放。因此,如果想要使用TCP tunnel,还是自己搭建一个服务器吧。

分享到: 更多

About pulller

pulller

1 thought on “内网透传解决方案之ngrok(已转投Frp)

Comments are closed.