本文的名字取的比较有意义,因为本文并不是真的要讨论如何在Linux上使用iptables实现static nat!之所以这么命名本文,是想引起别人的注意,因为中文资料,以及国内的搜索引擎,基本上没有人关注这个问题,也几乎没有什么人讨论这个问题,而我却由于项目原因以及平时的折腾,切身体会到了Linux的NAT实现的缺陷。如果你使用google,你会看到大量的国外的技术宅男宅女们在讨论这个问题,虽然也并没有给出一个明确的解答(但是我相信,解答很快就会有的,xtables-addons-2.4?or later...)!我希望,即使你问的是度娘,“Static NAT with iptables on Linux”也能给出一个答案!如果本文不幸被某位大牛看到,加之这哥们儿再有点影响力,那么搞出来一个真正的Static Stateless的NAT实现就指日可待了!
        我相信,国内很多人也碰到了这个问题,也觉得Linux的NAT无法实现纯净的Static,Stateless,千万别扯RAWNAT,对于这个东西以及背后的想法,我可能比你知道的多些,RAWNAT不也得配两条规则吗?何况,即使你不把配置两条规则当成缺点-UNIX哲学笃信,能让人多个动作实现的,它绝不合并成一个,更加本质的原因在于Linux NAT规则的查找方式上。

        Linux的NAT附着于ip_conntrack之上,我再说一遍。这是一个优点,可以在一个流内部,一次查找,多次使用。然而我们看看这个查找的方式与代价,它是顺序查找的,也就是按照用户配置的顺序遍历规则表,假设我们已近实现了可以用iptables配置的static NAT,那么在10000个地址需要转换的情况下,让你失望的效果是多么明显,以至于你马上就由于其不可扩展的缺陷而改用BSD或者直接购买Cisco了,幸运的是,这种事从来没有发生,因为这只是一个假设,真正的可以用iptables配置的static NAT还没有实现,也许你会说:

iptables -t nat ....-s 1.1.1.1 -j SANT --to-source 2.2.2.2
iptables -t nat ....-d 2.2.2.2 -j DANT --to-destination 1.1.1.1


这算什么?配置工作量直接扩大两倍,虽不经常,也不绝对,这两条规则配置在了最后,赶紧抱着你的UNIX哲学跳楼吧!

        这么说吧,Linux没有实现一种可扩展的NAT规则查找机制,也许你会这么反驳我,Cisco的NAT不也有基于ACL的吗?ACL不也是按照配置顺序配置的吗?好吧,我承认你有点文化,并且带着怀疑论者的论调而不是妄下结论:“不,你错了!”。这实际上是我要说的话,并且很直接:不,你错了!首先基于ACL的匹配是针对于动态NAT的,它将匹配任务交给了ACL;其次,Cisco有自己的static NAT机制,在配置的时候就将映射注入系统,然后针对任意使能了NAT的接口进来的数据包执行统一高效的NAT表查询。

        现在我们抽离出NAT的操作步骤,首先要决定哪些包需要NAT,其次是查找NAT规则以便知道如何NAT,最后就是执行NAT。以上第三步执行NAT想必都是一样的,改一下包头即可,重点在前两个步骤。

        先看第一步,对于动态NAT,需要基于match来匹配,因为只有在符合一定条件的情况下,才能NAT,对于Linux,使用用户配置iptables NAT的顺序来匹配,对于Cisco,使用ACL,二者是一样的。然而针对static NAT,则这一点是确定的,在配置的时候就是确定的,然而Linux根本就没有实现,即使可以使用两条iptables实现,那也是使用用户的配置顺序来匹配的,这就不妥了,对于Cisco则没有这个问题。Cisco将高优先权匹配赋予了静态NAT,而Linux则全部依赖用户配置iptables规则的顺序。虽然依附于ip_conntrack的NAT可以提高效率,不必每次都遍历iptables NAT规则,但那也是在一个连接内部有效,起码对static的NAT不公平,试想大量的短连接的情况...

        再看第二步,第一步知道了哪些包要NAT,现在来看如何NAT,对于Linux而言,这个步骤和第一个步骤是合在一起的,即在你知道了它要NAT的时候就同时知道如何来NAT,前者就是matches,后者是target,而对于Cisco-也是本应该的做法,动态NAT情况,ACL和ip nat pool是分来的,并且一旦知道了如何NAT,该条NAT映射就会被注入系统内部,后续的包就可以直接在系统中查找NAT映射了而不必每次都匹配ACL了,静态NAT情况,该步骤和第一步是合在一起的。Linux也不是每次都匹配iptables的NAT规则,而是将“如何NAT”的结果附着于ip_conntrack的反向五元组上,后面的包直接查ip_conntrack即可,而这个查询是快速的。

        虽然我自己修改了一些代码已经可以应对这个问题,但是还是希望能有更加“官方”,更加健壮的代码出自业界大牛之手。另外令我费解的是,难道真的就没有碰到这个问题吗?肯定有人碰到过,虽然Linux作为纯网络设备的情况很少,但是对于中小型机构还是有的,宁可配置两条策略也不去想想怎么能一条搞定?好吧,我承认网上有很多封装,一条命令就能搞定,我在项目中也做过这种垃圾至极的封装,试问这些封装者,你们怎么也不去想想怎么去改进,问题被规避了而不是解决了。封装只是为了使用上的方便,但你一定要明白冰山下面有什么。我特别恶心那些介绍某种库的文字:xxx可以专注于业务逻辑,而不必xxx关注它的实现xxx。不关注并不代表不懂,不关注的意思是你不用自己去实现,但是你一定要理解为什么要这么实现!另外,并不是所有的事情都能靠封装解决的,Static NAT with iptables on Linux就是一例!

