文章目录

  • Nat的基本原理
  • Nat的优缺点
  • Nat的3种形态
    • 1.静态NAT (一对一)
    • 2.动态NAT (多对多)
    • 3.端口多路复用(多对一,目前使用最多的)
  • NATP类型的分类
    • (1)全锥型(Full Cone)
    • (2)受限锥型(Restricted Cone),或者说是IP受限锥型
    • (3)端口受限锥型(Port Restricted Cone),或者说是IP+Port受限锥型
    • (4)对称型(symmetric)
  • STUN协议
  • NAT穿越
    • (1)全锥形NAT,这个很容易,不讨论。
    • (2)限制锥型NAT和端口限制锥型NAT(简称限制型NAT)
    • (3)对称NAT

Nat的基本原理

    当内部网络中的一台主机想传输数据到外部网络时,它先将数据包传输到NAT路由器上,路由器检查数据包的报头,获取该数据包的源IP信息,并从它的NAT映射表中找出与该IP匹配的转换条目,用所选的内部全局地址(全局唯一IP地址)来替换内部局部地址,并转发数据包。
    当外部网络对内部主机进行应答时,数据包被送到NAT路由器上,路由器接收到目的地址为内部全局地址(外网IP)的数据包,它将用内部全局地址通过NAT映射表查找内部局部地址,然后将数据包的目的地址替换成内部局部地址(内网私有IP),并将数据包转发到内部主机。

Nat的优缺点

优点:
    对于家庭或小型商业机构,使用NAT可以更便宜,更有效的接入Internet。
    使用NAT可以缓解目前全球IP地址不足的问题。
    NAT能够隐藏内部网络的拓扑结构,保护内部主机,同时还起到防火墙的作用。
缺点:
    NAT会增加延迟,因为要转换的每个数据包包头的IP地址,增加了延迟。
    导致无法进行端到端IP跟踪。
    NAT会使某些使用内嵌地址的应用不能正常工作。

Nat的3种形态

1.静态NAT (一对一)

静态转换:(static Nat):是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址,借助静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。

缺点:一个内网IP对应网关的一个公网IP.如果想让内网中的其它pc也能访问外网,那么网关就必须有多个公网IP,并对每台系想访问外网的pc进行静态配置。

2.动态NAT (多对多)

动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对并不是一一对应的,而是随机的。

缺点:网关有多少个公网IP.就只能满足多少个内网IP上网。

3.端口多路复用(多对一,目前使用最多的)

    通过使用端口多路复用,可以达到一个公网地址对应多个私有地址的一对多转换。在这种工作方式下,内部网络的所有主机均可共享一个合法外部IP地 址实现对Internet的访问,来自不同内部主机的流量用不同的随机端口进行标示,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有 主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。

NATP类型的分类

(1)全锥型(Full Cone)


client通过Nat访问服务器A
Nat会将内网IP和端口号发送过来的请求都会被映射成一个外网IP和端口号
当服务器或者其他客户端向这个外网IP+端口发送任何数据
Nat都会将数据转发给client

(2)受限锥型(Restricted Cone),或者说是IP受限锥型


client通过Nat访问服务器A
Nat会将内网IP和端口号发送过来的请求都会被映射成一个外网IP和端口号
当服务器或者其他客户端向这个外网IP+端口发送数据
Nat都会将数据直接丢弃
Nat只接受来自于服务器A的任何数据

(3)端口受限锥型(Port Restricted Cone),或者说是IP+Port受限锥型


client通过Nat访问服务器A
Nat会将内网IP和端口号发送过来的请求都会被映射成一个外网IP和端口号
当服务器或者其他客户端向这个外网IP+端口发送数据
Nat都会将数据直接丢弃
关于来自服务器A的数据
Nat只接受来自于服务器A的特定数据

(4)对称型(symmetric)


对称型NAT把从同一内网地址和端口到相同目的地址和端口的所有请求,都映射到同一个公网地址和端口。如果同一个内网主机,用相同的内网地址和端口向另外一个目的地址发送报文,则会用不同的映射。这和端口限制型NAT不同,端口限制型NAT是所有请求映射到相同的公网IP地址和端口,而对称型NAT是不同的请求有不同的映射。(即五元组一致)

