【内网穿透】前情提要:为什么要内网穿透

简单来说:内网穿透的目的是为了让外网能够访问你处于局域网中的主机,进而能访问到你本地的应用,或者文件。


有同学会问,这有什么作用呢?熊猫酱来举几个栗子:

  • 场景一:你作为后端同学和前端同学在远程联合开发,你每次开发完之后都需要将项目打包到服务器上并后台运行,每次有问题,都需要将 log 下载下来仔细排查,根本没有在 IDE 里打断点调试来的畅快,而且每次修改都需要重新打包、部署…...

这时候,要是前端同学能够直接通过 ip 地址访问到你的应用,岂不美哉。可惜,你的局域网 ip 并不是全世界唯一的公网 ip,你提供了 192.168 开头的 ip 地址,前端同学的路由器在自己的局域网中发现查无此机。

  • 场景二:你需要经常访问一台放置在家里的电脑上的文件,但是你并不想将这些文件保存在云盘或者拷贝在移动硬盘中,这时候,能够直接访问到家里的那台电脑,并轻松访问到文件就很方便了。
  • 场景三:你家里的路由器经过你一番折腾刷了固件之后可以科学上网,这样你就可以不用在每一台想要自由上网的设备上安装相应配置。但是当你出门之后,你就无法再享受到这种服务了,这时候如果将你的所有网络请求都交给家里的路由器来转发,再将结果由路由器转发回来,随时随地,都可以科学上网。

一、先明确几个概念

1. IP 地址

网络中唯一确定一台上网设备的逻辑地址,类似于身份证号或者电话号码。

IP 地址分为公有地址和私有地址,其中公有地址是唯一的,私有地址是可以重复的。

// 私有地址有三大类:
A类:10.0.0.0~10.255.255.255
B类:172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255

一般小型局域网会选择 192.168 开头的,如家用路由器;中型局域网会选择 172.16 开头的,如某些公司或单位的路由器;大型局域网会选择 10. 开头的,比如高校等大型机构。

私有地址可以重复极大的节约了紧缺的 IPV4 地址,但也意味着你路由器为你分配的局域网IP 192.168.xxx.xxx ,可能在另一个局域网中也恰好有主机与你 IP 相同。就好比全国有几十个南京路一样,不指出是哪一个城市根本无法确定具体是哪一条路。

2. 域名

IP 地址是一个 32 位的数字,要记住很多没有任何规律的数字简直是强人所难,而域名的出现则解决了这个问题。域名是 IP 的别名,最终通过 DNS 解析成 IP 地址。

比如 thinpanda.top 就是一个顶级域名,每一个域名就相当于你自己的一个小王国,你可以按照自己的需求和喜好划分子域名,就像给王国划分区县,然后在域名服务商处做相应的解析,让他们分别表示不同的应用和服务,互不干扰。

DNS 解析过程

比如说,我们可以在 shell 或命令行中输入:ping www.baidu.com 则会显示出百度的 IP 地址。这里要说明的一点是,为了减轻各级域名解析服务器的压力,一般对于之前已经解析过得域名,会在本地维护一份缓存,也就是常说的 host 文件,浏览器每次发起请求时都会先去缓存中查有没有对应的记录,如果没有的话才去解析,所以科学上网的一种办法就是直接修改 host 文件

3. NAT 协议

NAT(Network Address Translation)即网络地址转换协议,NAT 能将本地地址转换成全球唯一的公网 IP 地址。

当有一台设备接入 WIFI 或连入局域网时,由 DHCP 协议(动态主机路由协议)为设备随机分配一个未使用的私有 IP 地址,或者用户自行指定一个 IP 地址。这时,路由器会维护一个 NAT 表,将这个设备的位置记录下来,然后通过 端口多路复用技术 使所有在局域网中的主机共享一个路由器的对外公网 IP 实现对 Internet 的访问,既可以最大限度的节约 IP 地址资源,同时还可以隐藏网络内部的所有主机,有效避免来自 Internet 的攻击。

