关闭

Linux的NAT实现浅谈

标签: linuxserverinsertsocket
10581人阅读 评论(1) 收藏 举报
NAT实际上就是一个代理,代理NAT内部的所有机器,NAT的分类就是按照“如何代理”来讲的,不管是基于连接的NAT实现,还是基于包的NAT实现,都要处理好一个映射关系,那就是转换后的包的返回包如何转换回原始的。
        Linux的NAT是对称NAT,而不是锥形NAT,虽然很多时候Linux的NAT看起来更像是一个锥形NAT。
        只需要明白Linux实现NAT的本质,即使不明白NAT的分类也无所谓。Linux实现NAT的原则很简单:
用最小的代价保证一个tuple五元组在转换前的五元组和转换后的五元组中的唯一性。
注意,这两个五元组是分开存放的,它们在hash链表层面并没有任何关联。实际上这是ip_conntrack的实质,ip_conntrack在存放连接的时候是按照“两个方向”分别存放的,因此需要一个五元组在两个方向的hash表中是唯一的才可以。有人说Linux可以实现锥形NAT,然而这个锥形NAT实际上是很脆弱的,考虑以下的连接:
(PC:1234->SERVER:80)
因此NAT上会出现下面的tuple(五元组):
正方向:(PC1:1234->SERVER:80)
反方向:(SERVER:80->NAT:1234)
如果此时PC2同样使用端口1234连接了SERVER2的80,那么NAT上将会出现新的两个tuple:
正方向:(PC2:1234->SERVER2:80)
反方向:(SERVER2:80->NAT:1234)
此时如果PC1也想用1234端口连接SERVER2的80,如下:
正方向:(PC1:1234->SERVER2:80)
反方向:
为何是一个“?”呢?如果Linux NAT是锥形的NAT,那么根据锥形的含义,NAT需要将PC2的源组转换为(NAT:1234->SERVER2:80),这样的话,反方向的tuple就是(SERVER2:80->NAT:1234)了,和PC2的反方向tuple相冲突,这是不可以的,Linux自动将其源端口作了改变,转换为(NAT:不是1234->SERVER2:80),进而反方向tuple成了(SERVER2:80->NAT:不是1234)了,因此解决了唯一性问题,在“第三者的帮助下”,Linux被动成了对称NAT...
        至于锥形NAT中的Port Restricted Cone,Restricted Cone,Full Cone这三类锥子,就不用讨论了,这三类锥子的目的在于限制反向流量的穿透性,一种分类上的清晰化会使策略实现起来更加方便,之所以将NAT分为锥形和对称的,并且锥形的又分为三个类别,这完全是为了实现RFC3489,而这个RFC是打洞技术的基石,也就是说,分类是为了描述打洞实现时更加方便简洁。反过来,NAT之所以可以被穿越(成功打洞),正是在于描述NAT本身的RFC没有规定其实现方式,也没有规定“不让穿越”,Linux只是按照RFC保证了NAT的结果,这也是实现之一而不是唯一的实现。
        本文最开始谈到,NAT需要解决一个映射问题,而一个包携带的所有识别信息的交集就是五元组,因此NAT可以起到连接限制的作用,NAT设备能开放的所有连接数量由它所持有的公网IP地址以及可用的端口数量决定,比如下面的规则:
iptables -t nat -A POSTROUTING -p --dport 80 -j SNAT --to-source X.X.X.X:80
那么整个NAT后方,同时则只有一台机器的一个socket能连接到同一个目标的80端口,否则反方向的tuple就会冲突。可以通过/proc/net/stat/ip_conntrack文件的insert_failed那一列看到所有后续的连接反方向tuple由于和既有的反方向tuple相冲突而计数器递增。
        Linux不区分以上这些由RFC3489而引发的XX,甚至都不区分锥形NAT和对称NAT,只保证NAT的结果即可。
0
0
查看评论

linux下配置NAT服务

    网络地址转换(NAT)是用于将一个地址域(如:专用Intranet)映射到另一个地址域(如:Internet)的标准方法。NAT允许一个机构专用Intranet中的主机透明地连接到公共域中的主机,无需内部主机拥有注册的(以及越来越缺乏的)Internet地址。I...
  • colin719
  • colin719
  • 2005-08-09 20:08
  • 9572

