概述

1. 为什么需求内网穿透

要想说清楚为什么需求内网穿透, 需求先说清楚什么是内网, 什么是公网

内网和公网是计算机网络中两个常用的概念,它们指的是不同的网络规模的拜访权限.

  1. 内网: 内网是指由一个安排或机构内部运用的私有网络。它通常用于安排内部的通讯、数据同享和资源拜访。内网能够包括办公室、学校、企业等安排内部的局域网LAN或广域网WAN。内网中的设备通常具有私有IP地址,并经过路由器、防火墙网络设备与外部网络(即互联网)阻隔。
  2. 公网: 公网是指公共互联网,即全球规模的互联网。它是由各种网络和设备衔接而成的全球性网络,用于衔接全球的计算机和设备,供给各种互联网服务和资源。外网是公共的,任何衔接到互联网的设备都能够经过网络协议进行通讯和拜访外部资源。

私有网段地址

  • 10.0.0.0/8 (可支撑16,777,214个主机地址)
  • 172.16.0.0/12 (可支撑1,048,574个主机地址)
  • 192.168.0.0/16 (可支撑65,534个主机地址)

现状

因为IPV4运用32位来表示, 大约总空间约42.9亿(包括了私有地址), 导致呈现IPV4地址稀缺的状况, 然后就延申出了另外一个技能NAT, NAT技能的呈现大大缓解了IPV4地址不够的状况, 可是因为NAT技能的特色是在一个大的局域网中同享一个公网IP(后边具体介绍NAT技能), 所以又延申出来一个新问题, 也便是咱们个人的IP地址根本上都是192.168这个私有网段, 然后导致不能够被外部直接拜访. 内网不能够被直接拜访, 就需求凭借今天的主角内网穿透来处理这个问题.

一文看懂内网穿透

2. 内网穿透运用场景

  1. P2P场景, 例如机器A想要直接和机器B通讯,不想凭借中间商, 在高实时性通讯中P2P具有肯定的优势
  2. 内网有一个服务, 希望外部也能够拜访
  3. 跨局域网运用 SSH, 微软RDP
  4. 私有化
  5. 等等

NAT技能

内网穿透有许多别号,比方打洞, 其间有一个别号便是NAT穿透, 既然是要对NAT进行穿透, 避免不了先了解NAT技能

NAT的全称是 Network Address Translation(网络地址转化), 首要负责将内部的私有IP地址转化成能够在公网运用的公网IP, NAT技能除了能够有效的节约IPV4公网地址, 还能够用来隐藏其内网IP, 来供给安全性.

一文看懂内网穿透
(图片来自网络)

NAT 完结方法

NAT完结方法分为

  • 静态NAT
  • 动态NAT
  • NAPT

静态NAT

静态NAT是指一个公网IP地址对应一个私有IP地址,是1对1的转化.

内网IP 外网IP
192.168.21.20 120.152.168.222
192.168.21.21 120.152.168.223
192.168.21.22 120.152.168.224
192.168.21.23 120.152.168.225

NAPT

在基础NAT中,私有地址和公网地址是1对1的转化联系, 它只处理了公网和私网的通讯问题,可是没有处理公网地址不足的问题

NAPT的全称是(Network Address Port Translation), 能够看到多了一个Port, 也便是在做转化时会将IP地址和Port号一起进行转化.

NAT表

一文看懂内网穿透

(图片来源于网络)

看一个实践的例子:

当时环境

  • 私网主机A (10.0.0.1/24)
  • 公网服务器地址 (61.144.249.229)
  • 路由器RT上装备 NAPT, 地址池 219.134.180.11 – 219.134.180.20

A → Server

一文看懂内网穿透
(图片来源于网络)

  1. A向公网服务器地址(简称Server)发送报文, 网关是RT( 10.0.0.254/23), 意图地址和端口号是61.144.249.229:80, 源地址和端口号是10.0.0.1/24

一文看懂内网穿透

(图片来源于网络)

  1. RT收到 IP 报文后,查找路由表,将 IP 报文转发至出接口,因为出接口上装备了 NAPT ,因而 RT 需求将源地址 10.0.0.1:1024 转化为公网地址和端口。
  2. RT 从地址池中查找第一个可用的公网地址 219.134.180.11 ,用这个地址替换数据包的源地址,并查找这个公网地址的一个可用端口,例如 2001 ,用这个端口替换源端口。转化后的数据包源地址为 219.134.180.11:2001 ,意图地址和端口不变。一起 RT 在自己的 NAT 表中添加一个表项,记载私有地址 10.0.0.1:1024 到 公网地址 219.134.180.11:2001 的映射。RT 再将报文转发给意图地址 61.144.249.229 。

假如 B 也要拜访 Server ,则 RT 会从地址池中分配同一个公网地址 219.134.180.11 ,但分配另一个端口 3001 ,并在 NAT 表中添加一个相应的表项,记载 B 的私有地址 10.0.0.2:1024 到公网地址 219.134.180.12:3001 的映射联系。

