DNS的查询方式:递归查询,迭代查询。

  • 递归查询:客户机向DNS服务器发送请求,DNS服务器会用一个准确的查询结果返回给客户机,如果DNS服务器本地没有存储查询的DNS信息,那么它会查询其他DNS服务器,并将查询到的结果返回给客户机,所以,客户机只解除了一次DNS服务器
  • 迭代查询:客户机向DNS服务器发送请求,如果该台DNS服务器没有存储该DNS则该DNS服务器就会返回另外一台DNS服务器的地址,客户机再向此DNS服务器查询DNS信息,依次循环直到返回结果。所以客户机有可能接触了多个DNS服务器。

背景:

想访问局域网中的机器,但是由于局域网中一般使用的是私有IP地址,所以按照正常的访问方式,是访问不到局域网中的机器的。因此内网穿透便是这样一种技术,能够使局域网中的机器能够被访问到,实现内网穿透有多种方法。

需求:

在虚拟机上面配置的网页能够被室友的主机给访问到

解决办法:

利用内网穿透技术,frp工具。


一、前言

内网宽带中的主机能够访问到公网宽带的主机,反之公网主机访问不到内网主机。公网宽带中的主机可以相互访问。不同内网宽带中的主机不能相互访问。那么公网宽带中的主机如何能访问到内网主机以及不同内网中的主机如何相互访问呢?
这就是内网穿透要解决的问题,也是我们要学习的内容。

二、详细原理

传统内网穿透:

大概思想是,在公网上建立一台服务器,使得内网机器能够访问到公网服务器,这时他们之间就会建立一个连接通道,然后再有任何其他NAT后的客户端主动连接公网中转服务器时,公网服务器接受到请求连接后,马上把请求通过先建立好的通道转发给内网服务器,内网服务器再将响应数据包再原路发回去,最终到达公网中转服务器,然后返回给其他NAT后的客户端。
内网穿透 - 图1

点对点内网穿透:

在内网穿透传输大量数据都需要经过中转服务器时,这样会对服务端带宽压力比较大,只要是数据量很大,而需要中转服务器又需要一定规模投入的应用,我们可以考虑P2P技术。

  1. UDP打洞技术

最为常见的实现P2P的方式是UDP打洞技术,UDP打洞技术是通过中间服务器的协助,在各自的NAT网关上建立相关的表项,使P2P连接的双方发送的报文能直接穿透对方的NAT网关,从而实现P2P客户端互连,如果两台位于NAT设备后面的P2P客户端希望在自己的NAT上打个洞,就需要中转服务器的协助,并且还需要一种用于打洞的Session建立机制。
Session建立机制:
假设客户端A要发起对客户端B的直接访问,具体的打洞过程如下:
1.最初客户端A不知道如何向客户端B发起连接,于是A向集中服务器(本质上是一台建立在公网上的服务器,建立P2P连接的双方都可以直接访问到这台服务器。位于NAT后端的客户机都可以与已知的集中服务器建立连接,并通过这台集中服务器了解对方的信息并中转各自的信息)发送信息,请求集中服务器帮助建立与B的UDP连接。
2.集中服务器将含有B的外网和内网的地址的二元组发给A,同理也将A的发给B,这样双方都知道对方的外网和内网地址
3.当A收到集中服务器发来的包含B信息的数据包后,A开始向B的地址二元组发送UDP数据包,并且A会自动锁定第一个响应的B的地址二元组。同理。这样就打通了A与B之间的洞。
当然,UDP转换协议提供的洞不是绝对可靠的,多数NAT设备内部都有一个UDP转换的空闲状态计时器,如果在一段时间没有通信,则NAT设备会关掉打出来的洞,如果P2P应用程序希望洞的存活时间长一点,可以在穿越后设置一个有效期

TCP打洞技术:
从现在的主流应用的角度上来看,基于TCP的P2P应用显然不如基于UDP的应用那么广泛,但是也存在打洞的需求。TCP相对于UDP而言要复杂的多,TCP连接的建立要依赖于三次握手的交互,所以NAT网关在处理TCP连接的时候,需要更多的开销。但是,由于TCP协议完备的状态机机制,TCP反而比UDP更能精确的获取某个Session的生命期。
一种新的代理类型 XTCP 能解决这个问题,实现方式可以是采用搭建FRP服务器的方式,在传输数据的两端都部署上FRP客户端用于建立直接的连接
内网穿透 - 图2

穿透原理总结:

内网穿透传统方式会出现服务器和客户机之间的流量都要经过中转服务器,传输速度受限于中转服务器的上下行带宽,不过稳定性很好。点对点穿透能够解决流量带来的困扰,点对点穿透技术可以实现服务器与客户机之间打洞直接进行通信,这种方式一般用于udp协议的传输,这种方式需要服务器和客户机都安装穿透工具,对用户端的访问来说不够方便。

三、方法实现

FRP工具:

Zerotier:

原帖链接:https://www.likecs.com/show-197678.html#%E4%B8%80%E5%89%8D%E8%A8%80


总结:

内网穿透就是为了解决公网服务器能够访问私网主机,或者是不同局域网中的私网主机相互进行访问。实现方法有两个:一个是传统的内网穿透,另外一种是点对点内网穿透。传统的内网穿透是通过建立一台公网的中转服务器,然后私网主机A和私网主机B访问到中转服务器,私网主机A的数据包被中转服务器通过与B建立起的通道转发给B。同理B也是这样和A通信。这样有一个弊端,就是数据包都要经过中转服务器,中转服务器的性能会影响通信的效率,但这样的好处是稳定。点对点内网穿透也是通过建立一台公网服务器。然后私网主机A和私网主机B,访问公网服务器,这样他们都会就会建立通向公网服务器的通道。此时A把自己的NAT的公网地址和自己私网地址的二元组信息,通过通道发送给公网服务器,公网服务器将此二元组信息发送给B。同理B也把自己的二元组信息发送给A。这样他们就互相知道了对方的NAT路由器的公网地址和对方的私网地址。接着B就会回复一个数据报文给A,而A把第一个收到B的报文的发送方确定为B。这样双方就建立了连接。但是在NAT上面打的洞并不是持久的,NAT路由器上面有一个计时器在一定时间内没有收到对方的UDP数据包,这个洞就会关闭。我们可以通过在打洞时设置一个有效期。