Iptables

来源:互联网 发布:暮色森林js是不是mod 编辑:程序博客网 时间:2024/03/29 09:22

前言
  防火墙在校园内一直被认为陌晦高深,很少有系管师有勇气进行计划性的实验,基本上这份讲义也可以当成测试报告来阅读,是笔者秉持我不入地狱、谁入地狱的精神,冒着生命危险,蛮干出来的成果,也藉此抛砖引玉,希望能带动国内能力高于笔者许多的众家高手,一起来进行有利于校园网络的公益研究!
  
  一、什么是防火墙
  防火墙是一套能够在两个或两个以上的网络之间,明显区隔出实体线路联机的软硬件设备组合。被区隔开来的网络,可以透过封包转送技术来相互通讯,透过防火墙的安全管理机制,可以决定哪些数据可以流通,哪些资料无法流通,藉此达到网络安全保护的目的。
  防火墙产品可以概略归类为硬件式防火墙和软件式防火墙,但实际上无论是硬件式或软件式防火墙,它们都需要使用硬件来作为联机介接,也需要使用软件来设定安全政策,严格说两者间的差别并不太大。我们只能从使用的硬件与操作系统来加以区分,硬件式防火墙是使用专有的硬件,而软件式防火墙则使用一般的计算机硬件,硬件式防火墙使用专有的操作系统,而软件式防火墙则使用一般的操作系统。
  防火墙依照其运作方式来分类,可以区分为封包过滤式防火墙 (Packet Filter) 、应用层网关式防火墙 (Application-Level Gateway,也有人把它称为 Proxy 防火墙)、电路层网关式防火墙 (Circuit-Level Gateway)。其中被广为采用的是封包过滤式防火墙,本文要介绍的 iptables 防火墙就是属于这一种。
  封包过滤是最早被实作出来的防火墙技术,它是在 TCP/IP 四层架构下的 IP 层中运作。封包过滤器的功能主要是检查通过的每一个 IP 数据封包,如果其标头中所含的数据内容符合过滤条件的设定就进行进一步的处理,主要的处理方式包含:放行(accept)、丢弃(drop)或拒绝(reject)。要进行封包过滤,防火墙必须要能分析通过封包的来源 IP 与目的地 IP,还必须能检查封包类型、来源埠号与目的埠号、封包流向、封包进入防火墙的网卡接口、TCP的联机状态等数据。
  防火墙由于种种理由价格一直居高不下,对于贫穷的中小学来讲要采购一台防火墙,简直是不可能的任务,而由于 Linux 的风行,使用 Linux 来充作软件式防火墙,似乎是不错的解决之道,本文拟介绍以 Linux 上最新最强大的 iptables 防火墙软件,建置出适合学校使用的过滤规则,让缺钱的学校能有一套好用的防火墙来看守校园网络的大门。
  
  二、Linux 防火墙演变简史
  Linux 最早出现的防火墙软件称为 ipfwipfw 能透过 IP 封包标头的分析,分辨出封包的来源 IP 与目的地 IP、封包类型、来源埠号与目的埠号、封包流向、封包进入防火墙的网卡界面......等,并藉此分析结果来比对规则进行封包过滤,同时也支持 IP 伪装的功能,利用这个功能可以解决 IP 不足的问题,可惜这支程序缺乏弹性设计,无法自行建立规则组合(ruleset)作更精简的设定,同时也缺乏网址转译功能,无法应付越来越复杂的网络环境,而逐渐被淘汰。
  取而代之的 ipchains,不但指令语法更容易理解,功能也较 ipfw 优越;ipchains 允许自订规则组合(ruleset),称之为 user-define chains,透过这种设计,我们可以将彼此相关的规则组合在一起,在需要的时候跳到该组规则进行过滤,有效将规则的数量大幅缩减,以往 ipfw 仅能进行循序过滤,导致规则又臭又长的毛病,就不药而愈了。除了这个明显的好处以外,ipchains 并能结合本身的端口对应功能和 redir 程序的封包转送机制,模拟出网址转译的能力,而满足 NAT 的完整需求,堪称为一套成熟的防火墙作品。
  防火墙软件的出现,确实曾经让骇客们晚上睡不着觉,因为防火墙的阻隔能够有效让内部网络不设防的单机不致于暴露在外,也能有效降低服务器的能见度,减少被攻击的机会,骇客过去所用的网络探测技术因此受到严格的挑战,越来越多的攻击对象躲藏在防火墙后方,让骇客难以接近,因此必须针对新的情势,研究出新的探测技术,藉以规避防火墙的检查,达到发现目标并进而攻击入侵的目的,新的技术非常多,本文并不拟进一步讨论,请自行参考 CERT 组织的技术文件,网址是 www.cert.org ,想看中文请连到 www.cert.org.tw
  iptables 作为 ipchains 的新一代继承人,当然也针对骇客不断推陈出新的探测技术拟出一些因应之道,那就是对封包的联机状态,作出更详细的分析,例如:是否为新联机或响应封包、是否为转向联机、联机是否失去响应,联机时间是否过长......等等,透过这样的分析能对一些可能被骇客利用的弱点加以阻隔(请详见后文的说明),另外也开发出真正的封包改写能力,不需要透过其它程序的协助来仿真网址转译,除此之外,iptables 也获得系统核心的直接支持,不需要像 ipchains 那样需要自行重新编译核心。
  iptables 优越的性能使它取代了 ipchains,成为网络防火墙的主流,而 ipchains 并未被淘汰,目前 ipchains 已经转型成单机防火墙,在安装新版 Linux 时,会自动被安装启用,以保护单机上未被使用的通讯端口。
  
  三、iptables 防火墙概论
  iptables 防火墙的指令非常类似于 ipchains,使用过 ipchains 的人应该很容易上手,但是 iptables 的机制与 ipchains 有很大的不同,使用 ipchains 的概念来设定规则,将会使防火墙无法正常运作。ipchains iptables 最大的不同在于对 INPUTFORWARD OUTPUT 三个网络函式的定义不同,这三个网络函式是 TCP/IP 驱动程序的一部分,结构如下图所示,是介于网卡驱动程序和应用程序的中间,Linux 核心预设会启用 INPUTOUTPUT LOOPBACK,而 FORWARD 函式则必须自行启用,可以使用下面指令,或直接修改 /etc/sysconfig/network 组态档:
  echo "1" >; /proc/sys/net/ipv4/ip_forward
  左图为 ipchains 概念下的运作图
  从上图可以知道 ipchains 如何处理封包的流动,分述如下:
  • IP INPUT:所有封包都由 IP INPUT 函式负责处理,所以设定过滤规则时,几乎都是设定在 INPUT 规则炼上。
  • IP FORWARD:目的 IP 非本机的 IP,这些封包需要进一步作转送处理,此函式用来处理 IP 伪装和 Port 转送。
  • IP OUTPUT:所有流出的封包都由这个函式处理,通常不需设定任何规则。
  iptables 除了上述三支函式以外,还使用两个新的函式:PreroutingPostrouting。现在来比较一下 iptables 的运作模式(loopback 接口与上图相同,所以省略不画):
  
  从上图可以知道 iptables 如何处理封包的流动,分述如下:
  • IP INPUT:只有要到达本机的封包才会 INPUT 函式处理,所以会让来自内部网络的封包无条件放行,来自外部网络的封包则过滤是否为 响应封包,若是则放行。
  • PREROUTING:需要转送处理的封包由此函式负责处理,此函式用来做目的地 IP 的转译动作(DNAT)。
  • IP FORWARD:所有转送封包都在这里处理,这部分的过滤规则最复杂。
  • POSTROUTING:转送封包送出之前,先透过这个函式进行来源 IP 的转译动作(SNAT)。
  • IP OUTPUT:从本机送出去的封包由这个函式处理,通常会放行所有封包。
  iptables ipchains 都可以自行定义规则群组(rule-set),规则群组被称为规则炼(chains),前面所描述的函式,也都有相对应的规则炼(INPUTFORWARDOUTPUTPreroutingPostrouting),为了有别于自行定义的规则炼,这些规则炼我们就称为内建规则炼,其运作流程仿真如下图:
  
  
  从上面两张假想图,学员们不难了解 ipchains 为什么要叫做 chains,因为它是将所有规则串接成一个序列逐一检查过滤,就像一条铁链一样一个环接一个环,在过滤过程中只要符合其中一条规则就会立即进行处理,如果处理动作是跳到某个规则群组,则继续检查群组内之规则设定,但如果处理动作是 ACCEPTREJECTDROPREDIRECT MASQUERADE,则会中断过滤程序,而不再继续检查后面的规则设定,在这样的结构之下,有时候规则顺序的对调会产生完全相反的结果,这一点在设定防火墙时不能不谨慎。
  而 iptables 是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting,然后检查目的 IP 判断是否需要转送出去,接着就会跳到 INPUT Forward 进行过滤,如果封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及 Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPTREJECTDROPREDIRECT MASQUERADE 以外,还多出 LOGULOGDNATSNATMIRRORQUEUERETURNTOSTTLMARK 等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则炼的过滤,并依照前述流程继续进行下一个规则炼的过滤(注意:这一点与 ipchains 不同),一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非炼状过滤(chains)。
  虽然 iptables 为了扩充防火墙功能,而必须采用比较复杂的过滤流程,但在实际应用时,同一规则炼下的规则设定还是有先后顺序的关系,因此在设定规则时还是必须注意其中的逻辑。
  
  四、订定校园网络安全政策
  在实际设定防火墙之前,我们必须根据校园网络的安全需求,先拟定一份安全政策,拟定安全政策前必须搜集以下资料:
  1. 找出需要过滤保护的服务器
  2. 条列出被保护的服务器将提供何种网络服务
  3. 一般工作站,需要何种等级的保护
  4. 了解网络架构与服务器摆放位置
  根据这些数据,我们可以决定安全政策,以石牌国小为例:
  1. 校内使用 NAT 虚拟网络,IP 数量需要两组 C,所有 IP 均需作 IP 伪装
  2. 校园内安全需求不高,服务器与工作站摆在同一网段,不需采用 DMZ 设计
  3. 由于服务器功能经常扩充,所有服务器均采用一对一对应,不使用 port 转送功能
  4. 所有工作站均能自由使用网络资源,不限制只能看网页
  5. 服务器提供之服务包含:dnswebmailftpwamwebminsshrdppcaw,不提供 proxy 及其它网络服务
  6. 为增进校园网络之安全性,采用正面表列方式进行封包过滤(定义想放行之封包,其余封包一律阻挡)
  还有一些网络安全须注意的事项,则是每所学校都应防范的,没有等差之别,例如:联机被绑架、阻断式攻击、连接端口扫描......等。
  
  五、iptables 指令
  语法:
  iptables [-t table] command [match] [-j target/jump]
  -t 参数用来指定规则表,内建的规则表有三个,分别是:natmangle filter,当未指定规则表时,则一律视为是 filter。各个规则表的功能如下:
  nat 此规则表拥有 Prerouting postrouting 两个规则炼,主要功能为进行一对一、一对多、多对多等网址转译工作(SNATDNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行来源网址转译,反之亦然,因此为了提升改写封包的效率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将会造成无法对同一封包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。
  mangle 此规则表拥有 PreroutingFORWARD postrouting 三个规则炼。
  除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTLTOS)或者是设定 MARK(将封包作记号,以便进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。
  filter 这个规则表是预设规则表,拥有 INPUTFORWARD OUTPUT 三个规则炼,这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP LOG ACCEPT REJECT),我们会将基本规则都建立在此规则表中。
  常用命令列表:
  命令 -A, --append
  范例 iptables -A INPUT ...
  说明 新增规则到某个规则炼中,该规则将会成为规则炼中的最后一条规则。
  命令 -D, --delete
  范例 iptables -D INPUT --dport 80 -j DROP
  iptables -D INPUT 1
  说明 从某个规则炼中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
  命令 -R, --replace
  范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
  说明 取代现行规则,规则被取代后并不会改变顺序。
  命令 -I, --insert
  范例 iptables -I INPUT 1 --dport 80 -j ACCEPT
  说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。
  命令 -L, --list
  范例 iptables -L INPUT
  说明 列出某规则炼中的所有规则。
  命令 -F, --flush
  范例 iptables -F INPUT
  说明 删除某规则炼中的所有规则。
  命令 -Z, --zero
  范例 iptables -Z INPUT
  说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
  命令 -N, --new-chain
  范例 iptables -N allowed
  说明 定义新的规则炼。
  命令 -X, --delete-chain
  范例 iptables -X allowed
  说明 删除某个规则炼。
  命令 -P, --policy
  范例 iptables -P INPUT DROP
  说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
  命令 -E, --rename-chain
  范例 iptables -E allowed disallowed
  说明 修改某自订规则炼的名称。
  常用封包比对参数:
  参数 -p, --protocol
  范例 iptables -A INPUT -p tcp
  说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含 udpicmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all
  参数 -s, --src, --source
  范例 iptables -A INPUT -s 192.168.1.1
  说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时也可以使用 ! 运算子进行反向比对,例如:-s ! 192.168.0.0/24
  参数 -d, --dst, --destination
  范例 iptables -A INPUT -d 192.168.1.1
  说明 用来比对封包的目的地 IP,设定方式同上。
  参数 -i, --in-interface
  范例 iptables -A INPUT -i eth0
  说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+ 表示所有的 ethernet 网卡,也可以使用 ! 运算子进行反向比对,例如:-i ! eth0
  参数 -o, --out-interface
  范例 iptables -A FORWARD -o eth0
  说明 用来比对封包要从哪片网卡送出,设定方式同上。
  参数 --sport, --source-port
  范例 iptables -A INPUT -p tcp --sport 22
  说明 用来比对封包的来源埠号,可以比对单一埠,或是一个范围,例如:--sport 22:80,表示从 22 80 埠之间都算是符合条件,如果要比对不连续的多个埠,则必须使用 --multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。
  参数 --dport, --destination-port
  范例 iptables -A INPUT -p tcp --dport 22
  说明 用来比对封包的目的地埠号,设定方式同上。
  参数 --tcp-flags
  范例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
  说明 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设定,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL NONE 进行比对。比对旗号时,可以使用 ! 运算子进行反向比对。
  参数 --syn
  范例 iptables -p tcp --syn
  说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 ! 运算子,可用来比对非要求联机封包。
  参数 -m multiport --source-port
  范例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
  说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。
  参数 -m multiport --destination-port
  范例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
  说明 用来比对不连续的多个目的地埠号,设定方式同上。
  参数 -m multiport --port
  范例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
  说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为 80 但目的地埠号为 110,这种封包并不算符合条件。
  参数 --icmp-type
  范例 iptables -A INPUT -p icmp --icmp-type 8
  说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp --help 来查看有哪些代码可以用。
  参数 -m limit --limit
  范例 iptables -A INPUT -m limit --limit 3/hour
  说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均一次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second /minute/day 除了进行封包数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。
  参数 --limit-burst
  范例 iptables -A INPUT -m limit --limit-burst 5
  说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。
  参数 -m mac --mac-source
  范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
  说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT Postrouting 规则炼上,这是因为封包要送出到网卡后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到哪个网络接口去。
  参数 --mark
  范例 iptables -t mangle -A INPUT -m mark --mark 1
  说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最大不可以超过 4294967296
  参数 -m owner --uid-owner
  范例 iptables -A OUTPUT -m owner --uid-owner 500
  说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出去,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。
  参数 -m owner --gid-owner
  范例 iptables -A OUTPUT -m owner --gid-owner 0
  说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
  参数 -m owner --pid-owner
  范例 iptables -A OUTPUT -m owner --pid-owner 78
  说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。
  参数 -m owner --sid-owner
  范例 iptables -A OUTPUT -m owner --sid-owner 100
  说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。
  参数 -m state --state
  范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
  说明 用来比对联机状态,联机状态共有四种:INVALIDESTABLISHEDNEW RELATED
  INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
  ESTABLISHED 表示该封包属于某个已经建立的联机。
  NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
  RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。
  常用的处理动作:
  -j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPTREJECTDROPREDIRECTMASQUERADELOGDNATSNATMIRRORQUEUERETURNMARK,分别说明如下:
  ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(nat:postrouting)。
  REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachableICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:
  iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
  DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
  REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式 porxy 或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
  MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IPIP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
  iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
  LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其它规则。例如:
  iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
  SNAT 改写封包来源 IP 为某特定 IP IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下:
  iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
  DNAT 改写封包目的地 IP 为某特定 IP IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则炼(filter:input filter:forward)。范例如下:
  iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
  MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
  QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。
  RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
  MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
  iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
  
  六、应用实例
  #!/bin/sh
  #
  # 石牌国小防火墙设定指令稿
  # 2002/8/27
  # 设定者:李忠宪(修改自 iptables tutorial 1.1.11 by Oskar Andreasson
  # 原文件是依 DMZ 需求设计,已根据校园 NAT 网络之需求修改,其余改动部份包括:
  # 新增通讯协议定义区块
  # 新增执行时,自动清除已设定之规则
  # 支援 FTP
  # 修改所有规则,改采 multiport 方式以简化规则
  # 原文件仅支持 IP 伪装(多对一对应),已扩充为支持一对一对应及多对多对应
  # 原文件仅支援 DNS WEB,新增 ftpmailwamPCAnywheressh......等多种服务器
  # 修改若干规则设定上的小错误
  #
  # Copyright (C) 2001 Oskar Andreasson <bluefluxATkoffeinDOTnet>;
  #
  # This program is free software; you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; version 2 of the License.
  #
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
  # along with this program or from the site that you downloaded it
  # from; if not, write to the Free Software Foundation, Inc., 59 Temple
  # Place, Suite 330, Boston, MA 02111-1307 USA
  #
  ###########################################################################
  #
  # 1. Configuration options.
  #
  # 1.0 Protocols Configuration.
  # 定义会用到的通讯协议
  HTTP="80"
  HTTPS="443"
  FTP="21"
  FTP_DATA="20"
  SMTP="25"
  POP3="110"
  IMAP="143"
  SSH="22"
  TELNET="23"
  PCAW_TCP="5631"
  PCAW_UDP="5632"
  WEBMIN="10000"
  WAM="12000"
  DNS="53"
  
  #
  # 1.1 Internet Configuration.
  #
  # 定义 NIC IP WAN 接口
  INET_IP="163.21.xxx.253"
  HTTP1_IP="163.21.xxx.2"
  HTTP2_IP="163.21.xxx.4"
  HTTP3_IP="163.21.xxx.9"
  HTTP4_IP="163.21.xxx.6"
  HTTP5_IP="163.21.xxx.7"
  HTTP6_IP="163.21.xxx.10"
  FTP1_IP="163.21.xxx.2"
  FTP2_IP="163.21.xxx.6"
  FTP3_IP="163.21.xxx.7"
  MAIL1_IP="163.21.xxx.6"
  MAIL2_IP="163.21.xxx.7"
  PCAW1_IP="163.21.xxx.2"
  PCAW2_IP="163.21.xxx.4"
  WAM1_IP="163.21.xxx.6"
  WAM2_IP="163.21.xxx.7"
  DNS_IP="163.21.xxx.2"
  IP_POOL="163.21.xxx.240-163.21.xxx.250"
  INET_IFACE="eth1"
  
  #
  # 1.2 Local Area Network configuration.
  #
  # 定义 NAT IP LAN 接口
  LAN_IP="192.168.1.253"
  LAN_HTTP1_IP="192.168.1.2"
  LAN_HTTP2_IP="192.168.1.4"
  LAN_HTTP3_IP="192.168.1.9"
  LAN_HTTP4_IP="192.168.1.6"
  LAN_HTTP5_IP="192.168.1.7"
  LAN_HTTP6_IP="192.168.1.53"
  LAN_FTP1_IP="192.168.1.2"
  LAN_FTP2_IP="192.168.1.6"
  LAN_FTP3_IP="192.168.1.7"
  LAN_MAIL1_IP="192.168.1.6"
  LAN_MAIL2_IP="192.168.1.7"
  LAN_PCAW1_IP="192.168.1.2"
  LAN_PCAW2_IP="192.168.1.4"
  LAN_WAM1_IP="192.168.1.6"
  LAN_WAM2_IP="192.168.1.7"
  LAN_DNS_IP="192.168.1.2"
  LAN_IP_RANGE="192.168.0.0/16"
  LAN_BROADCAST_ADDRESS="192.168.1.255"
  LAN_IFACE="eth0"
  
  #
  # 1.4 Localhost Configuration.
  #
  # 定义 Loopback IP 及接口
  LO_IFACE="lo"
  LO_IP="127.0.0.1"
  
  #
  # 1.5 IPTables Configuration.
  #
  # 设定 iptables 指令路径
  IPTABLES="/sbin/iptables"
  
  #
  # 1.6 Other Configuration.
  #
  ###########################################################################
  #
  # 2. Module loading.
  #
  #
  # Needed to initially load modules
  # 整理核心支持模块之清单
  /sbin/depmod -a
  
  #
  # 2.1 Required modules
  # 加载会用到的模块
  /sbin/modprobe ip_tables
  /sbin/modprobe ip_conntrack
  /sbin/modprobe iptable_filter
  /sbin/modprobe iptable_mangle
  /sbin/modprobe iptable_nat
  /sbin/modprobe ipt_LOG
  /sbin/modprobe ipt_limit
  /sbin/modprobe ipt_state
  /sbin/modprobe ip_conntrack_ftp
  /sbin/modprobe ip_nat_ftp
  
  #
  # 2.2 Non-Required modules
  # 其余未使用之模块
  #/sbin/modprobe ipt_owner
  #/sbin/modprobe ipt_REJECT
  #/sbin/modprobe ipt_MASQUERADE
  #/sbin/modprobe ip_conntrack_irc
  #/sbin/modprobe ip_nat_irc
  ###########################################################################
  #
  # 3. /proc set up.
  #
  #
  # 3.1 Required proc configuration
  # 启动 Forward 接口
  echo "1" >; /proc/sys/net/ipv4/ip_forward
  
  #
  # 3.2 Non-Required proc configuration
  # 其余未使用之接口
  #echo "1" >; /proc/sys/net/ipv4/conf/all/rp_filter
  #echo "1" >; /proc/sys/net/ipv4/conf/all/proxy_arp
  #echo "1" >; /proc/sys/net/ipv4/ip_dynaddr
  ###########################################################################
  #
  # 4. rules set up.
  #
  ######
  # 4.1 Filter table
  #
  # 4.1.0 eset the default policies in the nat table.
  # 清除所有已设定之规则,回复到不设防状态
  $IPTABLES -P INPUT ACCEPT
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P OUTPUT ACCEPT
  $IPTABLES -t nat -P PREROUTING ACCEPT
  $IPTABLES -t nat -P POSTROUTING ACCEPT
  $IPTABLES -t nat -P OUTPUT ACCEPT
  $IPTABLES -t mangle -P PREROUTING ACCEPT
  $IPTABLES -t mangle -P OUTPUT ACCEPT
  $IPTABLES -F
  $IPTABLES -t nat -F
  $IPTABLES -t mangle -F
  $IPTABLES -X
  $IPTABLES -t nat -X
  $IPTABLES -t mangle -X
  
  #
  # 4.1.1 Set policies
  # 定义安全政策为正面表列
  $IPTABLES -P INPUT DROP
  $IPTABLES -P OUTPUT DROP
  $IPTABLES -P FORWARD DROP
  
  #
  # 4.1.2 Create userspecified chains
  #
  #
  # 新增使用者自订规则炼 bad_tcp_packets allowed icmp_packets
  $IPTABLES -N bad_tcp_packets
  $IPTABLES -N allowed
  $IPTABLES -N icmp_packets
  
  #
  # 4.1.3 Create content in userspecified chains
  #
  #
  # bad_tcp_packets chain
  # bad_tcp_packets 规则炼的功能是:将要求重导向的联机记录起来,然后将封包丢弃(防止联机被绑架,但会档掉需要三方交谈的服务,例如:M$ Media Server
  $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-level INFO --log-prefix "New not syn:"
  $IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j DROP
  
  # allowed chain
  # allowed 规则炼的功能是:允许要求联机封包或响应封包进入,将其余封包丢弃
  $IPTABLES -A allowed -p TCP --syn -j ACCEPT
  $IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPTABLES -A allowed -p TCP -j DROP
  
  #
  # ICMP rules
  # icmp_packets 规则炼的功能是:允许 ping 封包进入,将其余封包丢弃
  $IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
  $IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
  
  #
  # 4.1.4 INPUT chain(过滤要到达防火墙的封包)
  #
  #
  # 进入防火墙主机的 TCP 封包必须先进行 bad_tcp_packets 过滤
  $IPTABLES -A INPUT -p tcp -j bad_tcp_packets
  
  # WAN 进入防火墙主机的 ICMP 封包必须先进行 icmp_packets 过滤,这是为了避免骇客传送不完整的 IP 封包,系统会响应 ICMP 封包通知对方,导致主机位置被侦测出来
  $IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
  
  # LAN 进入防火墙主机的全部 unicast broadcast 封包,通通放行;额外检查目的地 IP 可以将 multicast 封包滤除
  $IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_IP -j ACCEPT
  $IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BROADCAST_ADDRESS -j ACCEPT
  
  # Loopback 接口进入防火墙主机的所有封包,检查是否来自本机,若是则放行;此规则去检查来源 IP ,似乎有些画蛇添足,因为只有来自本机的封包才有机会进入 Loopback 接口
  $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
  $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
  $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
  
  # LAN 进入防火墙主机的 DHCP 封包,予以放行,只有当防火墙担任 DHCP 时才使用
  #$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT
  
  # WAN 进入防火墙主机的所有封包,检查是否为响应封包,若是则予以放行
  $IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
  
  # 限制过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来进行阻断式攻击 
  $IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level INFO --log-prefix "IPT INPUT packet died: "
  
  #
  # 4.1.5 FORWARD chain(过滤要通过防火墙的封包)
  #
  #
  # 通过防火墙的 TCP 封包必须先进行 bad_tcp_packets 过滤
  $IPTABLES -A FORWARD -p TCP -j bad_tcp_packets
  
  # LAN 要到 WAN 的封包通通放行
  $IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -j ACCEPT
  
  # WAN 要到 LAN 的封包仅放行回应封包
  $IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
  
  # 允许来自 WAN Ping 封包,递送到校内所有的服务器
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP1_IP -j icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP2_IP -j icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP3_IP -j icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP4_IP -j icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP5_IP -j icmp_packets
  $IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP6_IP -j icmp_packets
  
  # 允许来自 WAN HTTPHTTPS 封包,递送到校内所有的 WEB 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP1_IP -m multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP2_IP -m multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP3_IP -m multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP4_IP -m multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP5_IP -m multiport --dport $HTTP,$HTTPS -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP6_IP -m multiport --dport $HTTP,$HTTPS -j allowed
  
  # 允许来自 WAN FTP 封包,递送到校内所有的 FTP 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP1_IP -m multiport --dport $FTP,$FTP_DATA -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP2_IP -m multiport --dport $FTP,$FTP_DATA -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP3_IP -m multiport --dport $FTP,$FTP_DATA -j allowed
  
  # 允许来自 WAN SMTPPOP3IMAP 封包,递送到校内所有的 MAIL 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_MAIL1_IP -m multiport --dport $SMTP,$POP3,$IMAP -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_MAIL2_IP -m multiport --dport $SMTP,$POP3,$IMAP -j allowed
  
  # 允许来自 WAN SSHTELNETWEBMINWAM 封包,递送到校内所有的 LINUX 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_WAM1_IP -m multiport --dport $SSH,$TELNET,$WEBMIN,$WAM -j allowed
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_WAM2_IP -m multiport --dport $SSH,$TELNET,$WEBMIN,$WAM -j allowed
  
  # 允许来自 WAN PCanywhere 封包,递送到校内所有的 PCanywhere 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW1_IP --dport $PCAW_TCP -j allowed
  $IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW1_IP --dport $PCAW_UDP -j ACCEPT
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW2_IP --dport $PCAW_TCP -j allowed
  $IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW2_IP --dport $PCAW_UDP -j ACCEPT
  
  # 允许来自 WAN DNS 封包,递送到校内的 DNS 服务器
  $IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_DNS_IP --dport $DNS -j allowed
  $IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_DNS_IP --dport $DNS -j ACCEPT
  
  # 限制过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来进行阻断式攻击 
  $IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "
  
  #
  # 4.1.6 OUTPUT chain(过滤从防火墙送出的封包)
  #
  #
  # 从防火墙送出的 TCP 封包必须先进行 bad_tcp_packets 过滤
  $IPTABLES -A OUTPUT -p TCP -j bad_tcp_packets
  
  # 从防火墙网卡送出的所有封包,通通放行
  $IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
  $IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
  $IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
  
  # 限制过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来进行阻断式攻击 
  $IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
  
  ######
  # 4.2 nat table
  #
  #
  # 4.2.1 Set policies
  #
  #
  # 4.2.2 Create user specified chains
  #
  #
  # 4.2.3 Create content in user specified chains
  #
  #
  # 4.2.4 PREROUTING chain(定义目的地地址转译)
  #
  # WAN 要到校内服务器的封包,在封包过滤前先转译目的地 IP NAT IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP1_IP -j DNAT --to-destination $LAN_HTTP1_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP2_IP -j DNAT --to-destination $LAN_HTTP2_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP3_IP -j DNAT --to-destination $LAN_HTTP3_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP4_IP -j DNAT --to-destination $LAN_HTTP4_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP5_IP -j DNAT --to-destination $LAN_HTTP5_IP
  $IPTABLES -t nat -A PREROUTING -d $HTTP6_IP -j DNAT --to-destination $LAN_HTTP6_IP
  
  #
  # 4.2.5 POSTROUTING chain(定义来源地址转译)
  #
  # 从校内服务器要到 WAN 的封包,在送出之前先转译来源 IP NIC IP,配合上面区块的设定,就可以做到一对一对应
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP1_IP -j SNAT --to-source $HTTP1_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP2_IP -j SNAT --to-source $HTTP2_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP3_IP -j SNAT --to-source $HTTP3_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP4_IP -j SNAT --to-source $HTTP4_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP5_IP -j SNAT --to-source $HTTP5_IP
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP6_IP -j SNAT --to-source $HTTP6_IP
  # 从校内一般单机要到 WAN 的封包,在送出之前先转译来源 IP 为预设的 NIC IP,这就是多对一对应,若指定成 IP 范围,就变成多对多对应,例如本范例即是如此
  $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $IP_POOL
  
  #
  # 4.2.6 OUTPUT chain
  #
  ######
  # 4.3 mangle table
  #
  #
  # 4.3.1 Set policies
  #
  #
  # 4.3.2 Create user specified chains
  #
  #
  # 4.3.3 Create content in user specified chains
  #
  #
  # 4.3.4 PREROUTING chain
  #
  #
  # 4.3.5 INPUT chain
  #
  #
  # 4.3.6 FORWARD chain
  #
  #
  # 4.3.7 OUTPUT chain
  #
  #
  # 4.3.8 POSTROUTING chain
  #
  
  七、Log 分析
  分析 iptables 防火墙 Log 的免费软件相当多,底下仅介绍 iptables_logger_v0.3,这个软件提供一个 perl 程序,可以读取系统 LOG,并将数据写入 MySql 数据库,然后还提供 php 程序,可以从数据库读取数据,整理成网页提供浏览,因此要安装此分析软件,必须先安装 perlphpmysql apache,有关这些套件的安装在这里不再介绍,请自行参考相关文件,或参加 Linux 进阶班课程。你可以从这里取得 iptables_logger_v0.3 程序,其安装程序如下:
  安装数据表:
  这个套件解压缩后,可以看到有一个数据夹叫做 sql,数据夹内有一个 sql 的指令稿叫做 db.sql,这个指令稿是用来建立摆放联机纪录所需的数据表,请利用以下指令来安装,如果您还不熟悉 mysql 的指令,请自行阅读 man mysql 文件。
  root@firewall sql# mysql -u root -p(以 root 身分登入 MySql 主控台)
  mysql>; create database iptables;(建立一个数据库叫做 iptables,数据库也可以自行命名,但是要记得修改相关程序)
  mysql>; grant create,select,insert on iptables.* to iptables_admin@localhost identified by 'xx';(将 iptables 数据库新建、读取和写入权限授权给 iptables_admin 这个账号,并限制只能从本机联机,密码为 xx,请自行修改上述指令中之账号与密码)
  mysql>; grant create,select on iptables.* to iptables_user@localhost identified by 'xx';(将 iptables 数据库读取权限授权给 iptables_user 这个账号,并限制只能从本机联机,密码为 xx,请自行修改上述指令中之账号与密码)
  root@firewall sql# cat db.sql | mysql -u iptables_admin -p iptables(以 iptables_admin 身分来执行 db.sql,如果你改了数据库的名字,请记得修改 db.sql
  修改 iptables 指令稿:
  由于这支 Log 分析程序是以读取系统 LOG 加以分析后才汇入到数据库的方法,来处理联机纪录,并非使用 ULOG 直接由 iptables 将纪录写入 mysql 数据库,感觉上效能比较差,但在 ULOG 机制尚未被实体化之前,这也不失为一个好的解决方案。
  原则上只要在 iptables 指令稿中有产生 LOG 的动作,这些信息就会被分析汇入到数据表(由 feed_db.pl 负责这个工作),特别要注意的是 LOG 产生时会加入一个标头(prefix),程序是透过标头来分析这笔 LOG 的意义,请将 LOG 标头取名为 IPTABLES DROP IPTABLES ACCEPT,以方便事后的统计。范例如下:
  首先建立一个新的规则炼 LOG_DROP,这个规则炼用来将要丢弃的封包先 LOG 到系统日志文件,然后再丢弃。
  iptables -N LOG_DROP
  iptables -A LOG_DROP -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES DROP] : '
  iptables -A LOG_DROP -j DROP
  接着修改所有规则,只要是需进行 DROP 动作,都改为跳到 LOG_DROP 规则炼,例如:
  $IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j DROP
  改为
  $IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j LOG_DROP
  至于需要进行 ACCEPT 处理的规则也如法炮制,先建立 LOG_ACCEPT 规则炼:
  iptables -N LOG_ACCEPT
  iptables -A LOG_ACCEPT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES ACCEPT] : '
  iptables -A LOG_ACCEPT -j ACCEPT
  接着修改所有规则,例如:
  $IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
  改为
  $IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j LOG_ACCEPT
  安装显示分析结果的 PHP 程序:
  在解压缩的数据夹中,找到一个叫做 web 的子数据夹,里面就是要给人从网页浏览分析结果的 PHP 程序,如果你的 Apache 已经设定好支持 php php_mysql,那么只要将此数据夹复制到 Apache 的根文件目录就行了。方法如下:
  cp -R web /var/www/iptables
  拷贝完成后请修改 config.php ,目的是为了让 PHP 程序执行时,能以正确的账号密码连上 MySql ,以便从数据库读取数据,请找到底下三行:
  $db_host="localhost";(一般不需修改,除非数据库在另一台主机上)
  $db_user="iptables_user";(修改为仅具有读取权限的账号,如果之前安装数据库有自设帐号的话)
  $db_password="xxxx";(请将密码修改为自设的密码)
  安装 feed_db.pl
  前面已经介绍过这支程序的作用,请务必修改这支程序中有关数据库联机的 SQL 指令,将指令中的账号密码,改成你当初所设定的账号密码,建议最好不要用 root 身分联机,以免影响防火墙的安全性。这支程序是放在解压缩后数据夹内的 scripts 子数据夹,请修改下面这三行:
  my $dsn = 'DBI:mysql:iptables:localhost';(请将 iptables 改成你自订的数据库名称)
  my $db_user_name = 'iptables_admin';(请将 iptables_admin 改成你自订的管理账号)
  my $db_password = 'xxxx';(请将 xxxx 改成管理账号的密码)
  程序修改好后,请将它拷贝到 /usr/local/bin 数据夹,接着将程序执行起来,注意:这支程序会跑一个无穷尽循环,持续分析系统 LOG,因此必须在背景执行,同时只能有一支程序执行,以避免造成 IO 过大的负载,执行方式如下:
  tail --follow=name --retry /var/log/syslog | /usr/local/bin/feed_db.pl &
  如果这些动作都作了,但程序并未执行成功,有可能是因为 perl_DBI BD 套件没安装,请自行用 rpm 补装该套件。
  查看分析结果:
  完成以上所有安装步骤后,就可以坐下来享受一下成果,请打开浏览器输入底下网址
  http://192.xx.1.254/iptables
  安装 LOG 分析后的安全防范:
  防火墙上安装越多套件,系统安全性也就越低,改进的方法有两个:
  1. apache mysql 架设在内部网络的一台机器上,防火墙上仅安装 mysql client,这样可以避免 apache mysql 的漏洞被骇客利用
  2. 在防火墙上设定规则,仅允许来自内部的网络,进行 HTTP MySql 联机,这个方法比较简单,本文所介绍的 iptables 范例也是采用此法,缺点是无法在校外查看 LOG 分析结果 。。。