一文看懂内网穿透

(图片来源于网络)

NAPT的首要类型

NAPT首要被分为了两大类型: 锥型NAT和对称型NAT, 其间锥型NAT又分了几种,总结下来NAPT被分为了以下类型:

  • 彻底锥型
  • 受限锥形
  • 端口受限锥型
  • 对称型NAT

注意一切类型在最新的RFC 5780都具有两种行为 Mapping(映射), Filtering(过滤), 其间映射是值私网拜访外部,NAT服务器做的一个联系映射, 过滤是指外部拜访内部时NAT服务器做的一层过滤(首要是如何转发到内网,以及是否允许转发到内网), 其间前三中类型的映射规矩都是相同的, 只要对称型NAT映射规矩不相同

彻底锥型NAT

特色 映射规矩 过滤规矩
IP和端口都不受限 一切主机A拜访的外部部服务都被映射到同一公网IP和端口 将私有网络的源IP地址和端口映射到公网IP某个端口,只要是这个私有网络的源IP地址和端口号都将被映射到这个公网IP和端口,也便是假如外部知道这个映射的公网IP和端口,就能够经过这个公网IP和端口和私有网络的源IP和端口进行通讯

一文看懂内网穿透

受限锥形

特色 映射规矩 过滤规矩
IP受限,端口不受限 一切主机A拜访的外部部服务都被映射到同一公网IP和端口 在公网映射端口后,并不允许一切的IP对该端口的拜访, 假如想要拜访这个内部主机,就有必要是内部主机有对这个外部主机进行过拜访, 假如现在内部主机拜访了外部主机A,可是没有拜访外部主机B, 那经过主机A是能够拜访内部主机的,可是经过主机B是拜访不到内部主机的.

一文看懂内网穿透

端口受限锥型

特色 映射规矩 过滤规矩
IP和端口都受限 一切主机A拜访的外部部服务都被映射到同一公网IP和端口 相较于受限锥形它会愈加严厉,不仅仅对IP地址添加限制, 还会对端口号添加限制, 比方主机A拜访了外部主机A的80端口, 那么只要外部主机A的80端口能够与这个主机A进行通讯, 假如运用的是8080将直接被NAT丢掉

一文看懂内网穿透

对称型NAT

特色 映射规矩 过滤规矩
IP和端口都受限 主机A内部的拜访不同服务都会被映射成不同的公网IP和端口, 过滤规矩与端口受限型相同

一文看懂内网穿透

NAT穿透

NAT穿透也被称为打洞, 也便是我在NAT上开一个小洞, 只要是经过这个洞外部就能够主动与私网进行通讯

打洞的简单逻辑如下:

一文看懂内网穿透

让私网机器主动经过NAT拜访服务器, 服务器就能够记住NAT映射后的公网IP地址和端口号, 后续能够将这个IP地址和端口号奉告其他私网机器, 使得私网机器能够拜访其他私网机器

完整逻辑:

一文看懂内网穿透

解释:

  • 经过打洞服务器收集到私网机器A和私网机器B的公网IP地址和端口号, 因为打洞服务器处理公网,所以私有机器是能够主动拜访打洞服务器的, 而且主动拜访完结之后会在各自内网的NAT表上记载一个映射地址.
  • 打洞服务器收集到A和B的公网IP和端口号之后, 将数据进行交流, 把A的公网IP地址和端口给到B, B的公网IP地址和端口给到A
  • 当A知道了B的公网IP和端口之后, 会尝试着去和这个公网IP和端口进行通讯, 这一步的意图首要是因为除了彻底锥型NAT之外其他的NAT类型的过滤规矩都会去检测接收到的数据包的源IP地址是否在自己NAT映射表中存在. 比方 A机器主动经过B的公网IP和端口发送数据之后, 就会在A机器的NAT映射表中记载上B机器的公网IP和端口号, 适当所以自己给B机器的公网IP和端口号开了一个口儿, 使其B机器运用自己的公网IP和端口号能够与A进行通讯
  • 当B知道了A的公网IP和端口之后, 会同步上面的过程, 也会给A在自己的NAT映射表中开一个口儿,使其A能够经过这个IP地址和A的公网IP地址直接拜访到B
  • 当A和B都给自己开了一个口儿之后, A和B就能够进行P2P通讯了

不同NAT类型的打洞对比

Peer A Peer B 是否能够打洞
彻底锥型 彻底锥型
彻底锥型 受限锥形
彻底锥型 端口受限锥型
彻底锥型 对称型NAT
受限锥形 受限锥形
受限锥形 端口受限锥型
受限锥形 对称型NAT
端口受限锥型 端口受限锥型
端口受限锥型 对称型NAT
对称型NAT 对称型NAT

为什么对称型和对称型 & 端口受限型和对称型打洞不能成功?

