Cisco与Linux的NAT
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相关推荐
- Linux系统NAT实现机制的升级改进
一点牢骚和希望 一直以来,一直对Linux的NAT很不满,也写过<Linux系统如何平滑生效NAT>系列文章中的patch进行修补,还写过一些类Cisco实现的patch,然而都效果不大好 ...
- Linux对称NAT的UDP穿越
和同事讨论UDP打洞技术,后做了一个简单的实验,由于Windows上设置NAT以及察看其原理太麻烦或者根本就不可能,于是还是使用Linux做了实验,发现基于Linux ip_conntrack这种对称 ...
- Linux Server - NAT
Linux Server - NAT 转载于:https://blog.51cto.com/leonkuo/631597
- linux nat软件,linux下nat的应用(转)
linux下nat的应用(转) 随着Linux的应用普及,Linux在网络方面的强大逐步为大家所认识,越来越多的单位选择使用Linux来作为服务器的操作系统.今天笔者想就Linux在校园网NAT方面的 ...
- linux添加源地址ping,实战经验:Linux Source NAT在Ping场景下的应用
原标题:实战经验:Linux Source NAT在Ping场景下的应用 有时候,有这样的一种需求: 需要修改IP数据包中的源地址,比如,从某一个主机发送Ping包到另一个主机,需要修改源地址为另一个 ...
- linux重启网络服务_vm上linux虚拟机NAT模式配置
分享一篇之前搭建虚拟机过程中整理的linux虚拟机nat模式配置. 1.修改虚拟机的网络配置 右键点击虚拟机,然后点击settings,打开虚拟机的设置界面,然后点击Network Adapter,将 ...
- Cisco服务器怎么安装系统,CISCO服务器Linux系统安装步骤
CISCO服务器Linux系统安装步骤 开机进入CISCO LOGO界面,按ESC,进入DOS界面. 根据提示,按CTRL+C进入RAID界面. 在RAID界面的Adapter下选择1064E,单击回 ...
- linux启用NAT功能,双网卡共享网络,iptables简单实现
最近在研究linux双网卡共享网络的情况 简单来说就是一台linux有两块网卡,比如eth0及eth1,eth0可以正常连接外网,eth1连接内部网络,那么可以通过iptables实现eth1内部网络 ...
- Win7下的Linux通过Nat的VMnet8下的NAT方式进行上网
[实践Ok]Win7下的Vmware下的Linux通过Nat的Vmware8(VMnet8)下NAT方式进行配置后SecureCRT能连接上并可以上网的配置方法 发表于2013-08-16 10:06 ...
最新文章
- 文巾解题 50. Pow(x, n)
- 成功解决pyinstaller生成exe缺少各种包的问题
- ADB Server 错误的解决办法
- .NET获取不到js写的cookie解决方法
- 再看Kafka Lag
- 可以使用中文作为变量名_次氯酸可以作为伤口消毒使用吗?
- gitee如何搭建mysql_Windows基于gitee使用hexo搭建个人博客笔记
- Effective_STL 学习笔记(七) 当使用 new 得指针容器时,记得在销毁容器前 delete 那些指针...
- jQuery的内容选择器和属性
- 吉林考生多少分能考上哈工大计算机专业,福建考生多少分能上哈工大?
- appium+python 【Mac】Android夜神模拟器
- Andorid用ksoap2调用wcfDemo
- 电脑专业英语1500词
- E盾网络验证企业版离线版成品EXE DLL加密源码加密网络验证
- 2021那些值得推荐的社区小程序
- Alien Skin Exposure v6.x 最新通用完整版汉化补丁
- 二维矩形件排样算法之最低水平线算法实现
- matlab绿屏抠像代码,DV影像素材抠像效果研究
- 腾讯王卡运营坑之一:web容器优雅停机缓慢
- Firefox的安装