Linux一直以来都使用基于连接跟踪的有状态NAT,虽然xtables-addons里面实现了无状态的静态NAT,即RAWNAT,和Cisco的NAT实现相比还是不够灵活,本文给出一个全局意义的解释,虽然这种解释对于实际的配置没有什么帮助,但是可以帮助你更好地理解Linux和Cisco的系统构建。

1.Cisco的方案

Cisco路由器显式的将inside和outside的概念邦定于物理接口,然后根据数据流的方向来定义NAT规则。使能NAT以后,系统中就会存在一张两个方向的NAT映射表,该表的表项如何填充取决于NAT是静态的还是动态的,如果是静态的,那么两个映射表在配置完成后填充,如果是动态的,那么表项在数据包第一次匹配到access-list的时候填充。Cisco的NAT配置如下:
内网出去时的源地址转换:
ip nat inside source(dynamic,static)/ip nat inside destination(static)
内网出去时的目标地址转换:
ip nat inside destination(dynamic,static)/ip nat outside source(static)
外网进内网的目标地址转换:
ip nat outside destination

2.Linux的方案

Linux从内部规定了数据包必须经过的5个HOOK点,在这些HOOK上执行,Linux的接口仅仅是一个match,NAT完全根据逻辑意义的字段进行配置,和物理接口没有任何关系。Linux的系统中没有类似Cisco的全局的NAT双向映射表,Linux的NAT表仅仅是一个target,针对所有match都匹配的数据包起作用,协议栈不会针对每一个数据包来查询NAT表以获得是否需要NAT的信息。Linux的NAT配置如下:
内网出去的目标地址转换:
iptables -t nat -A POSTROUTING $MATCHES -o $outside  -j SNAT --to-source
内网出去的目标地址转换:
iptables -t nat -A PREROUTING $MATCHES -i $inside  -j DNAT --to-destination
外网进内网的目标地址转换:
iptables -t nat -A PREROUTING $MATCHES -i $outside  -j DNAT --to-destination

3.对比

上述分析可见,Linux的NAT是针对matches在数据包的内核路径特定方向上做的一个动作,matches是必须的(即使它是空),而Cisco的NAT则是针对不同进出网络的方向的数据所做的动作,matches被独立抽出来作为一个access-list只针对动态NAT有效。
        对于Linux的实现而言,由于IP本身就是一个match,所以没有办法直接使用一条iptables规则实现类似Cisco的static nat,iptables的nat的match和target都涉及到了地址本身,也就是说强制执行下面的逻辑:只要满足某些情况,就执行某个动作!对于nat而言,执行的动作只有转换到转换后的地址,此时必须需要一个明确的match,否则将针对所有的过路包进行相同的转换,目前的iptables无法支持变量,也不支持“与”和“或”,因此远没有Cisco的nat灵活。
        对于Cisco的实现而言,动态nat和Linux的iptables实现类似,只是把match剥离出来了,此处的match就是access-list,其动作就是一个pool,这个和iptables的target是一致的,至于inside和outside,只是Cisco为接口定义的角色,不是核心。Cisco的static nat可以理解为下面的逻辑:请将源地址A转换为源地址B,同时反向将目标地址从B转换为A!这是一个祈使句,而不是Linux iptables的条件句,因此Cisco的static nat是在两个方向有效的,如果是inside的source nat,由于映射是立即生效的,所以相当于outside的destination nat也添加了,而对于Cisco的动态nat,则必须限定数据的发起方向了。
        最后我们来看一下Cisco和Linux的NAT图示:
a.Cisco NAT:


b.Linux NAT:

本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1268873

