字节三面:内网穿透了解吗?

以下文章来源于飞天小牛肉 ,作者小牛肉

如有侵权,联系删除

什么是内网穿透?

众所周知,得益于 NAT(Network Address Translator 网络地址转换)技术的存在,使得全球互联网可连接的计算机数能够远远超过 43 亿台。其原理就是在本地网络中使用私有地址(内网 IP),在连接互联网时使转而使用全局 IP 地址(公网 IP),这样,多个计算机就可以共用一个 IP 地址,从而达到减缓 IPV4 地址损耗的目的。

大伙可以打开命令行输入 ifconfig | grep inet 找到自己的内网 IP 地址,你的 IP 一定是在 192.168.0.0~192.168.255.255 这个区间里面,这是因为 TCP/IP 协议专门设定了内网 IP 地址的范围:

  • A 类 - 10.0.0.0/8:10.0.0.0~10.255.255.255

  • B 类 - 172.16.0.0/12:172.16.0.0~172.31.255.255

  • C 类 - 192.168.0.0/16:192.168.0.0~192.168.255.255

仅靠这个内网 IP 地址是无法上网的,需要通过 NAT 路由器转成公网 IP 才行,可以通过 curl cip.cc 来查看自己电脑的出口公网 IP 地址。

回忆一下,当我们在本地进行开发的时候,是不是都是通过 127.0.0.1:端口号 来访问服务的?其实也可以通过 内网 IP:端口号 进行访问,当然别人是没法通过这个地址正常访问的。

那这时候可能有小伙伴要问了,NAT 路由器不是会将内网 IP 转成公网 IP 吗?直接通过个 公网 IP:端口号 难道不能访问这个本地服务吗?

很遗憾,不能。

使用 NAT 绑定的公网 IP 直接进行访问,就意味着所有请求的 IP 报文中的目的 IP 地址都是这个公网 IP,那么 NAT 路由器无法区分这个请求到底要转发到内网的哪一台机器,这会导致端口冲突问题。

因此,如果这个时候你想要把这个服务开放给互联网上的其他人进行访问,你有两种方案:

  1. 将该服务部署到云服务器

  2. 内网穿透,将当前的内网 IP 和一个可访问的公网 IP 建立联系,使得别人可以通过公网 IP 访问你的本地主机

本地服务开放给公网访问这个需求在做微信开发的时候还是非常常见的,因为微信的各种回调函数都要求是公网可以访问的地址,总不能每在本地改一次代码就部署一次云服务器吧,不说费时间了,调试起来也很麻烦,所以内网穿透还是非常必要的。

说了这么多,总结下什么是内网穿透?

一般情况下,私有网络中的计算机无法被公网访问,因为它们的 IP 地址是内网 IP,不能直接被公网访问。内网穿透技术通过将公网上的请求转发到内网中的计算机上,从而实现了内网计算机与外网之间的数据通信。内网穿透技术主要应用于需要远程控制、远程访问、文件共享等场景,以便在安全性、便捷性和实用性方面取得平衡。

内网穿透实现方案

实现内网穿透的方法有很多,下面介绍四种常见的实现:

  1. 端口映射(Port forwarding)

  2. 反向代理(Reverse proxy)

  3. VPN(Virtual Private Network,虚拟专用网络)

  4. NAT 穿透(NAT Traversal)

端口映射

端口映射是一种将公网上的 IP 地址和端口映射到局域网内一台计算机的指定端口上的技术。实现端口映射需要在路由器上进行配置,将路由器的公网 IP 地址和端口与内网中的计算机的 IP 地址和端口相映射。当公网用户请求这个 IP 地址和端口时,路由器会将请求转发到内网计算机的指定端口上,从而实现内网穿透。

反向代理

反向代理是一种将公网上的访问请求转发到局域网内一台计算机的指定端口上的技术。实现反向代理需要在公网服务器上部署一个代理服务器,在代理服务器上配置反向代理规则,将公网请求转发到内网服务器上的指定端口。从而实现内网穿透。

VPN

VPN 是一种通过公用网络建立安全的、点对点连接的私人网络技术。VPN 可以让远程用户或外部网络通过加密的方式连接到内部网络,实现内网穿透。

在 VPN 方案中,用户首先需要通过 VPN 客户端与 VPN 服务器建立连接。VPN 服务器位于内网外,可以拥有一个公网 IP 地址,而 VPN 客户端位于内网中。当 VPN 客户端需要访问内网中的资源时,它会通过 VPN 通道向 VPN 服务器发起请求。VPN 服务器接收到请求后,会对其进行处理并将其转发给内网中的资源。同样的,内网中的资源也可以通过 VPN 通道向外网提供服务,从而实现内网穿透。

