Linux系统怎么做NAT

【转】一、LB集群---NAT方式

A、负载调度器(load balancer):集群对外的前端机负责将客户的请求发送到一组服务器上执行;

VIP:集群对外的IP

该算法相对简单,不适用于服务器组中处理性能不一嘚情况而且当请求服务时间变化比较大时,轮叫调度算法容易导致服务器间的负载失衡

权值表示服务器的处理性能,服务器的缺省权徝为1假设服务器A的权值为1,B的权值为2则表示服务器B的处理性能是A的两倍。加权轮询调度算法是按权值的高低和轮叫方式分配请求到各垺务器权值高的服务器先收到的连接,即权值高的服务器比权值低的服务器处理更多的连接相同权值的服务器处理相同数目的连接数。

算法是把新的连接请求分配到当前连接数最小的服务器最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计垺务器的负载情况调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器其连接数加1;当连接中止或超时,其连接数减1

算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能服务器的缺省权值为1,系统管理员可以动态地设置垺务器的权值加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。

如果连续两次请求一样则传给相同嘚服务器(Cache原理)
相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率从而整个集群系统的处理能仂。

LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器若服务器没有超載,将请求发送到该服务器;若服务器超载则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中将请求发送到该服务器。同时当该 服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除以降低复制的程度。

ABC三台机器分别權重123 连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个使用sed算法后

动态的查看命令运行结果

四、FTP(被动模式)

但是客户端下载数据时,RealServer返回端口在之间让客户端下载时使用iptables的限定的10000:20000,返回IP是RIP,但RIP是私有地址所以只能返回给客户端VIP

}

    iptables是 一个Linux系统下优秀的nat+防火墙工具我使用该工具以较低配置的传统pc配置了一个灵活强劲的防火墙+nat系统,小有心得,看了网上也有很多这方 面的文章但是似乎要么说的比较尐,要么就是比较偏内容不全,容易误导我研究了一段时间的iptables同时也用了很久,有点滴经验写来供大家参 考,同时也备日后自己翻閱

tcp/udp port以及对mac地址的的定义与操作,所以我想ipchains应该是仅仅工作在三层上的

       我们先简单介绍一下netfilter的大致工作流程,也就是一个数据包(或者叫分组、packet,我个人习惯叫包)在到达Linux系统的网络接口的时候 (网卡)如何处理这个包然后再介绍一下如何用iptables改变或者说控制对这个数据包進行操作。netfilter内部分为三个表分别 是 filter,nat,mangle,每个表又有不同的操作链(Chains)在filter(过滤)表中,也就是他的防火墙功能的这个表定义了 三个 Chain。汾别是INPUT,FORWARD,OUTPUT也就是对包的入、转发、出进行定义的三个过滤链。对于这个filter表的操作和控 netfilter的mangle表则是一个自定义表里面包括上面的filter以及nat表中的各种chains,它可以让我们进行一些自定义的操 作,同时这个mangle表中的chains在netfilter对包的处理流程中处在一个比较优先的位置下面有一张图清晰的描绘了netfilter 对包的处理流程,一般情况下我们用不到这个mangle表,在这里我们就不做介绍了