对称型的特色:

拜访外部的不同服务都会被映射到不同的IP地址或许端口号, 那咱们先看第一步, 服务去获取两边的公网IP之后两边的NAT映射表是什么状况, 假定机器A的私网IP是10.0.0.1, 机器B的私网IP是10.0.0.2, 打洞服务器获取到的A的公网IP和端口是3.3.3.3:1000, 获取到B的公网IP和端口是4.4.4.4:2000, 打洞服务器自身的公网IP和端口是5.5.5.5:3000, 获取完结之后NAT映射表如下:

机器名 意图
A 3.3.3.3:1000 5.5.5.5:3000
B 4.4.4.4:2000 5.5.5.5:3000

在服务器获取完公网IP并在A和B之间交流了公网IP, 现在A和B需求进行相互拜访, 来进行打洞, 相互拜访完结之后A和B的NAT映射表如下(A和B是对称型和对称型):

机器名 意图
A 3.3.3.3:1000 5.5.5.5:3000
3.3.3.3:1002 4.4.4.4:2000
B 4.4.4.4:2000 5.5.5.5:3000
4.4.4.4:2002 3.3.3.3:1000

按照对称型的筛选准则, 源和意图的端口IP有必要完美匹配, 也便是假如A想要拜访B, 而且被B接收到数据, 那便是有必要拜访B的4.4.4.4:2002 (可是因为这个端口生成规矩是B的映射表主动生成的, A不可能知道), B想要拜访A就有必要拜访A的3.3.3.3:1000(可是因为这个端口生成规矩是A的映射表主动生成的. B不可能知道). 好了陷入了一个死循环.

为什么对称型和受限锥形&彻底锥型能够打洞?

还是和上面相同的流程, A是对称型NAT B是彻底锥型NAT, 在执行完前面的流程后, A和B的映射表如下

机器名 意图
A 3.3.3.3:1000 5.5.5.5:3000
3.3.3.3:1002 4.4.4.4:2000
B 4.4.4.4:2000 5.5.5.5:3000
4.4.4.4:2000 3.3.3.3:1000

不同点在于B的NAT映射表里的两条数据中的源都是4.4.4.4:2000, 而且这个公网IP和端口号A是知道的(经过打洞服务器交流了各自的IP和端口号), 那现在A给B发送数据B是能够收到的, 比方B收到了3.3.3.3:1002发送来的数据, 就能够直接运用给3.3.3.3:1002回送音讯了.

内网穿透之反向署理

说完了NAT穿透, 发现有几种NAT类型组合之后会存在穿透失败的状况. 为了处理内网穿透的100%成功率, 有一个反向署理的技能能够完结. 要说反向署理能够先说清楚署理

署理技能在咱们日常运用中经常运用到, 常用的署理形式有三种

  • 正向署理
  • 反向署理
  • 通明署理 (通明署理和正向署理根本一直,区别在于拜访者不需求知道署理服务器的存在, 彻底通明)

正向署理

一文看懂内网穿透

正向署理也是日常运用中触摸最多的一种署理形式, 正向署理是指机器A想要拜访某个服务, 需求经过某个署理服务器. 经过咱们需求在机器A上装备署理服务器的地址和端口, 咱们现在用的大多数翻墙软件便是运用的正向署理.

运用场景:

  1. 机器经过正向署理拜访本来不可拜访的服务
  2. 经过正向署理服务器进行出口管控
  3. 隐藏拜访者行踪( 署理服务器变成一个肉鸡)

反向署理

一文看懂内网穿透

运用场景:

  1. 负载均衡
  2. 内网穿透

FRP介绍

官方介绍:

  • frp is a fast reverse proxy that allows you to expose a local server located behind a NAT or firewall to the Internet. It currently supportsTCPandUDP, as well asHTTPandHTTPSprotocols, enabling requests to be forwarded to internal services via domain name.

简单介绍便是FRP经过反向署理完结将内部服务(处于NAT或许防火墙背后的本地服务) 露出Internet

架构

一文看懂内网穿透

frps:布置在公网的内网穿透服务器(反向署理服务器)

fpsc:布置在内网的客户端

要想利用Frp完结内网穿透,有必要要具有一个公网IP地址,将Frps程序布置在公网IP地址的服务器上,其间Frps供给反向署理能力,公网IP是需求供给给外部用户拜访的入口,frps经过和frpc树立衔接,将安装frpc客户端机器的内网服务署理到frps中,然后完结内网穿透。

参考链接

一文带大家,彻底了解,NAT技能 – 知乎 (zhihu.com)

RFC 2663 – IP Network Address Translator (NAT) Terminology and Considerations (ietf.org)

RFC 5389 – Session Traversal Utilities for NAT (STUN) (ietf.org)

RFC 5780 – NAT Behavior Discovery Using Session Traversal Utilities for NAT (STUN) (ietf.org)

fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. (github.com)