1. NAT 的划分

RFC3489 中将 NAT 的实现分为四大类:

1. Full Cone

NAT 完全锥形 NAT

2. Restricted Cone

NAT 限制锥形 NAT (可以理解为 IP 限制)

3. Port Restricted Cone

NAT 端口限制锥形 NAT ( IP+Port 限制)

4. Symmetric

NAT 对称 NAT

其中完全锥形的穿透性最好,而对称形的安全性最高

1.1 锥形NAT与对称NAT的区别

所谓锥形NAT

是指:只要是从同一个内部地址和端口出来的包,无论目的地址是否相同,NAT

都将它转换成同一个外部地址和端口。

“同一个外部地址和端口”与“无论目的地址是否相同”形成了一个类似锥形的网络结构,也是这一名称的由来。

反过来,不满足这一条件的即为对称NAT 。

1.2 举例说明

假设:

1.NAT 内的主机 A : IP 记为 A ,使用端口 1000

2.NAT

网关 : IP 记为 NAT ,用于 NAT

的端口池假设为( 5001-5999 )

3.公网上的主机 B : IP 记为B ,开放端口 2000

4.公网上的主机 C : IP

记为C ,开放端口 3000

假设主机 A 先后访问主机 B 和 C

1 )如果是锥形 NAT :

那么成功连接后,状态必然如下:

A ( 1000 ) —— > NAT (

5001 )—— > B ( 2000

)

A ( 1000 ) —— > NAT (

5001 )—— > C ( 3000

)

也就是说,只要是从 A 主机的 1000

端口发出的包,经过地址转换后的源端口一定相同。

2 )如果是对称形 NAT :

连接后,状态有可能(注意是可能,不是一定)如下:

A ( 1000 ) —— > NAT (

5001 )—— > B ( 2000

)

A ( 1000 ) —— > NAT (

5002 )—— > C ( 3000

)

两者的区别显而易见。

1.3 三种CONE NAT之间的区别

仍然以上面的网络环境为例, 假设 A 先与 B

建立了连接:

A ( 1000 ) —— > NAT (

5001 )——— > B ( 2000

)

1) Port Restricted Cone NAT:

只有 B ( 2000 )发往 NAT ( 5001

)的数据包可以到达 A ( 1000 )

===========================================================

B ( 2000 ) —— > NAT (

5001 ) ———

> A ( 1000

)

B ( 3000 ) —— > NAT (

5001 ) — X —

> A ( 1000

)

C ( 2000 ) —— > NAT (

5001 ) — X —

> A ( 1000

)

2) Restricted Cone NAT

只要是从 B 主机发往 NAT ( 5001

)的数据包都可以到达 A ( 1000 )

==========================================================

B ( 2000 ) —— > NAT (

5001 ) ———

> A ( 1000

)

B ( 3000 ) —— > NAT (

5001 ) ———

> A ( 1000

)

C ( 2000 ) —— > NAT (

5001 ) — X —

> A ( 1000

)

3) Full Cone NAT

任意地址发往 NAT ( 5001 )的数据包都可以到达 A

( 1000 )

==========================================================

B ( 2000 ) —— > NAT (

5001 ) ———

> A ( 1000

)

B ( 3000 ) —— > NAT (

5001 ) ———

> A ( 1000

)

C ( 3000 ) —— > NAT (

5001 ) ———

> A ( 1000

)

2. Linux的NAT

Linux的NAT“MASQUERADE”属于对称形NAT。

说明这一点只需要否定 MASQUERADE 为锥形 NAT

即可。

Linux 在进行地址转换时,会遵循两个原则:

1.尽量不去修改源端口,也就是说,ip

伪装后的源端口尽可能保持不变。

2.更为重要的是,ip 伪装后必须

保证伪装后的源地址/ 端口与目标地址/

端口(即所谓的socket )唯一。

假设如下的情况( 内网有主机 A 和 D ,公网有主机

B 和 C ):

先后 建立如下三条连接:

1.A ( 1000 ) —— > NAT