之前过呢?大家可以看到这个图上上面有一个菱形的部分叫ROUTING,这个ROUTING部分就是Linux系统的route box,也就是路由系统, 它同样有很高深的功能可以实现策略路由等等一些高级特性,此处我们不做详细解释单说这個PREROUTING链,因为在这个链里面我们对包的操作是 DNAT,也就是改变目的地址和(或端口)通常用在端口转发,或者nat到内网的DMZ区也就是说当一个包過来的时候我们要改变它的目的地址,大家可 以想想,如果一个包在改变目的地址之前就被扔进了route box,让系统选好路之后再改变目的地址那么選路就可能是错的,或者说毫无意义了所 让internet用户通过这个公网ip访问我们内部的这个web服务器呢?我们就可以在这个PREROUTING链上面定义一个规则紦访问 60.1.1.1:80的用户的目的地址改变一下,改变为10.1.1.2:80,这样就实现了internet用户对内网服务器的访问了当然了,这个 端口是比较灵活的我们可以定义任哬一个端口的转发,不一定是80-->80具体的命令我们在下面的例子中介绍,这里我们只谈流程与概念上的实现方法

    好了,我们接着往下走這个包已经过了两个PREROUTING链了,这个时候出现了一个分支转折的地方,也就是图中下方的那个菱形 (FORWARD),转发!这里有一个对目的地址的判断(这里同样说明了PREROUTING一定要在最先不仅要在route box之前,甚至是这个 对目的地址的判断之前因为我们可能做一个去某某某ip的地方转到自己的ip的規则,所以PREROUTING是最先处理这个包的 Chain)!如果包 的目的地是本机ip,那么包向上走走入INPUT链处理,然后进入LOCAL PROCESS,如果非本地那么就进入FORWARD链进行过滤,峩们 在这里就不介绍INPUT,OUTPUT的处理了因为那主要是对于本机安全的一种处理,我们这里主要说对转发的过滤和nat的实现

    这里的FORWARD我简单说一下,當Linux系统收到了一个目的ip地址不是本地的包Linux系统会把这个包丢弃,因为默认情况下Linux系统的三层包转 发功能是关闭的,如果要让我们的Linux系統实现转发则需要打开这个转发功能,可以改变它的一个系统参数使用 FORWARD链里面,我们就可以定义详细的规则也就是是否允许他通过,或者对这个包的方向流程进行一些改变这也是我们实现访问控制的地方,这里同样 也是Mangle_FORWARD然后filter_FORWARD,我们操作任何一个链都会影响到这个包的命运在下面的介绍中,我们就忽略掉 mangle表我们基本用不到操作它,所以我们假设它是透明的假设这个包被我们的规则放过去了,也就昰ACCEPT了它将进入 POSTROUTING部分,注意!这里我注意到一个细节问题也就是上面的图中数据包过了FORWARD链之后直接进入了POSTROUITNG 链, 我觉得这中间缺少一个环節也就是route box,对于转发的包来说,Linux系统同样需要在选路(路由)之后才能将它送出这个图却没有标明这一点, 我认为它是在过了route box之后才进叺的POSTROUITNG,当然了这对于我们讨论iptables的过滤转发来说不是很重要,只是我觉得 流程上有这个问题还是要说明一下。

    同样的我们在这里从名字僦可以看出,这个POSTROUTING链应该是路由之后的一个链也就是这个包要送出这台Linux系统的最后一个环节了,这也是极 其重要的一个环节!!这个时候Linux系统已经完成(has done..^_^)了对这个包的路由(选路工作)已经找到了合适的接口送出这个包了,在这 个链里面我们要进行重要的操作就是被Linux系統称为 SNAT的一个动作,修改源ip地址!为什么修改源ip地址很多情况需要修改源地址阿,最常见的 就是我们内网多台机器需要共享一个或几个公网ip访问 internet,因为我们的内网地址是私有的假如就让Linux系统给路由出去,源地址也不变这 个包应该能访问到目的地,但是却回不来因为 internet上嘚N多个路由节点不会转发私有地址的数据包,也就是说不用合法ip,我们的数据包有去 无回。有人会说:“既然是这样我就不用私有 ip了,峩自己分配自己合法的地址不行吗那样包就会回来了吧?”答案是否定的ip地址是ICANN来分 配的,你的数据包或许能发到目的地但是回来嘚时候人家可不会转到你那里,internet上的路由器中的路由信息会把这个返回包送到那个合法的获得ip 的地方去你同样收不到,而你这种行为有可能被定义为一种ip欺骗,很多设备会把这样的包在接入端就给滤掉了可能都到不了你要访问的那个服务器,呵呵

ip_conntrack表里面做一个记录,记住昰内网的哪一个ip的哪个端口访问的这个web服务器,自己把它的源地址改成多少了端口改成多少了,以 便这个web服务器返回数据包的时候Linux系统將它准确的送回给发送请求的这个pc.  

    大体的数据转发流程我们说完了,我们看看iptables使用什么样的参数来完成这些操作

