关于“内网穿透”的一些知识(续3)—— NAT类型判断
前文:
关于“内网穿透”的一些知识(续2)—— 端口预测
-------------------------------------------
本文是对前面几篇文章的补充。这里要说下我们这几篇文章讨论的都只是NAT功能的设备,在实际的家庭用户中这个NAT设备就是家庭路由器或者说是带有网关功能的家庭网络共享器,但是在实际的企业环境下作为NAT设备的网关设备往往在具备NAT功能的同时还具有防火墙和均衡负载等功能,这时候前面讨论的很多情况就不适用了。比如说带防火墙的NAT设备,往往会检测数据包的内容并做主动防御的,对于短时间的扫描端口的数据包可能是会直接拒绝访问的(比如:https://www.cnblogs.com/colin-vio/p/17852504.html),这样就不能使用所谓的“端口预测”技术,而有的NAT设备带有均衡负载功能,所以这种NAT设备的类型是不固定的,有时候是Full Cone Net类型,而有的时候却是Symmetric NAT类型,但是不管是什么样类型的NAT设备和NAT网络,在打洞技术无效的情况下都是可以使用中继服务器做中转通信从而实现内网穿透的。
关于NAT类型判断:
给出https://www.cnblogs.com/colin-vio/p/13323228.html中的内容:
--------------------------------
引自:https://www.cnblogs.com/colin-vio/p/13323228.html
路由器nat类型判断可以用排除法按下面几个步骤来实现。 首先我们应该明确IETF提供的标准一共有4种常见NAT。分别是:
- 全锥型(full cone nat)
- 地址限制锥型(ip restrict cone nat)
- 端口限制锥型(port restrict cone nat)
- 对称型(symmetric nat) 对于市场上面一些厂商自已实现其它的nat我们不做过多的探讨,以实际测试经验来看,这类nat的路由器非不的少,但也不是不存在,我们过往测试中也发现过。比如中国移动在给宽带用户安装宽带时使用了一种集成了光猫和路由功能的盒子。他的安全性像全锥型,即外来连接消息包都允许进来,但对外端口映射时又表现为对称型。
NAT类型判断算法整体流程大至是,先判断防火墙是否阻止所有udp包进来,再判断是否是公网ip,再判断是否为全锥型,然后判断是否是对称型,最后判断是否是端口或地址限制型。
下面描述详细的判断过程,过程中需要与3台具有不同IP的服务器交互辅助。我们把这3台服务器称之为“协调服务器”,分别称为s1,s2,s3。
- 判断路由器防火墙是否防止所有UDP包进入 客户端向s1:30017发送一UDP包,s1收到后直接返回一udp数据包,如果客记端收不到s1的回包,那么判定为阻止所有udp,判断结束,否则进入一下判断。为了降低udp在网络中丢失,此过程可以重复多次。
- 判断主机是否直连公网 客户端收到s1回复,s1在处理时取出客户端的ip放入回复包里,客户商解析出数据区的ip与本机本地取出的所有ip对比,看是否存在匹配。存在匹配即认定当前主机是直接连接在公网上的,中间没有经过任何网关路由器,判断结束,否则进入一下判断。
- 判断当前网络的网关路由器是否为全锥型 客户端向s1:30017端口发送消息请求s1通知s3从不同于30017端口回一个udp消息包,如果客户端能收到s3的回复。那判定为全锥型nat,否则进入下一步判断。
- 判断是否为对称型nat 客户端分别向s1:30018,s2:30018发送udp消息,s1,s2收到包后,取出客户端的ip:port放入数据包发送回给客户端。客户端这样就取回自己的两份公网ip:port数据,客户端对比这两个地址,如果这两ip:port不一样那么就是客户端网关就是对称型。否则就是锥型,要么是地址限制型,要么是端口限制型。就需要继续向下判断了。
- 判断是地址限制型还是端口限制型nat 客户端向s1:30018发消息,请求s1从另一个端口回复一个消息比如端口6000。如果客户端收到了s1所回复的消息,那么判定为地址限制型而非端口限制型。否则收不到回复就判定为端口限制型。因为s1从非30018端口回复消息补路由器阻止了。
--------------------------------
在对NAT类型进行判断时可以使用TCP数据包也可以使用UDP数据包,但是由于TCP数据包的协议性质有一定时间的等待(重发机制和三次握手)所以速度上要慢于UDP,所以在进行NAT类型判断的时候会优先使用UDP数据包进行判断,但是UDP包协议存在不可靠性因此需要多发几次包才有可信度。上面给出的NAT类型判断的第一步就是判断UDP数据包可以不可以作为发送方被NAT设备方向,如果有的NAT设备防火墙机制较高不允许UDP作为主动方发送(各别NAT设备防火墙可能禁止使用UDP通信协议),那么在进行NAT类型判断时就需要换用TCP协议,当然这会导致判断过程的时间增加。
参考:
https://blog.csdn.net/u011060906/article/details/129533798
https://www.cnblogs.com/colin-vio/p/13323228.html
https://www.cnblogs.com/ssyfj/p/14791064.html
https://www.cnblogs.com/ssyfj/p/14797389.html
关于“内网穿透”的一些知识(续3)—— NAT类型判断的更多相关文章
- QuantumTunnel:内网穿透服务设计
背景 最近工作中有公网访问内网服务的需求,便了解了内网穿透相关的知识.发现原理和实现都不复杂,遂产生了设计一个内网穿透的想法. 名字想好了,就叫QuantumTunnel,量子隧道,名字来源于量子纠缠 ...
- 今天学到的新知识--使用localtunnel实现内网穿透,感觉很神奇哇~~
localtunnel 是一个基于 nodejs 的内网穿透工具.通过简单的安装可以实现将内网里的设备的某个端口暴露在公网中以提供服务. 首先你电脑要有node环境 使用本地隧道,对应本地服务的端口号 ...
- 使用FRP做内网穿透
Github地址:https://github.com/fatedier/frp 什么是FRP? frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 h ...
- 手写内网穿透服务端客户端(NAT穿透)原理及实现
Hello,I'm Shendi. 这天心血来潮,决定做一个内网穿透的软件. 用过花生壳等软件的就知道内网穿透是个啥,干嘛用的了. 我们如果有服务器(比如tomcat),实际上我们在电脑上开启了服务器 ...
- NAT、端口映射、内网穿透、公网IP都是啥
原文地址:https://wuter.cn/1756.html/ 一.IPv4地址 IP协议是为计算机网络相互连接进行通信而设计的协议,它是能使连接到网上的所有计算机网络实现相互通信的一套规则. 这里 ...
- 内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】
Ngrok为何物 “ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道.ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放.”这是百度百科上给Ng ...
- SSH 端口转发+内网穿透
用最直白的语言对本文所有内容进行定义: 端口转发(-L):用A机器(内网)登录B机器(公网), 在A机器打开端口,将收到的所有请求转发到B机器的某个端口 (在代理机上执行) 内网穿透(-R):用A机器 ...
- Ngrok 内网穿透利器
Ngrok是什么 Ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道.Ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放 为什么要使用Ngrok ...
- Ngrok 内网穿透神器(转载)
mac上配置web服务: http://note.rpsh.net/posts/2013/11/27/osx-10-9-apache-server-php-mysql/ Ngrok 内网穿透神器 由于 ...
- SSH的内网穿透
SSH的内网穿透 1.内网: ssh -N -f -R 2222:127.0.0.1:22 lienzh@我的PC的IP2.外网: ssh -p 2222 root@localhost ...
随机推荐
- C#.NET 国密 BASE64编码的私钥提取16进制私钥 (锦州银行、建行轻应用)
C#.NET 国密 BASE64编码的私钥提取16进制私钥 (锦州银行.建行轻应用), 从BASE64编码的公钥中提取16进制字符串公钥, 从BASE64编码的私钥中提取16进制字符串私钥, 锦州银行 ...
- logback日志格式模板,基于TraceId搜索完整的请求链路日志
logback日志格式模板,基于TraceId搜索完整的请求链路日志 日志打印格式:(可以基于TraceId:4d484c2a110eae9d来搜索完整的请求链路日志2023-08-28 15:06: ...
- spring jpa restful请求示例
创建项目 导入jar包mysql 数据库和连接池jar <dependency> <groupId>org.springframework.boot</groupId&g ...
- JAVA日期当天0点0分0秒
LocalDateTime LocalDateTime ldt = LocalDateTime.now(); LocalDateTime todayZero = LocalDateTime.of(ld ...
- RuoYi-Cloud从配置到运行
前期准备工作 若依微服务版(RuoYi-Cloud)代码下载:https://gitee.com/y_project/RuoYi-Cloud 注册中心(nacos)下载:https://www.ali ...
- dense并行训练1-流水线并行
并行训练-流水线 简述 并行训练主要有三种策略: 数据并行训练加速比最高,但要求每个设备上都备份一份模型,显存占用比较高,但缺点是通信量大. 张量并行,通信量比较高,适合在机器内做模型并行. 流水线并 ...
- Android 耳机驱动知识
Android 耳机驱动知识 2015-03-06 工作以后接手的第一个驱动就是android平台下耳机的插拔检测和按键检测.这部分涉及的硬件知识比较简单,但是软件上对中断的处理,软件检测的鲁棒性,都 ...
- Linux 环境编程:errno的基本用法
背景 error是一个包含在<errno.h>中的预定义的外部int变量,用于表示最近一个函数调用是否产生了错误.若为0,则无错误,其它值均表示一类错误. errno只在函数返回错误时才有 ...
- 生成数字csv
csv文件: import time import mcpi.minecraft as minecraft import mcpi.block as block mc = minecraft.Mine ...
- Java 自定义注解校验字段唯一性
业务场景 在项目中,某些情景下我们需要验证编码是否重复,账号是否重复,身份证号是否重复等... 那么有没有办法可以解决这类似的重复代码量呢? 我们可以通过自定义注解校验的方式去实现,在实体类上面加上自 ...