Static NAT with iptables on Linux的更多相关文章

  1. CentOS下配置iptables防火墙 linux NAT(iptables)配置

    CentOS下配置防火墙 配置nat转发服务CentOS下配置iptables防火墙 linux NAT(iptables)配置 CentOS下配置iptables 1,vim /etc/syscon ...

  2. 使用NAT方式连网的linux服务器虚拟机搭建

    从一开始我就很纠结centos服务器搭建的过程. 由于自己方向并不在运维上,但是学习开发也需要用到Linux所以就一直没认真去学. 经过自己多方面摸索与学习找到了自己的一套方法. 首先我用到的是 ce ...

  3. ebtables和iptables与linux bridge的交互

    本文为翻译文,不一定是逐字逐句的翻译,而且中间会加上自己的一点见解,如有理解错误的地方,还请大家指出,我定虚心学习.原文见链接 其中斜体字是自己的理解,建议和ebtables手册和iptables手册 ...

  4. 【iptables】linux网络防火墙-iptables基础详解(重要)

    一:前言   防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...

  5. The Beginner’s Guide to iptables, the Linux Firewall

    Iptables is an extremely flexible firewall utility built for Linux operating systems. Whether you’re ...

  6. Static, Shared Dynamic and Loadable Linux Libraries

    转载:http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html Why libraries are used: Th ...

  7. linux平台下防火墙iptables原理(转)

    原文地址:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646466.html iptables简介 netfilter/iptables( ...

  8. Linux iptables 配置规则

    Linux iptables 防火墙配置规则 前言:把网上我感觉不错iptables的访问规则都统一在这里,以后做参考. modprobe ipt_MASQUERADE modprobe ip_con ...

  9. Packet filtering with Linux & NAT

    http://www.linuxfocus.org/ChineseGB/May2003/article289.shtml Gateway, Proxy-Arp 和 Ethernet Bridge ? ...

随机推荐

  1. UVA 10273 Eat or Not to Eat?

    这个题目一直以为是要用图论知识来做,可是一点建图的思绪都没有,后来知道暴力便可破之.由于牛的产奶周期最大为10,1.2.3.....10的最小公倍数是MT = 2520,所以把MT作为最大的周期,然后 ...

  2. Ci框架整合smarty模板引擎

    Ci框架整合smarty模板引擎 备注:下载smarty时,最好选择2.6版本,其他测试有坑,ci可以是2.2或其他 大体思路:将smarty封装成ci框架的一个类,然后重新配置一下smarty,这样 ...

  3. Android开发之ADT中无Annotation Processin的解决办法

    使用ButterKnife的时候,进入ADT中设置的时候发现在Java Compiler展开后无Annotation Processin 解决办法: 安装插件:Juno - http://downlo ...

  4. hdu4714Tree2cycle

    链接 树上的一些操作还是不是太好想 直接dfs下去 不是最优的 一个节点最多保留两个度 如果它有两个以上的子节点 那么就与父节点断开 与k-2个子节点断开 再重新连 #pragma comment(l ...

  5. LA_4670_Dominating_Patterns_(AC自动机+map)

    描述 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  6. c程序设计语言_习题1-9_将输入流复制到输出流,并将多个空格过滤成一个空格

    Write a program to copy its input to its output, replacing each string of one or more blanks by a si ...

  7. 采用软件nginx实现web服务器集群

    nginx:软件负载均衡器  是高并发量http/反向代理服务器.实现windows下IIS的负载均衡 条件:2台服务器 1.cpu:Inter(R) 酷睿 i5 cpu 2.26GHz 内存:2G ...

  8. 两个结构体ifconf和ifreq

    用ioctl获得本地ip地址时要用到两个结构体ifconf和ifreq,它们对于大多数人来说都是比较陌生的,这里给大家一种比较简单的理解方法,当然只一种帮助理解的方法,在描述中可能会有一些地方与真实定 ...

  9. STL总结之deque

    STL中deque是我们常说的双端队列,既可以从头添加元素,也可以从尾部添加元素,deque的成员函数和vector的成员函数十分相似,但是它们的内部实现却又很多不同.   deque的模板声明: t ...

  10. bzoj2763: [JLOI2011]飞行路线 分层图+dij+heap

    分析:d[i][j]代表从起点到点j,用了i次免费机会,那就可以最短路求解 #include <stdio.h> #include <iostream> #include &l ...