在 描述这些具体的操作之湔,我还要说几个我对iptables的概念的理解(未必完全正确)这将有助于大家理解这些规则,以实现更精确的控制上文中我们 提到过,对包嘚控制是由我们在不同的Chain(链)上面添加不同的规则来实现的比如我们对过滤表(filter table)添加规则来执行对包的操 控。那么既然叫链一定就是┅条或者多条规则组成的了,这时就有一个问题了如果多个规则对同一种包进行了定义,会发生什么事情呢在Chain中,所有 的规则都是从仩向下来执行的也就是说,如果匹配了第一行那么就按照第一行的规则执行,一行一行的往下找直到找到符合这个类型的包的规则為止。如果找 了一遍没有找到符合这个包的规则怎么办呢itpables里面有一个概念,就是Policy,也就是策略一说这个东西大家可能就会觉得比较麻烦,什么 策略阿我对于它的理解就是所谓这个策略就是chain中的最后一条规则,也就是说如果找了一遍找不到符合处理这个包的规则就按照policy來办。这

先介绍一下iptables如何操作链

这里要说明的就是-I将会把规则放在第一行-A将会放在最后一行。

比如我们要添加一个规则到filter表的FORWARD链

上 面的命令意思为:追加一个规则至filter表中的FORWARD链尾允许(-j ACCEPT)源地址为10.1.1.11目的地址为 202.1.1.1的数据包通过。其中-t后面跟的是表名在-A后面跟Chain名,后面的小写嘚 -s为源地址-d为目的地址,-j为处理方向

    我们在这里就介绍几种常用的参数,详细地用法可以man iptables看它的联机文档你会有意外的收获。

-j跳转,吔就是包的方向

    其中还有一个!参数使用!就是取反的意思。下面我们简单举几个例子介绍一下

-s这 个参数呢就是指定源地址的,如果使用這个参数也就是告诉netfilter对于符合这样一个源地址的包怎么去处理,可以指定某一个单播ip地址也可以 指定一个网络,如果单个的ip地址其实隱含了一个32位的子网掩码比如-s 10.1.1.11 其实就是-s 10.1.1.11/32 同样我们可 以指定不同的掩码用以实现源网络地址的规则,比如一个C类地址我们可以用-s 10.1.1.0/24来指定

-d參数与-s格式一样。

-o是出接口,与上同.

实例一:简单的nat路由器

确定你的Linux系统的ip配置无误可以正确的ping通内外的地址。同时用route命令查看Linux系统的本哋路由表确认指定了可用的ISP提供的默认网关。

将FORWARD链的策略设置为DROP这样做的目的是做到对内网ip的控制,你允许哪一个访问internet就可以增加一個规则不在规则中的ip将无法访问internet.

这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条否则你只允许lan IP访问没囿用,至于为什么下面我们再详细说。

这条规则做了一个SNAT也就是源地址转换,将来自10.1.1.0/24的地址转换为60.1.1.1

有这几条规则一个简单的nat路由器僦实现了。这时你可以将允许访问的ip添加至FORWARD链他们就能访问internet了。

比如我想让10.1.1.9这个地址访问internet,那么你就加如下的命令就可以了

也可以精确控制他的访问地址,比如我就允许10.1.1.99访问3.3.3.3这个ip

或者只允许他们访问80端口。

更多的控制可以自己灵活去做,或者查阅iptables的联机文档

目的:对内部server进荇端口转发实现internet用户访问内网服务器

也需要加入确认包和关联包的允许通过

ftp服务也同样,命令如下:

    好了命令完成了,端口转发也做完叻本例能不能转发呢?不能为什么呢?我下面详细分析一下对于iptables好像往外访问的配置比较容易,而对内 的转发似乎就有一些问题了在一开始的时候我就先说了一些关于netfilter的流程问题,那么我就简单说说做了这些配置之后为什么有可能还不行呢

    能引起这个配置失败的原因有很多,我们一个个的来说:

第一本例中,我们的FORWARD策略是DROP,那么也就是说没有符合规则的包将被丢弃,不管内到外还是外到内我們在这里依然不讨论那个确认包和关联包的问题,我们不用考虑他的问题下面我会详细说一下这个东西,那么如何让本例可以成功呢加入下面的规则。

一这个时候应该可以完成端口转发的访问了,但是有一些时候还是不行为什么?看问题二

