Linux个人防火墙的设计与实现文档格式.doc
《Linux个人防火墙的设计与实现文档格式.doc》由会员分享,可在线阅读,更多相关《Linux个人防火墙的设计与实现文档格式.doc(21页珍藏版)》请在冰点文库上搜索。
Firewall
1引言
1.1课程设计的意义
对于因特网上的系统,不管是什么情况,首先我们要明确一点:
网络是不安全的。
虽然创建一个防火墙并不能保证系统100%安全[7],但却是绝对有必要的。
防火墙的目的就是将破坏网络安全的人挡在你的网络之外,使你可以顺利完成自己的工作。
LINUX是近几年突出的一种操作系统,以其公开的源代码、强大稳定的网络功能和大量的免费资源受到业界的普遍赞扬。
LINUX防火墙其实是操作系统本身所自带的一个功能模块。
通过安装特定的防火墙内核,LINUX操作系统会对接收到的数据包按一定的策略进行处理。
随着Linux系统被越来越多地使用,安全问题成了关键。
Linux防火墙技术也在不断的发展,经历了Ipfw、Ipchains等过程。
Iptables作为Linux防火墙的新一代继承人,当然也针对骇客不断推陈出新的探测技术拟出一些因应之道,那就是对封包的联机状态,作出更详细的分析,透过这样的分析能对一些可能被骇客利用的弱点加以阻隔,另外也开发出真正的封包改写能力,不需要透过其它程序的协助来仿真网址转译,除此之外,Iptables也获得系统核心的直接支持,不需要像Ipchains那样需要自行重新编译核心。
Iptables优越的性能使它取代了Ipchains,成为网络防火墙的主流,而Ipchains并未被淘汰,目前Ipchains已经转型成单机防火墙,在安装新版Linux时,会自动被安装启用,以保护单机上未被使用的通讯端口[1]。
总之,目前大部分国内金融、商业等企业都采用Linux系统,因此在Linux上配置防火墙有极其重要的意义,同时可以学习这一先进的技术与熟悉一个优秀的操作平台。
1.2课程设计的目的
本课程设计设主要目的是在Linux操作系统下完成基于Netfilter/Iptables的包过滤防火墙的设计与实现。
Internet等网络服务给人们的生活带来极大便利的同时也存在很多隐患,学会基于Netfilter/Iptables的包过滤防火墙的配置就能在一定程度上有效地抵御来自网络上的攻击。
通过完成课程设计的过程,学习包过滤防火墙的相关知识,同时也深化对这学期Linux课程的学习。
1.3Linux防火墙的背景知识
Linux是一个类UNIX的操作系统[5],它是由芬兰赫尔辛基大学的学生LinusTorvalds于1991年创建并在因特网上发布,任何人只要遵守GPL版权,都可以免费使用和修改Linux。
实际上,GPL要求的是完全的软件共享,你可从中获利,但你不能占为己有。
经过因特网上的千千万万的志愿者对其的不断修改,八年后的今天,Linux已经变得强大无比!
特别是去年下半年以来,IBM、Intel、Oracle、Sysbase、Borland,HP,SUN,Corel等商业软件[6]厂商纷纷表示对Linux进行商业开发和技术支持,更使得Linux的商业价值越来越高。
同时Linux将在两个方向发展,即微型设备的嵌入式操作系统和桌面操作系统。
IDC预测Linux将成为WindowsNT后的第二大操作系统[3]。
Linux以它的高效性和灵活性著称。
它能够在个人计算机上实现全部的UNIX特性,具有多任务、多用户的功能。
Linux可在GNU(“不是UNIX”工程的缩写)公共许可权限下免费获得,是一个符合POSIX标准的操作系统。
Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。
它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows一样,允许我们使用窗口、图标和菜单对系统进行操作。
包过滤防火墙用软件查看所流经的数据包的包头(header),由此决定整个包的命运。
它可能丢弃(DROP)这个包,可能接受(ACCEPT)这个包,也可能执行其它更复杂的动作。
Linux因其健壮性、可靠性、灵活性以及好象无限范围的可定制性而在IT界倍受欢迎。
Linux具有许多内置的功能,使开发人员可以根据自己的需要定制其工具、行为和外观而无需昂贵的第三方工具。
Netfilter/IptablesIP信息包过滤系统是最新的解决方案,而且也是第一个集成到Linux内核的解决方案。
对于Linux系统管理员、网络管理员以及家庭用户(他们想要根据自己特定的需求来配置防火墙,在防火墙解决方案上节省费用和对IP信息包过滤具有完全控制权)来说,Netfilter/Iptables系统十分理想。
Iptables是与最新的2.4.x版本Linux内核集成的IP信息包过滤系统。
如果Linux系统连接到因特网或LAN、服务器或连接LAN和因特网的代理服务器,则该系统有利于在Linux系统上更好地控制IP信息包过滤和防火墙配置。
Iptables组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易[2]。
Iptables是复杂的,它集成到Linux内核中。
用户通过Iptables可以对进出你的计算机的数据包进行过滤。
通过Iptables命令设置来把守你的计算机网络--哪些数据允许通过,哪些不能通过,哪些通过的数据进行记录。
2Netfilter/Iptables介绍
2.1配置防火墙的filter表
(1)查看本机关于IPTABLES的设置情况
[root@localhostroot]#iptables-L–n
(2)清除原有规则
不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter[8]的所有规则。
[root@localhostroot]#iptables-F
清除预设表filter中的所有规则链的规则。
[root@localhostroot]#iptables-X
清除预设表filter中使用者自定链中的规则。
(3)设定预设规则
[root@localhostroot]#iptables-pINPUTDROP
[root@localhostroot]#iptables-pOUTPUTACCEPT
[root@localhostroot]#iptables-pFORWARDDROP
(4)添加规则
首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链。
为了能采用远程SSH登陆,我们要开启22端口
[root@localhostroot]#iptables-AINPUT-ptcp--dport22-jACCEPT
[root@localhostroot]#iptables-AOUTPUT-ptcp--sport22-jACCEPT
如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:
[root@localhostroot]#iptables-AOUTPUT-ptcp--sport80-jACCEPT
如果做了WEB服务器,开启80端口
[root@localhostroot]#iptables-AINPUT-ptcp--dport80-jACCEPT
如果做了邮件服务器,开启25110端口
[root@localhostroot]#iptables-AINPUT-ptcp--dport110-jACCEPT
[root@localhostroot]#iptables-AINPUT-ptcp--dport25-jACCEPT
如果做了FTP服务器,开启21端口
[root@localhostroot]#iptables-AINPUT-ptcp--dport21-jACCEPT
[root@localhostroot]#iptables-AINPUT-ptcp--dport20-jACCEPT
如果做了DNS服务器,开启53端口
[root@localhostroot]#iptables-AINPUT-ptcp--dport53-jACCEPT
2.2配置防火墙的NAT表
(1)查看本机关于NAT的设置情况
[root@localhostroot]#iptables-tnat–L
(2)添加规则
添加基本的NAT[8]地址转换,我们只添加DROP链.因为默认链全是ACCEPT。
防止外网用内网IP欺骗
[root@tpsysconfig]#iptables-tnat-APREROUTING-ieth0-s10.0.0.0/8-jDROP
[root@tpsysconfig]#iptables-tnat-APREROUTING-ieth0-s172.16.0.0/12-jDROP
[root@tpsysconfig]#iptables-tnat-APREROUTING-ieth0-s192.168.0.0/16-jDROP
DROP非法连接
[root@localhostroot]#iptables-AINPUT
-mstate--stateINVALID-jDROP
[root@localhostroot]#iptables-AOUTPUT
[root@localhostroot]#iptables-AFORWARD-mstate--stateINVALID-jDROP
允许所有已经建立的和相关的连接
[root@localhostroot]#iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
[root@localhostroot]#iptables-AOUTPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
[root@localhostroot]#/etc/rc.d/init.d/iptablessave
这样就可以写到/etc/sysconfig/iptables文件里,写入后把防火墙重起一下,才能起作用。
[root@localhostroot]#serviceiptablesrestart
2.3Iptables的结构
Iptables一般由指定表(table)、指定链(chains)、指定操作命令(command)、指定规则匹配器(matcher)、指定目标动作(target)等构成,如图2.1所示。
图2.1Iptables结构图
Iptables的指令结构如图2.2所示。
图2.2Iptables的指令结构图
2.4Iptables的规则要素
一条Iptables规则基本上应该包含5个要素:
1、指定表(table)
2、指定操作命令(command)
3、指定链(chains)
4、指定规则匹配器(matcher)
5、指定目标动作(target)
2.5Iptables工具的调用语法
Iptables的语法通常可以简化为下面的形式:
Iptables[-ttable]CMD[chain][rule-matcher][-jtarget]
其中:
tables为表名,CMD为操作命令,chain为链名,rule-matcher为规则匹配器,target为目标动作。
Iptables软件包提供了两个命令分别用于保存和恢复规则集。
可以使用下在的命令转储在内存中的内核规则集。
其中/etc/sysconfig/Iptables是Iptables守护进程调用的默认规则集文件:
#/sbin/Iptables-save>
;
/etc/sysconfig/Iptables
要恢复原来的规则库,需使用命令:
#/sbin/Iptables-restore<
为了使得用Iptables命令配置的规则在下次启动机器时还能被使用,有两种方法:
1、使用Iptables的启动脚本实现。
Iptables的启动脚/etc/rc.d/init.d/Iptables每次启动时都使用/etc/sysconfig/Iptables所提供的规则进行规则恢复,并可以使用如下的命令保存规则:
#serviceIptablessave
2、在自定义脚本中用Iptables命令直接创建规则集。
可以直接用Iptables命令编写一个规则脚本,并在启动时执行这个脚本。
例如:
若规则脚本的文件名为/etc/fw/rules,则可以在启动脚本/etc/rd.d/init.d/rc.local中加入下面的代码:
if[-x/etc/fw/rules];
then/etc/fw/rules;
fi;
这样,机器每次启动时即可执行该规则脚本。
如果使用此种方式,建议使用ntsysv命令关闭系统的Iptables守护进程。
2.6Iptables的优点
1、Iptables允许建立状态(stateful)防火墙,就是在内存中保存穿过防火墙的每条连接。
这种模式对于有效地配置FTP和DNS以及其它网络服务是必要的。
2、Iptables能够过滤TCP标志任意组合报文,还能够过滤MAC地址。
3、系统日志比ipchains更容易配置,扩展性也更好。
4、对于网络地址转换(NetworkAddressTranslation)和透明代理的支持,Netfilter更为强大和易于使用。
5、Iptables能够阻止某些DOS攻击,例如SYS洪泛攻击。
3防火墙的配置及操作命令
3.1链的基本操作
1、清除所有的规则。
通常在开始配置包过滤防火墙之初清除所有的规则,重新开配置,以免原有的规则影响新的设定。
使用如下命令[9]进行:
清除预设表filter中所有规则链中的规则:
#Iptables–F
清除预设表filter中使用者自定义链中的规则:
#Iptables–X
将指定链所有规则的包字节记数器清零:
#Iptables–Z
2、设置链的默认策略。
一般地,配置链的默认策略有两种方法。
(1)允许所有的包,然后再禁止有危险的包通过防火墙。
即“没有被拒绝的都允许”。
这种方法对于用户而言比较灵活方便,但对系统而言,容易引起严重的安全问题。
为此,应该使用如下的初始化命令:
#Iptables-PINPUTACCEPT
#Iptables-POUTPUTACCEPT
#Iptables-PFORWARDACCEPT
(2)禁止所有的包,然后再根据需要的服务允许特定的包通过防火墙。
即“没有明确允许的都被拒绝”。
这种方法最安全,但不太方便。
为了使得系统有足够的安全性,一般采用此种策略进行Iptables防火墙[10]的配置。
#Iptables-PINPUTDROP
#Iptables-POUTPUTDROP
#Iptables-PFORWAEDDROP
列出表/链中的所有规则。
包过滤防火墙只使用filter表,此表为默认的表,因此可以使用下面的命令列出filter表中所有规则:
#Iptables–L
使用上面的命令时,Iptables将逆向解析IP地址,这将发费很多时间,从而造成信息出来的非常慢。
为了解决这个问题,可以使用下面的带有-n参数的命令(-n参数用于显示数字化的地址和端口):
#Iptables-L–n
向链中添加规则。
下面的语句用于开放网络接口:
#Iptables-AINPUT-ilo-jACCEPT
#Iptables-AOUTPUT-olo-jACCEPT
#Iptables-A
INPUT-i
eth0-jACCEPT
#Iptables-AOUTPUT-oeth0-jACCEPT
#Iptables-AFORWARD-ieth0-jACCEPT
#Iptables-AFPRWAED-oeth0-jACCEPT
使用用户自定义链。
下面是一个用户自定义链的创建、修改和调用的简单命令序列:
#Iptables-Ncustom
#Iptables-Acustom-s0/0-d0/0-picmp-jDROP
#Iptables-AINPUT-s0/0-d0/0-jcustom
首先使用带-N参数的Iptables命令新建了一个名为custom的用户定义链。
然后使用带-A参数的命令添加了一条用户自定义的堵截规则,该规则丢弃全部的ICMP包。
最后向默认的INPUT链加入一条规则,使所有的包都由custom自定义链处理。
结果全部的ICMP包都将被丢弃。
3.2设置基本的规则匹配
下面举例说明Iptables的基本规则匹配(忽略目标动作):
指定协议匹配
#Iptables-AINPUT-ptcp
匹配指定协议之外的所有协议
#Iptables-AINPUT-p!
tcp
指定地址匹配
指定匹配的主机
#Iptables-AINPUT-s192.168.136.3
指定匹配的网络
#Iptables-AINPUT-s192.168.136.0/24
匹配指定主机之外的地址。
#Iptables-AFORWARD-s!
192.168.136.1
匹配指定网络之外的网络
192.168.136.0/24
指定网络接口匹配。
指定单一的网络接口匹配。
#Iptables-AINPUT-ieth0
#Iptables-AFORWARD-oeth0
指定同类型的网络接口匹配
#Iptables-AFORWARD-oppp+
指定端口匹配
指定单一的端口匹配。
#Iptables-AINPUT-ptcp-sportwww
#Iptables-AINPUT-ptcp-sport80
#Iptables-AINPUT-ptcp-sport53
#Iptables-AINPUT-pudp-dport53
匹配指定端口之外的端口。
#Iptables-AINPUT-ptcp-dport!
22
匹配指定端口的范围。
#Iptables-AINPUT-ptcp-soprt22:
80
匹配ICMP端口和ICMP类型。
#Iptables-AINPUT-picmp--icmp-type8
指定ip碎片
在TCP/IP通信过程中,每一个网络接口都有一个最大的传输单元(MTU),这个参数定义了可以通过的数据包的最大尺寸。
如果一个数据包大于这个参数值时,系统会将其划分成更小的数个数据包(称之为ip碎片)来传输,而接收方则对这些ip碎片[9]再进行重组以还原整个包。
但是在进行包过滤的时候,ip碎片会导致这样一个问题:
当系统将大数据包划分成ip碎片传送时,第一个碎片含有完整的包头信息(IP+TCP、UDP和ICMP),但是后续的碎片只有包头的部分信息(如源地址、目的地址)。
因此,检查后面的ip碎片的头部(就像有TCP、UDP和ICMP一样)是不可能的。
假如有这样一条规则:
#Iptables-AFORWARD-ptcp-s192.168.1.0/24-d192.168.2.100--dport80-jACCEPT
并且这时的FORWARD的策略(policy)为DROP时,系统只会让第一个ip碎片通过,而丢掉其余的ip碎片,因为第一个碎片含有完整的包头[11]信息,可以满足该规则的条件,而余下的碎片因为包头信息不完整而无法满足规则定义的条件,因而无法通过。
可以通过-fragment/-f选项来指定第二个及其以后的ip碎片,以上面的例子为例,我们可以再加上这样一条规则来解决这个问题:
#Iptables-AFORWARD-f-s192.168.1.0/24-d192.168.2.100-jACCEPT
但是需要注意的是,现在已经有许多进行ip碎片攻击的实例(例如向Win98NT4SP5,6Win2K发送大量的ip碎片进行DOS攻击),因此允许ip碎片通过是有安全隐患的,对于这一点可以采用Iptables的匹配扩展来进行限制。
3.3设置扩展的规则匹配
要获得匹配的简要说明,可以使用如下的命令:
#Iptables-mname_of_match–help
下面举例说明Iptables的扩