欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

内网穿透原理

最编程 2024-06-20 17:27:41
...

内网穿透

NAT

NAT概念

NAT(Network Address Translator,网络地址转换)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术。NAT实际上是为解决IPV4地址短缺而开发的技术。

不同类型的NAT

完全锥形NAT

如果一个内网地址经过映射,映射到了一个公网外部地址上,所有来自这个内网地址的请求,都会经过这个外部地址向外发送

注:(1)这种模式下,任意外部主机都可以发包给内网设备(已建立过映射的)

(2)同一个内部地址只会映射相同的外部地址,映射完成后,目标IP端口都无限制。

受限锥形NAT

IP限制锥形NAT

内部客户端必须先发送数据包到外部服务器1(IP=X.X.X.X),然后才能接收来自服务器1(IP=X.X.X.X)的数据包。NAT在限制方面,唯一要求是数据包一定是要来自(IP=X.X.X.X) 。内部地址映射到外部公网地址,所有内部地址的请求都会由这个外部地址向外发送。

注:(1)外部主机源端口不受限制,只有发给NAT转换地址的数据包才被放行

(2)同一个内部地址只会映射相同的外部地址,映射完成后,必须先发一个包给目标,然后才能收到目标回发的包,目标端口无限制。

端口受限锥形NAT

在受限锥型NAT的基础上增加了外部主机源端口必须是固定的

注:(1)同一个内部地址只会映射相同的外部地址,映射完成后,必须先发一个包给目标,然后才能收到目标回发的包

(2)有目标端口限制。

对称NAT

每一个来自相同内部IP与端口,到一个特定目的地地址和端口的请求,都映射到一个独特的外部IP地址和端口。

同一内部IP与端口发到不同的目的地和端口的信息包,都使用不同的映射。只有曾经收到过内部主机数据的外部主机,才能够把数据包发回。

例如:
我们在最开始的时候说,A(192.168.0.2:100)已经通过NAT网关(3.3.3.3:200)和server1(1.1.1.1:1111)建立了链接,
此时如果A(192.168.0.2:100)想和server2(2.2.2.2:2222)建立连接的话,
如果使用锥型NAT,那么这个NAT网关会继续使用之前建立的NAT映射(3.3.3.3:200映射到192.168.0.2:100),
而如果现在使用对称型NAT的话,NAT网关会再随机分配一个端口(例如300),建立一个映射(3.3.3.3:300映射到192.168.0.2:100),
注意,此时NAT网关中存在两条映射规则,
分别是:3.3.3.3:200映射到192.168.0.2:100和3.3.3.3:300映射到192.168.0.2:100,
也就是说,此刻server1是和3.3.3.3:200进行通信,server2是和3.3.3.3:300进行通信,但是实际上,经过NAT网关的转发后,他们的数据包,最终都被192.168.0.2:100接收。

需要注意的是,内网电脑A始终都是通过100这个端口和外界通信的,而这两条映射规则则是NAT网关建立的,所以电脑A并不知道200和300这个端口,它始终认为自己就是通过100这个端口和外界通信,在外界的两个server来看,它们也并不知道自己是在和主机A通信,它们认为它们在和NAT网关(3.3.3.3)的不同端口进行通信。

NAT穿透组合

那么这么想

NAT组合就有10种

客户机A 客户机B 连通
完全锥形 完全锥形
完全锥形 IP限制锥形
完全锥形 端口限制锥形
完全锥形 对称形
IP限制锥形 IP限制锥形
IP限制锥形 端口限制锥形
IP限制锥形 对称形
端口限制锥形 端口限制锥形
端口限制锥形 对称形 ×
对称形 对称形 ×

三种打通的模型

第一种:完全锥形NAT和完全锥形NAT进行穿透

如果A和B都是完全锥型NAT,在A和B都连接到server1后,A和B都可以借助server1的转发互相发送消息,那么此刻A和B就可以知道对方的公网IP,以及对方和server1连接的时候,使用的端口是什么(假设是100),因为两者和server1进行通信的端口已经进行了NAT映射,所以二者的100端口其实已经完成映射,又因为二者都在完全锥型NAT下,此刻A只需要直接给B的100端口发送建立连接的请求,B给A的100端口回复同意建立连接的请求,二者即可建立UDP连接。

第二种:IP限制型NAT和IP限制型NAT进行穿透

如果A和B都是IP限制型NAT,在A和B都连接到server1后,A和B都可以借助server1的转发互相发送消息,A会先发送一个UDP请求(假设自己的端口用100,目标端口用200)到B的公网IP上,理论上来说,因为B的NAT网关中,200端口没有建立NAT映射,所以这个数据包会被丢弃,但是在A发送给B的UDP请求后,A会通过server1给B发送一个邀请,邀请B也发送一个UDP请求给A(此刻B自己用的端口是200,目标端口是100),注意,在B收到来自A的UDP请求后,虽然A的数据包被B丢弃了,但是此刻,网关A暂时的建立了一个NAT映射,等待B返回的信息,虽然数据包已经被丢弃了,但是A不知道,所以A会稍微等一会B。这时,B收到了A的邀请,给A发送了一个建立连接的请求,此刻A的NAT网关恰巧暂时建立了NAT映射,所以A就可以收到B的UDP请求,接着A会给B发送一个同意建立连接的请求,因为此刻B刚发完请求在等A的回信,所以B的NAT网关也会暂时的建立一个NAT映射,所以A同意建立连接的请求就不会被B的NAT网关丢弃,最终,二者就建立了一个稳定的UDP连接。

第三种:端口限制型NAT和端口限制型NAT进行穿透

如果A和B都是端口限制型NAT,那么他们会经过和IP限制型一样的过程。同时,在之后的过程中,他们会用固定的端口进行通信。


理解这三种模型后,那么,其实就可以理解回上面那张图,这里解释倒数第二个

假设对称型NAT内网中有客户机A,端口限制锥型NAT内网中有客户机B,他们提前的沟通都通过一个server1:

B->A(B邀请A)

端口限制锥型发送请求后,对称型不知道自己端口是什么,但是还是照样发送了自己认为的信息,但是对方是端口限制型,需要外部设备特定端口才能访问,端口受限制型的一方把对称型的数据包直接丢弃了。

A->B(A邀请B)

对称型不知道自己实际的端口,在发送邀请后,端口限制锥型对着不正确的端口发送东西,对称型的一方只会把这个数据包丢弃。

那么双方都邀请不成功,代表着穿透是不可能的。

内网穿透种类

类型一:服务器中转穿透

数据经过中转公网服务器进行传输,被视为是最为常见的内网穿透种类,市面上大多数内网穿透产品都是采用这种类型实现穿透。无论NAT类型有多差都可以实现穿透。

类型二:点对点穿透

上文的NAT穿透方式就是点对点穿透方式,也被称为P2P技术,但是要求要有一个良好的NAT环境。

资料来源:

[NAT穿透 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/86759357#:~:text=对称NAT Symmetric,NAT:每一个来自相同内部IP与端口,到一个特定目的地地址和端口的请求,都映射到一个独特的外部IP地址和端口。 同一内部IP与端口发到不同的目的地和端口的信息包,都使用不同的映射。 只有曾经收到过内部主机数据的外部主机,才能够把数据包发回。)

B站最详细内网穿透原理,看了包懂,全是干货! - 哔哩哔哩 (bilibili.com)