DHCP 协议可以使你的设备在加入局域网的时候由路由器分配一个 IP 地址,当你断开 WiFi 时会将 IP 回收,打开电脑的 IPV4 设置,可以看到有个选项是 自动获取 IP 地址 ,这说明你的电脑正在使用 DHCP。值得注意的是,由路由器分配的这个 IP 地址是由租期的,在租期结束之前路由器会重新分配,你有可能获得新的 IP 地址,也有可能不变,你可以手动续租保持之前的 IP 不变。

在局域网内部访问其他主机,由于 DHCP 会导致 IP 变化,你可以采用主机名而不是 IP 地址来访问对方的电脑。

DHCP设置获得IP地址

NAT 的实现方式有四种,但常见也使用最多的是端口多路复用技术,所谓端口多路复用技术,就是让处于局域网内部的主机都通过路由器的对外 IP 来访问 Internet,路由器根据 NAT 表辨认各个主机,使用不同的端口来转发不同主机的数据包,避免不同主机的数据产生混淆。

NAT协议解析过程

4. 代理

代理即 proxy,被广泛用于一些软件和设计模式中,主要分为正向代理和反向代理。

正向代理和反向代理的区分是通过代理之后使谁的真实地址被隐藏。

正向代理

正向代理隐藏了真实的请求客户端,所有客户端的请求都同意交给代理来发送给服务器,请求经过代理转发之后服务器不知道真实的客户端是谁。

常见的正向代理是科学上网工具,你可以在国外搭建一台代理服务器,让代理帮你请求 google.com,代理接受到响应之后再返回给你。

正向代理中,client 和 proxy 同属一个 LAN,对 server 透明。

反向代理

反向代理隐藏了真实的服务端,当客户端向服务器发起请求时,请求首先交给代理,由代理决定该请求具体由哪一台服务器进行处理。用户感觉自己每次都在访问同一台服务器,但其实代理根据访问类型将请求分发给了不同的服务器,就像你打客服电话,输入相同的号码,每次拨打都是不同的客服来解决你的问题。

常见的反向代理是 Nginx,它是性能非常好的反向代理服务器,常用来做负载均衡。

正向代理中,server 和 proxy 同属一个 LAN,对 client 透明。

二、常见的内网穿透产品

简单来说实现不同局域网内的主机之间通过互联网进行通信的技术叫内网穿透。

同处一个局域网之中的主机之间可以通过内网 IP 进行通信,但处于不同局域网的主机之间要想通信,需要借助一台具有公网 IP 的服务器进行桥接,它能够被处于各自局域网之中的双方都访问到,并作为代理将请求和响应进行转发。

ngrok

常见的免费内网穿透工具有:ngrok系列和 frp。

为什么说是 ngrok 系列呢?因为 ngrok 目前有两代产品:ngrok 1.x 开源、ngrok 2.x 闭源收费。ngrok 使用 go 语言开发,源代码分为客户端和服务器端,开源的 1.x版本被爆出有内存泄漏的问题,而且需要使用者手动去编译文件,有一定的门槛,所以很多公司拿了 ngrok 1.x 的源代码,把里面的代理服务器换成自己的,稍微改了改套个壳,顺便修复了一下内存泄漏的 bug(也有可能没修复),就发布了自己的内网穿透产品。

经过我自己测试和实际使用感受,值得使用的有三款,大家根据情况自己选择。

具体的配置过程见[下一篇文章]()。

1. ngrok

  • grok 安装配置比较繁琐
  • 只有英文文档
  • 支持自定义域名和子域名
  • 支持将代理设置在自己的服务器上
  • 监听所有隧道上的HTTP消息包,方便分析请求报文和响应报文,协助排查问题
  • 有内存泄漏隐患

2. frp

  • [frp]() 安装配置比较繁琐
  • 有中文文档
  • 支持自定义域名和子域名
  • 支持将代理设置在自己的服务器上
  • 有仪表盘可以查看访问量统计,但没点卵用

3. cpolar

  • cpolar 安装配置十分简单
  • 网址全中文
  • 付费自定义子域名
  • 监听所有隧道上的HTTP消息包,方便分析请求报文和响应报文,协助排查问题
  • 代理是官方提供的服务器,不支持在自己服务器上设置代理,有数据泄露隐患

具体的安装和配置过程,请见下一篇。

最后修改:2019 年 06 月 25 日 03 : 58 PM
如果觉得我的文章对你有用,请随意赞赏