问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

内网穿透原理与实现

创作时间:
作者:
@小白创作中心

内网穿透原理与实现

引用
1
来源
1.
https://www.bilibili.com/read/cv34851525/

内网穿透是一种常见的网络技术,主要用于解决外部网络访问内部网络资源的问题。本文将系统地介绍内网穿透的原理与实现方法,包括公网IP+端口映射、DDNS、组网、反向代理等多种技术方案。

开篇

之前分享的都是搭载在N1盒子之上的,包括异地组网,内网穿透,网络加速这些功能,接下来我会分享一下内网穿透原理和实现。

首先声明:视频和文章不涉及我的任何产品和开源项目,是纯粹的技术分享

我初步规划包括以下六个内容:

  1. 我们为什么需要内网穿透,只有了解问题是什么我们才能解决问题
  2. 用公网IP+端口映射实现内网穿透
  3. DDNS是什么,解决什么问题,如何实现的,
  4. 通过组网解决内网穿透(这是zerotier,wireguard这类软件的思路)
  5. 通过反向代理解决内网穿透(这是frp,ngrok这类软件的思路)
  6. 总结

希望通过这六期的内容能把内网穿透是如何实现的讲清楚,最后看视频效果以及我个人时间安排,如果大家都感兴趣我们后续可以一起动手写一个开源的内网穿透,但是重复造轮子于我个人或者社区意义都不大,我们可以往零信任的方向去靠拢,给内网穿透加上零信任的身份认证技术,这样我们就可以尝试着去解决内网穿透带来的安全隐患,这也是目前很多零信任产品的实现思路。

为什么需要内网穿透

针对这个问题,我们先来看一下我们平时是怎么上网的。这个是我们的平时上网的网络拓扑,我们包含我们的手机,电脑,通过Wi-Fi连接路由器,路由器再拨号上网。

以我们访问https://1.1.1.1 为例子,我这里只挑重点讲

  1. 流量经过路由器,中间的ARP和链路层地址填充的部分我们不需要关注
  2. 在路由器上通过WAN口出去,这时候路由器会做一层SNAT,也就是源地址转换,把这个数据包的源IP从192.168.1.179替换为1.2.3.4,源端口也有可能会被换成其他端口,这里有一个核心的操作是记录这个转换关系表。
  3. 流量出运营商,到达1.1.1.1的服务器
  4. 1.1.1.1处理之后返回
  5. 流量到达路由器之后,路由器查询之前的转换关系表,做一层DNAT,把这个数据包的目的IP替换成192.168.1.179,目的端口也有可能被修改
  6. 最终流量到达我们的手机。

这是我们主动访问的场景,这里的关键在于路由器做的SNAT和DNAT以及记录转换关系表

那么回到内网穿透,内网穿透是外部主动访问我们的场景,有的朋友可能就会说了,既然1.1.1.1的数据包都能够回到我们手机了,外部应该也能访问才对。

这里就不得不再重复提到路由器记录的转换关系表,数据包回来的时候是需要查这个转换关系表的,而针对外部主动访问内部的场景,我们也简单说明说明。

假设外部知道我们的WAN口IP,访问1.2.3.4:443端口,流量也到达了我们的路由器,这时候路由器是不知道需要把这个流量转到内网哪一台设备的,因为他没有这个转换关系的记录,所以数据包会到达路由器这里就停止了,没办法继续网下传

正是基于这个原因,才有内网穿透,内网穿透也叫NAT traversal,主要就是为了应付路由器的NAT,

内网穿透给我们提供一种能力,能够让外部访问到内部,当然从这个角度看,他是存在极大的安全隐患的。

公网IP+端口映射

内网穿透产生的本质原因是路由器这里的限制,让我们没办法访问直接访问内网。

那解决思路肯定是如何破除这个限制,既然没有转换表,那我能不能给你加一个转换记录,或者加一条DNAT记录。

熟悉Linux的朋友应该很快就反应过来,可以用iptables配置一个DNAT。

于是就自然而然的诞生了第一个解决方法——公网IP+端口映射,端口映射其实就是NAT,把访问路由器WAN口的IP和端口映射成内网的IP和端口。

这个解决方法实际上和Nginx反向代理是一样的,把Nginx比做路由器,Nginx的upstream比做内网IP+端口就行了。

那我们结合这个思路来再走一遍流程,这个流程和上一节主动访问的流程是刚好反过来的。

  1. 外部用户访问我们wan口的IP和端口
  2. 在路由器做了一条DNAT的策略,把wan口的端口DNAT到内网192.168.1.179的指定端口
  3. 流量转发到内网192.168.1.179这台机器
  4. 内网处理并返回
  5. 到达路由器之后,路由器查找转发表并做一次SNAT
  6. 流量返回到外部用户

通过这样的方式就实现了一个很简单的内网穿透,但是这里有两个前提

  1. WAN口的IP是公网IP
  2. WAN口的IP是固定的

这个是相对理想的情况,比如我的WAN口IP就是100.64网段的,这个网段属于保留IP,他并不是公网IP,没办法在外部直接访问,运营商可能出去还继续有NAT。

再比如即使找运营商分配了公网IP,也不一定能保证这个IP能固定,会动态变,需要找运营商开静态IP。

所以说公网IP+端口映射属于非常理想的情况下的一种方案,接下来我会在介绍另外一个工具,DDNS,这个是用来解决WAN口公网IP不固定的问题。

DDNS的原理与实现

(待补充)

基于组网实现的内网穿透

(待补充)

基于反向代理实现的内网穿透

(待补充)

总结

(待补充)

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号