STUN协议

    STUN的全称是Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)。
即穿越NAT的简单UDP传输。(只讨论过程,详解参考RFC3489)
    简单来说STUN就是用来找出自己对应的外网的ip和端口,并且可以知道自己所处的网络NAT之下。
stun是一个CS结构,下面具体讲解下NAT类型的发现过程。


NAT类型测试工具:NatTypeTester.exe(网上自行下载,可以判断当前处于哪个类型nat下)

NAT穿越

    使用udp穿越nat,通常情况下使用udp和外部主机通信会产生一条session,保留时间不一定几秒,几分,几小时。。。

    假设NAT-A下的client-A想和NAT-B下的client-B进行通信,一种办法是server作为中间人,负责转发A-B
直接的数据,这样服务器会很累,另一种办法是让client-A和client-B建立端到端的连接,也就是P2P。

(1)全锥形NAT,这个很容易,不讨论。

(2)限制锥型NAT和端口限制锥型NAT(简称限制型NAT)

当client-A直接发送udp到client-B,肯定会被NAT-B丢弃

1.client-A(202.103.142.29:5000)发送给数据包server请求和client-B(221.10.145.84:6000)通信。
2.server将client-A的地址和端口发送给client-B,告诉client-B,client-A想要和你通讯。
3.client-B向client-A的地址(202.103.142.29:5000)发送udp数据包,这个数据包到NAT-A肯定丢弃,发送这个udp目的是让NAT-B记住这次通讯的目的地址和端口,当下次这个地址和端口数据到NAT-B的时候就不会被丢弃,这样NAT-B上打了一个从client-B到client—A的孔。
4.为了让client-A知道什么时候才可以向client-B发送数据,所以client-B要向server发送一个消息告诉server他已经准备好了
5.server会向client-A发送一个包client-B已经准备好了,你可以向client-B发送数据了。
6.client-A向client-B发送udp数据包,这个数据包是不会被NAT-B丢弃,之后client-B向client-A发送的数据也不会被NAT-A所丢弃,至此client-A和client-B就可以通讯。

(3)对称NAT

    对称NAT并不会像锥(Cone,全锥,限制性锥,端口限制性锥)NAT那样分配同一个端口。而是会新建立一个Session,重新分配一个端口。上面穿透限制性锥NAT的过程,在步骤3时:Client-B(221.10.145.84:?)向Client-A打孔的时候,对称NAT将给client-B重新分配一个端口号,而这个端口号对于Server、client-B、client-A来说都是未知的。同样, client-A根本不会收到这个消息,同时在步骤4,client-B发送给Server的通知消息中,client-B的socket依旧是(221.10.145.84:6000)。而且,在步骤6时:client-A向它所知道的client-B发送数据包时,NAT-A也会重新给client-A分配端口号。所以,穿透对称NAT的机会很小。

解决办法:
    穿透NAT的步骤2,当client-B收到Server发送给它的消息后,client-B即打开3个socket。socket-0向STUN Server发送请求,收到回复后,假设得知它被转换后的地址:端口(221.10.145.84:6005),socket-1向client-A发送一个UDP包,socket-2再次向另一个STUNServer发送请求,假设得到它被转换后的地址:端口(221.10.145.84:6020)。通常,对称NAT分配端口有两种策略,一种是按顺序增加,一种是随机分配。如果这里对称NAT使用顺序增加策略,那么,client-B将两次收到的地址:端口发送给Server后,Server就可以通知client-A在这个端口范围内猜测刚才client-B发送给它的socket-1中被NAT映射

