【推荐阅读】
一、Netfilter/IPTables 框架简介
Netfiter/lPTables 是继2.0.x的IPfwadm、2.2.x的IPchains之后, 新- -代的Linux防火墙。Netilter采用 模
块化设计,具有良好的可扩展性,其重要工具模块IPTables连接到Netilter的架构中,并允许使用者对数据
报进行过滤、地址转换等处理操作。Netfilter提供了--个框架,将对网络的直接干涉降到最低,并允许规定
接口将其它包处理代码以模块的形式添加到内核中,具有极强的灵活性。
二、Netfilter总体架构
Netilter 主要通过表、链实现规则,可以这么说,Netfilter是 表的容器,表是链的容器,链是规则的容
器,最终形成对数据报处理规则的实现。
Netilter的通用框架不依赖于具体的协议,而是为每种网络协议定义一套HOOK函数, 这些HOOK函数
在数据报经过协议栈的几个关键点时被调用,这样这些模块就有机会检查、修改、丢弃该数据报及指示Netf
ilter将该数据报传入用户空间的队列。
Netilter定义了五大HOOK,分别是: NF_ IP_ PRE_ ROUTING、 NF_ IP LOCAL IN、 NF_ IP FORWA
RD、NF_ IP_ LOCAL OUT、NF IP_ POST_ ROUTING.,每个HOOK对应一一个操作链, 分别是: PREROU
TING、INPUT、FORWARD、OUTPUT、POSTROUTING.
数据报在进入系统,进行IP校验以后,首先经过第- -个HOOK函数NF IP PRE_ ROUTING时 行处理;然
后就进入路由代码,其决定该数据报需要转发还是发给本机;若数据报是发给本机,则该数据经过HOOK函
数NF IP_ LOCAL IN处理以后传递给上层协议;若该数据报应该被转发则它被NF IP_ FORWARD处理;经过
转发的数据报经过最后- -个HOOK函数NF_ IP POST_ ROUTING. 处理以后,再传输到网络上。本地产生的
数据报经过HOOK函数NF_ IP_ LOCAL_ OUT处理后,进行路由选择处理,然后经过NF IP_ POST ROUTIN
G处理发送到网络。如下图1(摘自网络)所示。

上图中的两个ROUTE环节是Linux内核中强大的路由代码,去掉5个HOOK之后,我们可以看到Netfilter
没有出现之前内核的数据路由体系结构
三、IPTables
IPTables工具模块提供了三个表,分别是filter,nat和mangle, 每个表有不同的操作链(chains),对应到
Netfilter框架就是各个HOOk函数。在filter表中定 义了三个链,分别是INPUT、FORW ARD、OUTPUT,也
就是对数据报的入,转发、出定义了三个过滤链。在nat 表中定义了PREROUTING、POSTROUTING、 0
UTPUT三个链。而在mangle表是-一个自定义的表,里面包括上面fiter和nat表中的各种链,它可以让我们自
定义一-些操作,同时这些chains在Netilter对包的处理流程中处于一-个比较优先的位置。如下图2 (摘自网络)
所示:

此图正跟图1对应,HOOK监听不同的表,一个HOOK可 能分很多步骤对三个表中的至少-一个 表进行操作,
表的作用
1、Mangle 表主要用来修改包的报头,有四种操作: TOS(服务类型,IP报头),TTL ( 生存时间,IP报
头) ,MARK (sbk 的nfmark域设置的值) MSS (最大数据报长度,tcp报头) 。
2、NAT表用作nat,也就是转换包的源或目标地址,注意:只有流的第-一个包会被这个链匹配,其后
的包会自动被做相同处理。实际操作可分: DNAT (目标网络地址转换) ,SNAT(源网络 地址转换),MASQUE
RADE (定义伪装)。
DNAT改变的是目的地址,以使能重路由到某台主机。
SNAT改变包的源地址,这在极大程序上可以隐藏你的本地网络或DMZ等。如果使用类似192,168,
0.1/24这样的地址,是不会从Internet得到任何回应的,因为IANA定义这些网络为私有的,只能用于LAN内部。
MASQUERADE对于每个匹配的包都是要查找可用的IP地址,而不像SNAT用的ip地址是配置好的。
3、flter 数据报过滤,在数据报传递的关键点上对其时行过滤。
四、Ipvs 和Netilter的关系
Ilpvs基本上是- -种高 效的Layer-4交换机,它提供负载平衡功能,当- - 个Tcp连接的初始SYN报文到达
时,ipvs就选择- -台服务器, 将报文转发给它。此后通过查发报文的IP和Tcp报文头地址,保证此连接的后
继报文被转发到相同的服务,不管请求被送到哪一台服 务器,返回结果都应该是一一样的, 但是在有一-些应用
中后端的服务器可能功能不一一,有的是提供HTML文档的web服务器,有的是提供图片的web服务器,有的
是提供CGI的web服务器。这时,就需要基于内容请求分发,同时基于内容请求分发可以提高后端服务器上
访问的局部性。
Ipvs支持三种负载均衡模式: NAT, T u nnel和direct routing(DR)。NAT是通用模式,所有交互数据必须通过均衡器(Director);后两种则是一种半连接处理方式,请求数据通过均衡器,而服务器的回应则是直接路由返回的,而这两种方法的区别是tunnel模式下由于进行了IP封装所以可路由,而DR方式是修改MAC地址来实现,所以必须同- -个网段。

图3中的第-一个灰色箭头表示来自PRE_ ROUTING 钩子的数据包到达LOCAL IN钩 子,Director接收到的每个到集群服务的数据包,不管你选择哪种转发方法,都必须通过PRE ROUTING钩子抵达LOCAL IN钩子,即所有Director内核内的数据包路由规则都必须将数据包发送到LOCAL_ IN钩子, 在你建立Director时这很容易实现,因为所有抵达Director的集群服务数据包都有-一个虚拟ip地址(VIP) 作为目标地址,VIP实际上是属于Director的一- 个ip别名或从属ip地址,因为VIP是Director所有的- -个本地ip地址,Director 内核中的路由表将总是在内部传递数据包,因此Director接收到的目标地址为VIP的数据包总会命中LOCAL _IN钩子。
图3中的第二个灰色箭头表示入站数据包被内核认可为是--个请求虚拟服务的数据包后的路径走向,当数据包命中LOCAL_ IN钩 子后,运行在内核内的LVS软件知道数据包是- - 个请求集群服务(在LVS术语中叫做虚拟服务)的数据包,因为数据包的目的是到VIP地址,你在建立你自己的集群时,使用ipvsadm工具添加虚拟服务VIP地址到内核中,以便LVS能够识别发送到VIP LOCAL IN钩子上的入站数据包。如果你没有添加VIP到LVS虚拟服务表(也叫做IPVS表),到VIP的数 据包可能会被传递到Director本地运行的守护进程上。但是因为Director知道VIP地址[3],它可以检查每个命中LOCAL_ IN钩 子的数据包是否是请求集群服务的数据包,在数据包到达Director本地运行的守护进程前,Director 还可以改变数据包的命运,LVS通过告诉内核它不应该将到VIP地址的数据包传递给本地的守护进程,而应该传递给集群节点来实现,这样数据包就会发送到POST _ROUTING钩子,如图3中的第二个箭头所指,数据包从连接D/RIP网络的网卡发送出去。
通过Netfilter钩子和你用ipvsadm工具创建的IPVS表使得LVS Director改变数据包命运的能力成为可能,这个能力使得Director可以分发入站集群服务请求给多个真实服务器(集群节点),但是这样做后,Director必 须跟踪每个连接,以便客户端计算机每次都能与同-一个真实服务器对话,Director通过在内存中维护- -张连接跟踪表来实现。