VPN 方案的优点是安全性较高,能够通过加密的方式保护数据的传输,同时也支持多种协议,比如 PPTP、L2TP、SSTP、OpenVPN 等。但是,VPN 方案的缺点是需要在内网中部署 VPN 服务器,并且需要额外的软件支持,部署和维护较为复杂。

例如,在企业中,可以使用 VPN 方案实现员工在外部也能够访问内部办公系统。假设某公司的内网 IP 段为 192.168.1.0/24,内网中有一台 Web 服务器,它的 IP 地址为 192.168.1.100。公司需要让员工在外部能够访问这个 Web 服务器,就可以部署一个 VPN 服务器,并让员工通过 VPN 客户端连接到该服务器。员工通过 VPN 通道访问 Web 服务器时,VPN 服务器会将请求转发给内网中的 Web 服务器,并将响应返回给员工。

NAT 穿透

在 NAT 网络中,内网的 IP 地址和端口号经过 NAT 转换后,对外部网络是不可见的。因此,当外部网络需要连接内网中的计算机时,需要通过一定的方式绕过 NAT 转换,使得内网计算机可以直接和外网通信。

NAT Traversal 通常通过以下两种方式实现:

注意,无论是 UDP 穿透还是 TCP 穿透,他们的本质都是为了在 NAT 网络环境中建立一条可靠的通信路径,使得外部网络中的设备可以通过 NAT 设备访问内部网络中的服务。其中的关键在于找到一个合适的转发端口,将外部网络请求转发给内部网络的服务。

1)UDP Hole Punching(UDP 穿透)

UDP Hole Punching 是一种通过 UDP 协议建立连接的 NAT Traversal 技术,它利用 NAT 路由器在 UDP 通信过程中开启的临时端口号,绕过 NAT 转换建立直接连接。其实现流程如下:

  • 客户端向服务器发送 UDP 数据包,该数据包中包含了客户端的公网 IP 地址和临时端口号。

  • 由于 UDP 数据包是无连接的,NAT 路由器并不知道该数据包是要转发到哪个内网计算机上。因此,客户端需要在数据包中携带一个标识符,以便让服务器识别该数据包是由哪个客户端发送的。

  • 服务器收到客户端发送的 UDP 数据包后,会回复一个数据包到客户端,该数据包中携带了服务器的公网 IP 地址和端口号。

  • 客户端和服务器都会开启一个新的 UDP 数据包监听器,用于接收对方发送的数据包。由于 NAT 路由器会将第一个发送的 UDP 数据包的临时端口号映射到对应的内网计算机上,因此客户端和服务器都可以通过该端口号向对方发送数据包,建立连接。

2)TCP Hole Punching(TCP 穿透)

TCP Hole Punching 是一种通过 TCP 协议建立连接的 NAT Traversal 技术,它利用 TCP 三次握手建立连接的特点,通过同时向 NAT 路由器发送数据包,使得 NAT 路由器在建立连接时将数据包转发到对应的内网计算机上,从而实现 NAT 穿透。其实现流程如下:

  • 客户端向服务器发送 SYN 数据包,该数据包中包含了客户端的公网 IP 地址和端口号。

  • 服务器收到客户端发送的 SYN 数据包后,回复一个 SYN+ACK 数据包到客户端,该数据包中携带了服务器的公网 IP 地址和端口号。

  • 客户端收到服务器的 SYN+ACK 数据包后,会回复一个 ACK 数据包到服务器,该数据包中携带了客户端的公网 IP 地址和端口号。

  • 由于客户端和服务器都同时向对方发送了数据包,

  • NAT 路由器在记录连接信息时就会将客户端和服务器的信息都记录下来,并将对应的端口打开。此时,客户端和服务器就可以直接通过 NAT 路由器通信了。这个时候,NAT 路由器其实就相当于一个交换机了,因为它只需要根据端口信息进行转发就可以了,不需要再进行 IP 地址转换。

需要注意的是,TCP Hole Punching 的成功率比 UDP Hole Punching 要高,但是由于 TCP 协议的特点,它只能在客户端和服务器之间建立点对点的连接,无法实现多客户端之间的通信。另外,由于 TCP 协议在建立连接时需要进行三次握手,因此 TCP Hole Punching 的连接建立速度相对较慢,不适合需要快速建立连接的场景。

一个具体的案例是 P2P 文件共享程序 BitTorrent,它使用 TCP Hole Punching 技术实现了 P2P 文件共享功能。在 BitTorrent 中,每个客户端都可以向其他客户端发送连接请求,当对方客户端回复请求后,双方通过 TCP Hole Punching 建立点对点的连接,实现文件共享。

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值