( 1000 )—— > B ( 2000

)

2.D ( 1000 ) —— > NAT (

1000 )—— > C ( 2000

)

3.A ( 1000 ) —— > NAT (

1001 )—— > C ( 2000

)

可以看到,前两条连接遵循了原则 1

,并且不违背原则 2

而第三条连接为了避免与第二条产生相同的 socket

而改变了源端口

比较第一和第三条连接,同样来自 A(1000)

的数据包在经过 NAT 后源端口分别变为了 1000 和 1001

。说明 Linux 的 NAT 是对称 NAT 。

3. 对协议的支持

CONENAT

要求原始源地址端口相同的数据包经过地址转换后,新源地址和端口也相同,换句话说,原始源地址端口不同的数据包,转换后的源地址和端口也一定不同。

那么,是不是 Full Cone NAT 的可穿透性一定比

Symmetric NAT 要好呢,或者说,通过 Symmetric NAT

可以建立的连接,如果换成 Full Cone NAT

是不是也一定能成功呢?

假设如下的情况:

(内网有主机A和D,公网有主机B和C,某 UDP

协议服务端口为 2000

,并且要求客户端的源端口一定为 1000 。 )

1)如果A使用该协议访问B:

A ( 1000 ) —— > NAT (

1000 )——— > B ( 2000

)

由于 Linux 有尽量不改变源端口的规则,因此在

1000 端口未被占用时,连接是可以正常建立的

如果此时D也需要访问B:

D ( 1000 ) —— > NAT (

1001 )—X—

> B ( 2000

)

端口必须要改变了,否则将出现两个相同的 socket

,后续由 B(2000) 发往NAT( 1000

)的包将不知道是转发给A还是D。

于是B将因为客户端的源端口错误而拒绝连接。

在这种情况下, MASQUERADE 与 CONENAT

的表现相同。

2)如果A连接B后,D也像C发起连接,而在此之后,A又向C发起连接

① A ( 1000 ) —— > NAT (

1000 )——— > B ( 2000

)

如果是 MASQUERADE :

② D ( 1000 ) —— > NAT (

1000 )——— > C ( 2000

)

③ A ( 1000 ) —— > NAT (

1001 )—X— > C ( 2000

)

如果是 CONENAT :

② D ( 1000 ) ——

> NAT ( 1001

)—X— > C ( 2000 )

③ A ( 1000 ) —— > NAT (

1000 )——— > C ( 2000

)

对于 MASQUERADE 来说,只要在没有重复的 socket

的情况下,总是坚持尽量不改变源端口的原则,因此第二条连接仍然采用源端口

1000 ,而第三条连接为了避免重复的 socket

而改变了端口。

对于 CONENAT ,为了保证所有来自 A(1000)

的数据包均被转换为 NAT(1000) ,因此 D 在向 C

发起连接时,即使不会产生重复的 socket ,但因为

NAT 的 1000 端口已经被 A(1000)

“占用”了,只好使用新的端口。

可以看出,不同的 target

产生不同的结果。我们也不能绝对的说,在任何时候,全锥形

NAT 的可穿透性都比对称 NAT

要好,比如上面的例子,如果只存在连接①和②,显然是对称形

NAT 要更适用。

因此,选择哪种 NAT

,除了对网络安全和普遍的可穿透性的考虑外,有时还需要根据具体应用来决定。

转发至微博

转发至微博