linux NAT方式上网

我以下写的配置方法别人在网上已经发布过类似的文章。但是我觉的别人写的 东西不一定是对的,必须自己亲自试验一下才行。就像有句话说的:“实践是检验真理的唯一标准”以下是我操作的步骤。希望不足的地方,读者能够指出。    1.必须检查你的windows系统的VMware DHCP ...
  • xh16319
  • xh16319
  • 2014-09-30 15:30
  • 3727

linux(centos)使用NAT方式连接网络

1.最近本人学习hadoop,用到linux,之前能够上网的,可设置静态ip就不能上网,研究了整整两天,整出来了。 2. 使用系统cetnos6.4版本,VM虚拟机 3. 使用NAT方式来上网 4. 点击虚拟机虚拟网络编辑器 5.记下图中红框数据 6.这里只要记住起始...
  • qq_22222499
  • qq_22222499
  • 2016-11-18 20:22
  • 2976

Linux下配置NAT服务器共享上网

            >content:    0. 本次配置的网络的拓扑结构:   ...
  • tge7618291
  • tge7618291
  • 2010-05-22 20:36
  • 10833

Linux下模拟验证NAT功能

Linux下模拟验证NAT功能 NAT(网络地址转换)功能能够方便内网与外网(通常是Internet)连接,既减少了有效IP的使用量又保护了内网主机的信息。 Linux下的NAT功能嵌入在Linux最新一代防火墙Netfilter中,并提供给用户操作接口Iptables,相关知识可以查看网上资料...
  • zhaoyunfullmetal
  • zhaoyunfullmetal
  • 2015-12-03 19:00
  • 949

linux: 虚拟机使用NAT方式连网《不会你抽我系列》

闲来无事,扯点皮,详细说下NAT配置过程 NAT全称Network Address Translation网络地址转换,顾名思义,配置的重点也是地址转换。 步骤1、配置局域网段及网关 打开vmware的visual network editor,设置成下图样式: 图示
  • lzx_bupt
  • lzx_bupt
  • 2011-09-23 16:09
  • 14953

Linux的NAT实现浅谈

NAT实际上就是一个代理,代理NAT内部的所有机器,NAT的分类就是按照“如何代理”来讲的,不管是基于连接的NAT实现,还是基于包的NAT实现,都要处理好一个映射关系,那就是转换后的包的返回包如何转换回原始的。        Li...
  • dog250
  • dog250
  • 2012-06-14 18:19
  • 10581

Linux NAT基本流程与实现技巧

基于matches的NATLinux的NAT是基于match的,即在满足一系列条件的前提下执行SNAT或者DNAT,因此要求也就比较宽松,唯一的约束就是路由,即路由动作发生的时候,必须是基于最终的目标IP地址,因此DNAT必须发生在路由之前(对于本机发出的数据包,则在路由之后,然后重新路由),如下图...
  • dog250
  • dog250
  • 2013-10-04 11:35
  • 5999

Linux 与 CONE NAT 和 Symmetric NAT

1. NAT 的划分 RFC3489 中将 NAT 的实现分为四大类: 1. Full Cone NAT           &...
  • farrellcn
  • farrellcn
  • 2012-02-02 17:19
  • 1908

Linux系统NAT实现机制的升级改进

一点牢骚和希望一直以来,一直对Linux的NAT很不满,也写过《Linux系统如何平滑生效NAT》系列文章中的patch进行修补,还写过一些类Cisco实现的patch,然而都效果不大好,暴雨的夜晚,长假的倒数第二晚,虽然没有10月7日晚雨量大,可是10月6日晚上到7日凌晨,上海嘉定那边的雨也可以堪...
  • dog250
  • dog250
  • 2013-10-13 08:05
  • 4955
    个人资料
    • 访问:7060089次
    • 积分:84658
    • 等级:
    • 排名:第18名
    • 原创:1435篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3116条
    文章存档
    最新评论