Cisco与Linux的NAT相关推荐

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

    一点牢骚和希望 一直以来,一直对Linux的NAT很不满,也写过<Linux系统如何平滑生效NAT>系列文章中的patch进行修补,还写过一些类Cisco实现的patch,然而都效果不大好 ...

  2. Linux对称NAT的UDP穿越

    和同事讨论UDP打洞技术,后做了一个简单的实验,由于Windows上设置NAT以及察看其原理太麻烦或者根本就不可能,于是还是使用Linux做了实验,发现基于Linux ip_conntrack这种对称 ...

  3. Linux Server - NAT

    Linux Server - NAT 转载于:https://blog.51cto.com/leonkuo/631597

  4. linux nat软件,linux下nat的应用(转)

    linux下nat的应用(转) 随着Linux的应用普及,Linux在网络方面的强大逐步为大家所认识,越来越多的单位选择使用Linux来作为服务器的操作系统.今天笔者想就Linux在校园网NAT方面的 ...

  5. linux添加源地址ping,实战经验:Linux Source NAT在Ping场景下的应用

    原标题:实战经验:Linux Source NAT在Ping场景下的应用 有时候,有这样的一种需求: 需要修改IP数据包中的源地址,比如,从某一个主机发送Ping包到另一个主机,需要修改源地址为另一个 ...

  6. linux重启网络服务_vm上linux虚拟机NAT模式配置

    分享一篇之前搭建虚拟机过程中整理的linux虚拟机nat模式配置. 1.修改虚拟机的网络配置 右键点击虚拟机,然后点击settings,打开虚拟机的设置界面,然后点击Network Adapter,将 ...

  7. Cisco服务器怎么安装系统,CISCO服务器Linux系统安装步骤

    CISCO服务器Linux系统安装步骤 开机进入CISCO LOGO界面,按ESC,进入DOS界面. 根据提示,按CTRL+C进入RAID界面. 在RAID界面的Adapter下选择1064E,单击回 ...

  8. linux启用NAT功能,双网卡共享网络,iptables简单实现

    最近在研究linux双网卡共享网络的情况 简单来说就是一台linux有两块网卡,比如eth0及eth1,eth0可以正常连接外网,eth1连接内部网络,那么可以通过iptables实现eth1内部网络 ...

  9. Win7下的Linux通过Nat的VMnet8下的NAT方式进行上网

    [实践Ok]Win7下的Vmware下的Linux通过Nat的Vmware8(VMnet8)下NAT方式进行配置后SecureCRT能连接上并可以上网的配置方法 发表于2013-08-16 10:06 ...

最新文章

  1. 文巾解题 50. Pow(x, n)
  2. 成功解决pyinstaller生成exe缺少各种包的问题
  3. ADB Server 错误的解决办法
  4. .NET获取不到js写的cookie解决方法
  5. 再看Kafka Lag
  6. 可以使用中文作为变量名_次氯酸可以作为伤口消毒使用吗?
  7. gitee如何搭建mysql_Windows基于gitee使用hexo搭建个人博客笔记
  8. Effective_STL 学习笔记(七) 当使用 new 得指针容器时,记得在销毁容器前 delete 那些指针...
  9. jQuery的内容选择器和属性
  10. 吉林考生多少分能考上哈工大计算机专业,福建考生多少分能上哈工大?
  11. appium+python 【Mac】Android夜神模拟器
  12. Andorid用ksoap2调用wcfDemo
  13. 电脑专业英语1500词
  14. E盾网络验证企业版离线版成品EXE DLL加密源码加密网络验证
  15. 2021那些值得推荐的社区小程序
  16. Alien Skin Exposure v6.x 最新通用完整版汉化补丁
  17. 二维矩形件排样算法之最低水平线算法实现
  18. matlab绿屏抠像代码,DV影像素材抠像效果研究
  19. 腾讯王卡运营坑之一:web容器优雅停机缓慢
  20. Firefox的安装

热门文章

  1. ​他被称为印度“ IT 大王”,富可敌国,却精打细算如守财奴
  2. WKWebView免登陆,配置cookie
  3. uboot学习之BL3的流程
  4. ArcGIS工具备忘
  5. 学习决心书-linux oldboy
  6. ZooKeeper集群安装
  7. “allegro中焊盘的设置”收藏
  8. mongo 脚本对应的C#实现方式(待整理)
  9. VS.net 2005 试用(1)
  10. [TJOI2013]最长上升子序列