iptables防火墙的指令非常类似于ipchains,使用过ipchains的人应该很容易上手,但是iptables的机制与ipchains有很大的不同,使用ipchains的概念来设定规则,将会使防火墙无法正常运作。 壹、什么是防火墙 http 192.168.1.1打防火墙是一套能够在两个或两个以上的网络之间,明显区隔出实体线联机的软硬件设备组合。被区隔开来的网络,可以透过封包转送技术来相互通讯,透过防火墙的安全管理机制,可以决定哪些数据可以流通,哪些资料无法流通,藉此达到网络安全的目的。 防火墙产品可以概略归类为硬件式防火墙和软件式防火墙,但实际上无论是硬件式或软件式防火墙,它们都需要使用硬件来作为联机介接,也需要使用软件来设定安全政策,严格说两者间的差别并不太大。我们只能从使用的硬件与操作系统来加以区分,硬件式防火墙是使用专有的硬件,而软件式防火墙则使用一般的计算机硬件,硬件式防火墙使用专有的操作系统,而软件式防火墙则使用一般的操作系统。 防火墙依照其运作方式来分类,可以区分为封包过滤式防火墙(PacketFilter)、应用层网关式防火墙(Application-LevelGateway,也有人把它称为Proxy防火墙)、电层网关式防火墙(Circuit-LevelGateway)。其中被广为采用的是封包过滤式防火墙,本文要介绍的iptables防火墙就是属于这一种。 封包过滤是最早被实作出来的防火墙技术,它是在TCP/IP四层架构下的IP层中运作。封包过滤器的功能主要是检查通过的每一个IP数据封包,如果其标头中所含的数据内容符合过滤条件的设定就进行进一步的处理,主要的处理方式包含:放行(accept)、丢弃(drop)或(reject)。要进行封包过滤,防火墙必须要能分析通过封包的来源IP与目的地IP,还必须能检查封包类型、来源埠号与目的埠号、封包流向、封包进入防火墙的网卡接口、TCP的联机状态等数据。 防火墙由于种种理由价格一直居高不下,对于贫穷的中小学来讲要采购一台防火墙,简直是不可能的任务,而由于Linux的风行,使用Linux来充作软件式防火墙,似乎是不错的解决之道,本文拟介绍以Linux上最新最强大的iptables防火墙软件,建置出适合学校使用的过滤规则,让缺钱的学校能有一套好用的防火墙来校园网络的大门。 贰、Linux防火墙演变简史 Linux最早出现的防火墙软件称为ipfw,ipfw能透过IP封包标头的分析,分辨出封包的来源IP与目的地IP、封包类型、来源埠号与目的埠号、封包流向、封包进入防火墙的网卡界面......等,并藉此分析结果来比对规则进行封包过滤,同时也支持IP伪装的功能,利用这个功能可以解决IP不足的问题,可惜这支程序缺乏弹性设计,无法自行建立规则组合(ruleset)作更精简的设定,同时也缺乏网址转译功能,无法应付越来越复杂的网络,而逐渐被淘汰。 取而代之的ipchains,不但指令语法更容易理解,功能也较ipfw优越;ipchains允许自订规则组合(ruleset),称之为user-definechains,透过这种设计,我们可以将彼此相关的规则组合在一起,在需要的时候跳到该组规则进行过滤,有效将规则的数量大幅缩减,以往ipfw仅能进行循序过滤,导致规则又臭又长的毛病,就不药而愈了。除了这个明显的好处以外,ipchains并能结合本身的端口对应功能和redir程序的封包转送机制,模拟出网址转译的能力,而满足NAT的完整需求,堪称为一套成熟的防火墙作品。 防火墙软件的出现,确实曾经让骇客们晚上睡不着觉,因为防火墙的阻隔能够有效让内部网络不设防的单机不致于在外,也能有效降低服务器的能见度,减少被的机会,骇客过去所用的网络探测技术因此受到严格的挑战,越来越多的对象躲藏在防火墙后方,让骇客难以接近,因此必须针对新的情势,研究出新的探测技术,藉以规避防火墙的检查,达到发现目标并进而入侵的目的,新的技术非常多,本文并不拟进一步讨论,请自行参考CERT组织的技术文件,网址是www.cert.org,想看中文请连到www.cert.org.tw。 iptables作为ipchains的新一代继承人,当然也针对骇客不断推陈出新的探测技术拟出一些因应之道,那就是对封包的联机状态,作出更详细的分析,例如:是否为新联机或响应封包、是否为转向联机、联机是否失去响应,联机时间是否过长......等等,透过这样的分析能对一些可能被骇客利用的弱点加以阻隔(请详见后文的说明),另外也开发出真正的封包改写能力,不需要透过其它程序的协助来仿真网址转译,除此之外,iptables也获得系统核心的直接支持,不需要像ipchains那样需要自行重新编译核心。 iptables优越的性能使它取代了ipchains,成为网络防火墙的主流,而ipchains并未被淘汰,目前ipchains已经转型成单机防火墙,在安装新版Linux时,会自动被安装启用,以单机上未被使用的通讯端口。 iptables防火墙的指令非常类似于ipchains,使用过ipchains的人应该很容易上手,但是iptables的机制与ipchains有很大的不同,使用ipchains的概念来设定规则,将会使防火墙无法正常运作。ipchains跟iptables最大的不同在于对INPUT、FORWARD、OUTPUT三个网络函式的定义不同,这三个网络函式是TCP/IP驱动程序的一部分,结构如下图所示,是介于网卡驱动程序和应用程序的中间,Linux核心预设会启用INPUT、OUTPUT和LOOPBACK,而FORWARD函式则必须自行启用,可以使用下面指令,或直接修改/etc/sysconfig/network组态档: 从上图可以知道ipchains如何处理封包的流动,分述如下: ・IPINPUT:所有封包都由IPINPUT函式负责处理,所以设定过滤规则时,几乎都是设定在INPUT规则炼上。 ・IPFORWARD:目的IP非本机的IP,这些封包需要进一步作转送处理,此函式用来处理IP伪装和Port转送。 ・IPOUTPUT:所有流出的封包都由这个函式处理,通常不需设定任何规则。 iptables除了上述三支函式以外,还使用两个新的函式:Prerouting、Postrouting。现在来比较一下iptables的运作模式(loopback接口与上图相同,所以省略不画): 从上图可以知道iptables如何处理封包的流动,分述如下: ・IPINPUT:只有要到达本机的封包才会由INPUT函式处理,所以会让来自内部网络的封包无条件放行,来自外部网络的封包则过滤是否为响应封包,若是则放行。 ・PREROUTING:需要转送处理的封包由此函式负责处理,此函式用来做目的地IP的转译动作(DNAT)。 ・IPFORWARD:所有转送封包都在这里处理,这部分的过滤规则最复杂。 ・POSTROUTING:转送封包送出之前,先透过这个函式进行来源IP的转译动作(SNAT)。 ・IPOUTPUT:从本机送出去的封包由这个函式处理,通常会放行所有封包。 iptables和ipchains都可以自行定义规则群组(rule-set),规则群组被称为规则炼(chains),前面所描述的函式,也都有相对应的规则炼(INPUT、FORWARD、OUTPUT、Prerouting、Postrouting),为了有别于自行定义的规则炼,这些规则炼我们就称为内建规则炼,其运作流程仿真如下图: 从两张假想图,们不难了解ipchains为什么要叫做chains,因为它是将所有规则串接成一个序列逐一检查过滤,就像一条一样一个环接一个环,在过滤过程中只要符合其中一条规则就会立即进行处理,如果处理动作是跳到某个规则群组,则继续检查群组内之规则设定,但如果处理动作是ACCEPT、REJECT、DROP、REDIRECT或MASQUERADE,则会中断过滤程序,而不再继续检查后面的规则设定,在这样的结构之下,有时候规则顺序的对调会产生完全相反的结果,这一点在设定防火墙时不能不谨慎。 而iptables是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查Prerouting,然后检查目的IP判断是否需要转送出去,接着就会跳到INPUT或Forward进行过滤,如果封包需转送处理则检查Postrouting,如果是来自本机封包,则检查OUTPUT以及Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了ACCEPT、REJECT、DROP、REDIRECT和MASQUERADE以外,还多出LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则炼的过滤,并依照前述流程继续进行下一个规则炼的过滤(注意:这一点与ipchains不同),一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables可以进行纵横交错式的过滤(tables)而非炼状过滤(chains)。 虽然iptables为了扩充防火墙功能,而必须采用比较复杂的过滤流程,但在实际应用时,同一规则炼下的规则设定还是有先后顺序的关系,因此在设定规则时还是必须注意其中的逻辑。 肆、订定校园网络安全政策 在实际设定防火墙之前,我们必须根据校园网络的安全需求,先拟定一份安全政策,拟定安全政策前必须搜集以下资料: 1.找出需要过滤的服务器 2.条列出被的服务器将提供何种网络服务 3.一般工作站,需要何种等级的 4.了解网络架构与服务器摆放 根据这些数据,我们可以决定安全政策,以石牌国小为例: 1.校内使用NAT虚拟网络,IP数量需要两组C,所有IP均需作IP伪装 2.校园内安全需求不高,服务器与工作站摆在同一网段,不需采用DMZ设计 3.由于服务器功能经常扩充,所有服务器均采用一对一对应,不使用port转送功能 4.所有工作站均能使用网络资源,不只能看网页 6.为增进校园网络之安全性,采用正面表列方式进行封包过滤(定义想放行之封包,其余封包一律) 还有一些网络安全须注意的事项,则是每所学校都应防范的,没有等差之别,例如:联机被、阻断式、连接端口扫描......等。 语法: -t参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle和filter,当未指定规则表时,则一律视为是filter。各个规则表的功能如下: nat此规则表拥有Prerouting和postrouting两个规则炼,主要功能为进行一对一、一对多、多对多等网址转译工作(SNAT、DNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行来源网址转译,反之亦然,因此为了提升改写封包的效率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据,将会造成无法对同一封包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。 除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定MARK(将封包作记号,以便进行后续的过滤),这时就必须将这些工作定义在mangle规则表中,由于使用率不高,我们不打算在这里讨论mangle的用法。 filter这个规则表是预设规则表,拥有INPUT、FORWARD和OUTPUT三个规则炼,这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP、LOG、ACCEPT或REJECT),我们会将基本规则都建立在此规则表中。 常用命令列表: 说明新增规则到某个规则炼中,该规则将会成为规则炼中的最后一条规则。 说明从某个规则炼中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。 说明取代现行规则,规则被取代后并不会改变顺序。 说明插入一条规则,原本该上的规则将会往后移动一个顺位。 说明列出某规则炼中的所有规则。 说明删除某规则炼中的所有规则。 说明将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式不可或缺的工具。 说明定义新的规则炼。 说明删除某个规则炼。 说明定义过滤政策。也就是未符合过滤条件之封包,预设的处理方式。 说明修改某自订规则炼的名称。 常用封包比对参数: 说明比对通讯协议类型是否相符,可以使用!运算子进行反向比对,例如:-p!tcp,意思是指除tcp以外的其它类型,包含udp、icmp...等。如果要比对所有类型,则可以使用all关键词,例如:-pall。 说明用来比对封包的来源IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s192.168.0.0/24,比对IP时也可以使用!运算子进行反向比对,例如:-s!192.168.0.0/24。 说明用来比对封包的目的地IP,设定方式同上。 说明用来比对封包是从哪片网卡进入,可以使用通配字符+来做大范围比对,例如:-ieth+表示所有的ethernet网卡,也可以使用!运算子进行反向比对,例如:-i!eth0。 说明用来比对封包要从哪片网卡送出,设定方式同上。 说明用来比对封包的来源埠号,可以比对单一埠,或是一个范围,例如:--sport22:80,表示从22到80埠之间都算是符合条件,如果要比对不连续的多个埠,则必须使用--multiport参数,详见后文。比对埠号时,可以使用!运算子进行反向比对。 说明用来比对封包的目的地埠号,设定方式同上。 说明比对TCP封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设定,未被列举的旗号必须是空的。TCP状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(推送)等均可使用于参数中,除此之外还可以使用关键词ALL和NONE进行比对。比对旗号时,可以使用!运算子进行反向比对。 说明用来比对不连续的多个来源埠号,一次最多可以比对15个埠,可以使用!运算子进行反向比对。 说明用来比对不连续的多个目的地埠号,设定方式同上。 说明这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为80但目的地埠号为110,这种封包并不算符合条件。 说明用来比对ICMP的类型编号,可以使用代码或数字编号来进行比对。请打iptables-picmp--help来查看有哪些代码可以用。 说明用来比对某段时间内封包的平均流量,的例子是用来比对:每小时平均流量是否超过一次3个封包。除了每小时平均一次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后:/second、/minute、/day。除了进行封包数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水法,导致服务被阻断。 说明用来比对瞬间大量封包的数量,的例子是用来比对一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上。 说明用来比对封包来源网络接口的硬件地址,这个参数不能用在OUTPUT和Postrouting规则炼上,这是因为封包要送出到网卡后,才能由网卡驱动程序透过ARP通讯协议查出目的地的MAC地址,所以iptables在进行封包比对时,并不知道封包会送到哪个网络接口去。 说明用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过MARK处理动作,将该封包标示一个号码,号码最大不可以超过4294967296。 说明用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用root或其它身分将数据传送出去,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。 说明用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。 说明用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。 说明用来比对来自本机的封包,是否为某特定联机(SessionID)的响应封包,使用时机同上。 INVALID表示该封包的联机编号(SessionID)无法辨识或编号不正确。 ESTABLISHED表示该封包属于某个已经建立的联机。 NEW表示该封包想要起始一个联机(重设联机或将联机重导向)。 RELATED表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA联机必定是源自某个FTP联机。 常用的处理动作: ACCEPT将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(nat:postrouting)。 REJECT该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMPport-unreachable、ICMPecho-reply或是tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。范例如下: DROP丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 MASQUERADE改写封包来源IP为防火墙NICIP,可以指定port对应的范围,进行完此处理动作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与SNAT略有不同,当进行IP伪装时,不需指定要伪装成哪个IP,IP会从网卡直接读取,当使用拨接连线时,IP通常是由ISP公司的DHCP服务器的,这个时候MASQUERADE特别有用。范例如下: LOG将封包相关讯息纪录在/var/log中,详细请查阅/etc/syslog.conf组态档,进行完此处理动作后,将会继续比对其它规则。例如: SNAT改写封包来源IP为某特定IP或IP范围,可以指定port对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。范例如下: DNAT改写封包目的地IP为某特定IP或IP范围,可以指定port对应的范围,进行完此处理动作后,将会直接跳往下一个规则炼(filter:input或filter:forward)。范例如下: MIRROR镜射封包,也就是将来源IP与目的地IP对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。 QUEUE中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。 RETURN结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。 MARK将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下: 陆、应用实例 #石牌国小防火墙设定指令稿 #原文件是依DMZ需求设计,已根据校园NAT网络之需求修改,其余改动部份包括: #新增通讯协议定义区块 #新增执行时,自动清除已设定之规则 #修改所有规则,改采multiport方式以简化规则 #原文件仅支持IP伪装(多对一对应),已扩充为支持一对一对应及多对多对应 #修改若干规则设定上的小错误 #定义会用到的通讯协议 #整理核心支持模块之清单 #加载会用到的模块 #其余未使用之模块 #其余未使用之接口 #清除所有已设定之规则,回复到不设防状态 #定义安全政策为正面表列 #bad_tcp_packets规则炼的功能是:将要求重导向的联机记录起来,然后将封包丢弃(防止联机被,但会档掉需要三方交谈的服务,例如:M$MediaServer) #allowed规则炼的功能是:允许要求联机封包或响应封包进入,将其余封包丢弃 #icmp_packets规则炼的功能是:允许ping封包进入,将其余封包丢弃 #从WAN进入防火墙主机的ICMP封包必须先进行icmp_packets过滤,这是为了避免骇客传送不完整的IP封包,系统会响应ICMP封包通知对方,导致主机被侦测出来 #从Loopback接口进入防火墙主机的所有封包,检查是否来自本机,若是则放行;此规则去检查来源IP,似乎有些画蛇添足,因为只有来自本机的封包才有机会进入Loopback接口 #从LAN进入防火墙主机的DHCP封包,予以放行,只有当防火墙担任DHCP时才使用 #从WAN进入防火墙主机的所有封包,检查是否为响应封包,若是则予以放行 #过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来进行阻断式 #从WAN要到LAN的封包仅放行回应封包 #允许来自WAN的Ping封包,递送到校内所有的服务器 #允许来自WAN的FTP封包,递送到校内所有的FTP服务器 #过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来进行阻断式 #从防火墙网卡送出的所有封包,通通放行 #过滤规则的比对频率为每分钟平均流量三个封包(超过上限的封包将暂停比对),并将瞬间流量设定为一次最多处理三个封包(超过上限的封包将丢弃不予处理),这类封包通常是骇客用来进行阻断式 #从WAN要到校内服务器的封包,在封包过滤前先转译目的地IP为NATIP #从校内服务器要到WAN的封包,在送出之前先转译来源IP为NICIP,配合区块的设定,就可以做到一对一对应 |
不良信息举报Q:2000617|Archiver|ROS软路由论坛 ROSABC.com 网络方案网络工程交流
GMT+8, 2025-11-12 20:32 , Processed in 0.031563 second(s), 15 queries .
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.