第 二,内网server的ip配置问题这里我们以web server为例说明一下(ftp情况有一些特殊,下面我们再详细讨论说确认包和关联包的时候 讨论这个问题),上面说到有的时候可鉯访问了,有的时候却不行就是这个web server的ip设置问题了,如果web server没有指定默认 的网关那么在作了上面的配置之后,web server会收到internet的请求但是,他鈈知道往哪里回啊人家的本地路由表不知道你那个 internet的ip,202.1.1.1该怎么走。如果你使用截包工具在web server上面察看你会发现server收到了来自 202.1.1.1:1333-->10.1.1.1:80的请求,由于你沒有给web server配置默认网关它不知道怎么回去,所以就出现 了不通的情况怎么办呢?两个解决方法:一就是给这个server配置一个默认网关当然偠指向这个配置端口转发的Linux系统,本例是 10.1.1.254,配置好了,就一定能访问了有一个疑问?难道不需要在FORWARD链上面设置一个允许 web server的ip地址访问外网 的规則吗它的包能出去?答案是肯定的能出去。因为我们那一条允许确认包与关联包的规则否则它是出不去的。第二种方法比较麻烦┅些,但是对服务器来 说这样似乎更安全一些方法就是对这个包再作一次SNAT,也就是在POSTROUTING链上添加规则命令如下:

    ftp的 方法相同。这条命令鈈太好懂?其实很简单如果使用这条命令,那么你的web server不需要再设置默认网关就能收到这个请求,只要他和 原来是一个SNAT,改你的源地址于是这个包变成了10.1.1.254:xxxx-->10.1.1.1:80。为什么用xxxx了这里的端 口是随机的,我也不知道会是什么而整个的两次变化的过程都会记录在Linux系统的ip_conntrack中,当web server收到這个包的时候 发现,原来是一个内网自己兄弟来的请求阿又在一个广播域,不用找网关把返回包直接扔给交换机了,Linux系统在收到返囙包之后会根据他的 ip_conntrack中的条目进行两次变换,返回真正的internet用户于是完成这一次的访问。

    看了上面的两个例子不知道大家是否清楚了iptables嘚转发流程,希望对大家有所帮助下面我们就说说我一直在上面提到的关于那 个 ESTABLISHED,RELATED的规则是怎么回事,到底有什么用处说这个东西就要簡单说一下网络的数据通讯的方式,我们知道网络的访问是 双向的,也就是说一个Client与Server之间完成数据交换需要双方的发包与收包在netfilter中,囿几种状态也就是 new, established,related,invalid。当一个客户端在本文例一中,内网的一台机器访问外网我们设置了规则允许他出去, 但是没有设置允许回来的規则阿怎么完成访问呢?这就是netfilter的状态机制当一个lan用户通过这个Linux系统访问外网的时候,它发送了一个 请求包这个包的状态是new,当外网囙包的时候他的状态就是established,所以,Linux系统知道哦,这个包是我的内网的一台机器发出去的应 答包他就放行了。而外网试图对内发起一个新嘚连接的时候他的状态是new,所以Linux系统压根不去理会它。这就是我们为什么要加这一句的原因还有那 个 related,他是一个关联状态,什么会用到呢tftp,ftp都会用到,因为他们的传输机制决定了它不像http访问那 下,client使用port命令告诉server我用哪一个端口接受数据然后server主动发起对这个端口的请求。被动模式下 server使用 port命令告诉客户端,它用那个端口监听然后客户端发起对他的数据传输,所以这对于一个防火墙来说就是比较麻烦的事凊因为有可能会有new状态的数 据包,但是它又是合理的请求这个时候就用到这个related状态了,他就是一种关联在Linux系统中,有个叫 ftp_conntrack的模块咜 能识别port命令,然后对相应的端口进行放行

还有几个在实际中比较实用(也比较受用:-))的命令参数,写出来供大家参考

这个命令会显示鏈中规则的包和流量计数嘿嘿,看看哪些小子用的流量那么多用tc限了他。

查看目前的conntrack可能会比较多哦,最好加一个|grep "关键字"看看你感兴趣的链接跟踪

把当前的所有链备份一下,之所以放到/etc下面叫iptables,因为这样重起机器的时候会自动加载所有的链经常地备份一下吧,否则洳果链多万一掉电重启,你还是会比较痛苦

}

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

我要回帖

更多关于 Linux 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信