STUN协议和常用NAT类型相关推荐

  1. Linux怎么检测nat类型,STUN(RFC3489)的NAT类型检测方法

    在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet.很多时候,我们希望网络中的两台主机能够直接进行通信(即所谓的P2P通信),而不需 ...

  2. STUN协议简要介绍

    参考:https://www.rfc-editor.org/rfc/rfc5766.html  STUN/TURN https://www.rfc-editor.org/rfc/rfc5389.htm ...

  3. H3C防火墙NAT类型及处理顺序

    H3C防火墙NAT处理顺序 本文主要适用于H3C V7版本防火墙,介绍了NAT的基本类型和执行顺序.相关内容很多援引H3C官方产品文档,NAT类型及相关说明以官方文档为准. 1 NAT类型及配置说明 ...

  4. 什么是NAT?NAT类型有哪些?

    NAT(Network Address Translation,网络地址转换) 是一种地址转换技术,它可以将IP数据报文头中的IP地址转换为另一个IP地址,并通过转换端口号达到地址重用的目的.NAT作 ...

  5. stun 协议 NAT穿透方式 简介

    STUN是RFC3489规定的一种NAT穿透方式,它采用辅助的方法探测NAT的IP和端口.毫无疑问的,它对穿越早期的NAT起了巨大的作用,并且还将继续在NAT穿透中占有一席之地. STUN的探测过程需 ...

  6. 标准STUN判断NAT类型的过程及改进

    这里基于stund的实现,来研究标准STUN协议,判断NatType的过程. stund用于判断NatType的接口的用法 首先来看stund中用于判断NatType的接口的用法.这里主要来看stun ...

  7. 穿透NAT类型以及STUN、TURN简单介绍

    穿透NAT类型以及STUN.TURN简单介绍 概述 NAT的副作用以及解决方案 NAT有4种不同的类型 锥形和对称形NAT的区别 STUN和TURN的简单介绍 STUN 基本思想 STUN Serve ...

  8. stun检查nat类型

    nat(Session Traversal Utilities for NAT)会话穿越应用程序,可以让位于nat后的客户端找出自己的公网地址以及对应的Internet端口,最重要的是可以判断自己处于 ...

  9. openwrt上用stun实现NAT类型检测

    一.安装stun: 相关组件下载参照:https://github.com/awe1p/stun cd到openwrt源代码路径 git glone https://github.com/awe1p/ ...

最新文章

  1. php empty()和isset()的区别
  2. Extended WPF Toolkit 新控件介绍
  3. JSTL标签之核心标签
  4. js方法的声明与调用
  5. Java中,一切皆是对象,为何数据类型中还分为:基本类型和对象?
  6. c语言计算多个整数加减,求用C编个大数加减法运算程序
  7. UPX 加壳工具:The Ultimate Packer for eXecutables
  8. [转]12个jquery插件
  9. 年薪30W的软件测试“老司机”工作经验
  10. 转载:Prototype.js的中文使用手册
  11. Fluent API Development in C# C#中流畅的API开发 Lynda课程中文字幕
  12. 自然语言处理NLP星空智能对话机器人系列:论文解读 How Good is Your Tokenizer? (你的词元分析器有多好?多语言模型的单语性能研究)
  13. java实现 tiff图片 转 JPG图片(完美解决)
  14. Windows强制关机之后,自动修复失败,无法开机的问题解决
  15. linux设置字符编码gbk,CentOS修改默认字符编码为GBK
  16. 请问在深圳做美工的工资多少
  17. [Python]plt.figure()、plt.subplot() 、plt.subplots()函数
  18. 【脉冲发生器的实际应用】- 大物理试验
  19. B站台湾大学郭彦甫|MATLAB 学习笔记|13 统计 Statistics__Data_Analysis
  20. 最快的排序算法是什么

热门文章

  1. 浅浅的整理一下机器学习视频资料
  2. Java8新特性——Stream流:不同于IO流的流,操作集合数据
  3. mysql用group by时报this is incompatible with sql_mode=only_full_group_by
  4. nginx 的location详细理解
  5. 烟台大学 计114-3.4 班学生的博客地址
  6. 还在啃老?是该来场逼格满满的产品展示了!
  7. lvds接口屏线安装图解_液晶显示器LVDS接口工作原理及改制方法
  8. 猿创征文|UDP/TCP网络编程
  9. java贝塞尔曲线_贝塞尔曲线学习
  10. OriginBot智能机器人开源套件-Step1套件组装