linux nat 博客,linux NAT的划分相关推荐

  1. linux 命令博客,Linux 命令

    linux 一切从根开始,一切皆文件~ 让我们从一些命令开始了解吧 基本命令 man  command:manual:查看命令帮助手册 ls:list:查看当前文件夹下的内容 -a:查看所有内容,包含 ...

  2. linux 编程博客,Linux系统编程博客参考

    Jquery中的日历插件 这个插件很简单:只需要在HTML代码中引入插件如下,CLASS名和click事件函数固定! ... Apache Solr 访问权限控制 Current state of a ...

  3. linux 命令博客,Linux命令(一)

    1.clear清屏 2.vi vi xxx.log i-->edit esc-->command shift+:-->end  输入 wq 3.cat xxx.log 查看 ---- ...

  4. 学习Linux的博客和资源网站

    个人推荐一些优质学习Linux的博客和网站 1.Katacoda - Interactive Learning Platform for Software Engineers 网页版的交互式软件工程师 ...

  5. linux 中文乱码博客,linux网页显示乱码终极解决---达到英文全部显示为中文

    遇到问题:本想在自己机器上的虚拟机上下载安装个redmine,体验项目管理软件,结果打开百度,才发现全部都显示未为乱码,于是尝试了好些办法,终于有了一个清晰的思路:一.安装好网络yum,二.安装rpm ...

  6. 学习资料(1)-学习网站,Linux,Git,博客

    下面会遇到一些学习用的网站,去注册一下 学习网站 视频教程 慕课网 CSDN学院 51CTO学院 极客学院 Coursera 麦子学院 codeschool Try Git 牧虎网 Linux 学习 ...

  7. 王垠博客 linux,前段时间花了一个通宵把王垠(Yin Wang)博客的所有文章看完了...

    前段时间花了一个通宵把王垠的博客看完了,觉得还是受益匪浅的,所以也给大家谈谈感想. 首先说起王垠这个人嘛,最早了解他的是因为他那篇神一般的传教洗脑文章<完全用Linux工作>,虽然后来被喷 ...

  8. linux 大牛博客,大牛

    (2010-02-19 20:45) 标签: 休闲 开市在即,不过外围股市非要恶心我们一下美元大涨,期货大跌,恒指暴跌,日经暴跌.国内股市,顺势调整不是坏事,这回是有理由了.哈哈.开盘后,以下行为主, ...

  9. 伴风网易博客linux,推开窗,让春色伴随你我

    推开窗,让春色伴随你我.欢迎大家光临夏日晚风博客阅读指导! 因为一曲优美的音乐,因为一段醉心的文字,因为一位优雅的旅伴,水墨晕染的人生平添了几分雅丽.如果可以,宁愿就这样美下去...... --文\铭 ...

最新文章

  1. 软件质量保证与测试文档怎么写,软件质量保证与测试整理版.pdf
  2. java代码同时下载_java代码实现打包多个文件下载功能
  3. 5G NR RLC:Data Transfer ARQ
  4. jQuery——插入元素节点的方法
  5. 跨模块中的分配内存问题
  6. Hadoop系列-分布式集群
  7. 游戏编辑器研发第一天,对比思考确定底层技术和从0开发场景编辑器原因
  8. oracle包与实体包,实体oracle数据库学习
  9. gdrive 下载 google cloud 文件
  10. Python对文件(外存)和内存的操作
  11. UITT私有化自动跟单系统
  12. CRM系统中的线索、客户、联系人、商机
  13. js 数组转json,json转数组
  14. 可穿戴设计的传感器技术_凯利讯
  15. 电池寿命增压器为android,一个涡轮增压器的寿命只有10年?
  16. java中文句号转换英文句号_java实现中文或其他语言及标点符号等转换成unicode字符串,或unicode的16进制码转换回文字或符号等...
  17. 去哪儿 android,去哪儿网无线端再发力 为Android配“旅行助手”
  18. Ajax方式实现文件下载失败
  19. 数控铣床常用编程指令
  20. 学校计算机维修结算报告,计算机二级考试真题-Word-经费联审结算单

热门文章

  1. 良心安利龙/恐龙c4d模型素材网站
  2. 目前我在用的免费虚拟主机
  3. UnityShader实例05:Toon(卡通)材质
  4. 高通gobi系列modem
  5. 【Java】fina关键字
  6. 设计计算机配置方案技术参数,广西科学技术信息技术七年级上册_《设计计算机配置方案》教案1...
  7. android 特殊字符 反斜杠,特殊字符反斜杠\
  8. html怎样加粗直线,html字体怎么加粗
  9. clientX和clientY
  10. java运行cmd命令