linux环境下的防火墙设计和配置.docx
《linux环境下的防火墙设计和配置.docx》由会员分享,可在线阅读,更多相关《linux环境下的防火墙设计和配置.docx(31页珍藏版)》请在冰点文库上搜索。
linux环境下的防火墙设计和配置
Linux环境下的netfilter/iptables防火墙设计和配置
(防火墙课程设计-linux篇)
1问题和解答引言
1)问:
采用iptables如何限定QQ。
答:
QQ的source-port为4000,destination-port为8000只需要在FORWARD里加入一条规则就可以:
iptables-AFORWARD-ieth0-pudp--dport8000-jDROP
2)问:
我不想开放我的端口,但我要在我的电脑上启用http服务,并对外服务。
答:
想开放除了80以外的端口你可以这样iptables-PINPUT–jDROP,用-P(大写字母)来拦截全部的通信,然后再来允许哪些端口可以被使用,结果可以这样写:
iptables–AINPUT–ptcp–dport80–jACCEPT
3)问:
由于我采用了linux的iptables作为外网络之间的隔离墙,想在网的计算机系统上架设ftp服务可以供外部访问,我该怎么做?
答:
要用到iptables的一个强大的功能为端口映射了。
举例如下:
iptables-tnat-APREROUTING-ptcp-mtcp--dport25-jDNAT--to-destination
192.168.0.6:
25
iptables-tnat-APOSTROUTING-s192.168.0.0/24-d192.168.0.6-ptcp-mtcp--dport25
-jSNAT--to-source192.168.0.1
4)问:
如何屏蔽对部ping,其中eth0为与外部网络相连接。
答:
简单的iptables-AINPUT-picmp--icmp-typeecho-request-ieth0-jDROP
5)问:
设有一台计算机作为linux防火墙,有两块网卡,eth0与校园网相连接,ip为222.18.134.129;eth1与部网络相连接,ip为192.168.0.1。
现在需要把发往地址222.18.134.129的80端口的ip包转发到网ip地址192.168.0.2的80端口,如何设置?
答:
iptables-tnat-APREROUTING-d222.18.134.129-ptcp-mtcp--dport80
-jDNAT--to-destination192.168.0.2:
80
iptables-tnat-APOSTROUTING-s192.168.0.0/24-d192.168.0.2-ptcp
-mtcp--dport80-jSNAT--to-source192.168.0.1
是否忘了打开FORWARD链的相关端口。
6)如何在Linux路由器下采用iptables防火墙构建DMZ(解答规则的实现中存在不完整的地方,请指出)?
答:
要构建一个带DMZ的防火墙,首先要对从连接外部网络的网卡(eth0)上流入的数据进行判断,这是在INPUT链上完成。
如果数据的目标地址属于DMZ网段,就要将数据转发到连接DMZ网络的网卡(eth1)上;如果是部网络的地址,就要将数据转发到连接部网络的网卡(eth2)上,如图1所示。
各个网络之间的访问关系如下描述(6条访问控制策略):
(1)网可以访问外网
网的用户显然需要自由地访问外网。
在这一策略中,防火墙需要进行源地址转换。
(2)网可以访问DMZ
此策略是为了方便网用户使用和管理DMZ中的服务器。
(3)外网不能访问网
很显然,网中存放的是公司部数据,这些数据不允许外网的用户进行访问。
(4)外网可以访问DMZ
DMZ中的服务器本身就是要给外界提供服务的,所以外网必须可以访问DMZ。
同时,外网访问DMZ需要由防火墙完成对外地址到服务器实际地址的转换。
(5)DMZ不能访问网
很明显,如果违背此策略,则当入侵者攻陷DMZ时,就可以进一步进攻到网的重要数据。
(6)DMZ不能访问外网
此条策略也有例外,比如DMZ中放置服务器时,就需要访问外网,否则将不能正常工作。
ØDMZ实现:
根据以上访问控制策略可以设定Linux防火墙的过滤规则。
用户在实际应用时可根据具体的情况进行设置,设定虚拟环境的网络拓扑如图1。
如图1所示,作为防火墙的Linux服务器使用三块网卡:
网卡eth0与外部网络连接(或者通过路由器连接),网卡eth1与DMZ区的Hub或交换机相连接,网卡eth2与网Hub或交换机相连接。
对于防火墙,原则之一就是默认禁止所有数据通信,然后再打开必要的通信。
所以在防火墙脚本的最初,需要清空系统原有的规则,然后将INPUT、OUTPUT、FORWARD的默认规则设置为丢弃所有数据包,对应的防火墙脚本片段如下:
#清空系统原有的所有规则
/sbin/iptables-F
/sbin/iptables-X
/sbin/iptables-tnat-F
/sbin/iptables-tnat-X
#默认丢弃所有数据包
/sbin/iptables-PINPUTDROP
/sbin/iptables-POUTPUTDROP
/sbin/iptables-PFORWARDDROP
Ø完成6种策略的实现:
(1)网可以访问外网,对应的防火墙脚本片段如下:
……
/sbin/iptables-tnat-APOSTROUTING-s[网地址]-d[外网地址]-oeth0-jSNAT--to[NAT的真实IP]
当数据从连接外网的eth0流出时,要将来自网的数据包的源地址改成Internet上的真实IP,这样才能和外网的主机进行通信。
“[NAT的真实IP]”表示分配给NAT用户的真实IP,有几个就写几个,以空格分开,但至少要写一个。
(2)网可以访问DMZ,对应的防火墙脚本片段如下:
/sbin/iptables-AFORWARD-s[网地址]-d[DMZ地址]-ieth2-jACCEPT
以上命令允许所有来自网、目的地为DMZ的数据包通过。
(3)外网不能访问网,对应的防火墙脚本片段如下:
/sbin/iptables-tnat-APREROUTING-s[外网地址]-d[网地址]-ieth0-jDROP
以上命令将来自外网、去往网的数据包全部丢弃。
(4)外网可以访问DMZ
为了保护DMZ中的服务器,外网对DMZ的访问也要加以限制。
通常的思路是,只允许外网访问DMZ中服务器所提供的特定服务,比如HTTP。
对应的防火墙脚本片段如下:
/sbin/iptables-tnat-APREROUTING-ptcp--dport80-d[分配给HTTP服务器的Internet上的真实IP]-s[外网地址]-ieth0-jDNAT--to[HTTP服务器的实际IP]
……
/sbin/iptables-AFORWARD-ptcp-s[外网地址]-d[HTTP服务器的实际IP]-ieth0--dport80-jACCEPT
/sbin/iptables-AFORWARD-ptcp-d[外网地址]-s[HTTP服务器的实际IP]-ieth1--sport80!
--syn-jACCEPT
/sbin/iptables-tnat-APREROUTING-s[外网地址]-d[DMZ地址]-ieth0-jDROP
该防火墙脚本片段将开放HTTP服务,使得只有访问DMZ中HTTP服务的数据包才能通过防火墙。
(5)DMZ不能访问网,对应的防火墙脚本片段如下:
/sbin/iptables-AFORWARD-s[DMZ地址]-d[网地址]-ieth1-jDROP
以上命令将丢弃所有从DMZ到网的数据包。
(是否有问题,不完整的解答,可以采用状态检测吗)
(6)DMZ不能访问外网,对应的防火墙脚本片段如下:
/sbin/iptables-tnat-APOSTROUTING-ptcp--dport25-d[外网地址]-s[服务器的IP]-oeth0-jSNAT--to[分配给SMTP服务器的Internet上的真实IP]
/sbin/iptables-AFORWARD-ptcp-s[服务器的IP]-d[外网地址]-ieth1--dport25-jACCEPT
/sbin/iptables-AFORWARD-ptcp-d[服务器的IP]-s[外网地址]-ieth0--sport25!
--syn-jACCEPT
以上命令先允许DMZ中服务器连接外网的SMTP服务端口(25),然后禁止其它从DMZ发往外网的数据包。
2准备
netfilter/iptablesIP信息包过滤系统是一种功能强大的工具,可用于添加、编辑和删除规则,这些规则存储在专用的信息包过滤表中,而这些表集成在Linux核中,又对他们进行处理。
netfilter组件也称为核空间(kernelspace),是核的一部分,由一些信息包过滤表组成,这些表包含核用来控制信息包过滤处理的规则集。
iptables组件是一种工具,也称为用户空间(userspace),它使插入、修改和删除信息包过滤表中的规则变得容易。
如果在你的linux系统没有安装这两组件,需要从.netfilter.org(或filer.org/iptables)下载最新工具并安装使用它,还需要从.kernel.org下载最新的核版本(注意软件包签名认证)。
通过使用iptables用户空间,可以构建自己的定制规则,这些规则存储在核空间的信息包过滤表中。
Iptables工具的操作介绍根据后面部分和按照课程设计要求完成。
(1)安装netfilter/iptables系统
因为netfilter/iptables的netfilter组件是与核2.4及以上集成在一起的,通常只需要下载并安装iptables用户空间工具。
下面是安装netfilter/iptables系统的需求:
●硬件:
要使用netfilter/iptables,需要有一个运行LinuxOS并连接到因特网、LAN或WAN的系统。
●软件:
带有核2.4或更高版本的任何版本的LinuxOS。
可以从.kernel.org下载最新版本的核。
还需要从.netfilter.org下载iptables这个用户空间工具,因为这个工具不是核的一部分。
(2)安装前的准备
在开始安装iptables用户空间工具之前,需要对系统做某些修改。
首先,需要使用makeconfig命令来配置核的选项。
在配置期间,必须通过将CONFIG_NETFILTER和CONFIG_IP_NF_IPTABLES选项设置为Y来打开它们,因为这是使netfilter/iptables工作所必需的。
下面是可能要打开的其它选项:
●CONFIG_PACKET:
如果要使应用程序和程序直接使用某些网络设备,那么这个选项是有用的。
●CONFIG_IP_NF_MATCH_STATE:
如果要配置有状态的防火墙,那么这个选项非常重要而且很有用。
这类防火墙会记得先前关于信息包过滤所做的决定,并根据它们做出新的决定。
●CONFIG_IP_NF_FILTER:
这个选项提供一个基本的信息包过滤框架。
如果打开这个选项,则会将一个基本过滤表(带有置的INPUT、FORWARD和OUTPUT链)添加到核空间。
●CONFIG_IP_NF_TARGET_REJECT:
这个选项允许指定:
应该发送ICMP错误消息来响应已被DROP丢弃的入站信息包,而不是简单地杀死它们。
(3)安装用户空间工具
在下载iptables用户空间工具的源代码(它类似于iptables-1.2.6a.tar.bz2)之后,可以开始安装。
您需要以root身份登录来执行安装。
清单1给出了一个示例,它指出了安装该工具所需的命令,其必要的次序及其说明。
清单1用户空间工具安装的示例
首先,解压工具包到一个指定的目录,命令操作如下:
#bzip2-diptables-1.3.5.tar.bz2
#tar-xvfiptables-1.3.5.tar
现在进入解压后的目录iptables-1.3.5中,在该目录中,有一个INSTALL文件包含了许多关于编译核安装信息,操作如下:
#cdiptables-1.3.5
现在开始编译用户空间工具,命令操作如下:
#makeKERNEL_DIR=/usr/src/linux-2.4.20
注:
KERNEL_DIR=/usr/src/linux-2.4.20指定为核目录路径,有的核目录名不同。
最后,安装源代码,命令操作如下:
#makeinstallKERNEL_DIR=/usr/src/linux-2.4.20
以上,仅仅是一个简单的说明,详细的可以看看文件或查阅有关,站点可以如下:
.netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO.html
.netfilter.
.kernel.org
等等。
3部分操作选项和参数介绍
iptables是用来设置、维护和检查Linux核的IP包过滤规则的。
可以定义不同的表,每个表都包含几个部的链,也能包含用户定义的链(user-define-chains)。
每个链都是一个规则列表,对对应的包进行匹配:
每条规则指定应当如何处理与之相匹配的包。
这被称作“target”(目标),也可以跳向同一个表的用户定义的链。
当前文档说明应用于IPv4的网络中。
防火墙的规则指定所检查包的特征和目标。
如果包不匹配,将送往该链中下一条规则检查;如果匹配,那么下一条规则由目标值确定。
该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT[通过],DROP[丢弃],QUEUE[排队]或者RETURN[返回]。
ACCEPT表示让这个包通过;DROP表示将这个包丢弃;QUEUE表示把这个包传递到用户空间;RETURN表示停止这条链的匹配,到前一个链的规则重新开始。
如果到达了一个建的链(的末端),或者遇到建链的规则是RETURN,包的最后处理将由链准则指定的目标决定。
语法:
通用格式:
iptables[-ttable]command[match][-jtarget/jump]
具体格式:
iptables[-ttable]-[AD]chainrule-specification[options]
iptables[-ttable]–Ichain[rulenum]rule-specification[options]
iptables[-ttable]-Rchainrulenumrule-specification[options]
iptables[-ttable]-Dchainrulenum[options]
iptables[-ttable]-[LFZ][chain][options]
iptables[-ttable]-Nchain
iptables[-ttable]-X[chain]
iptables[-ttable]-Pchaintarget[options]
iptables[-ttable]-Eold-chain-namenew-chain-name
-ttable参数用来指定规则表,目前有:
filter、nat、mangle和raw,当未指定规则表-t时,则默认为是filter。
各个规则表的功能如下:
filter:
当没有-t选项的时候,为规则表的默认值,处理的目标主要为:
DROP、LOG、REJECT和ACCEPT。
它包含INPUT(作为到达本地socket的包)、OUTPUT(作为本地产生的包)和FORWARD(作为路由的包)链。
nat:
用于要转发(路由)的信息包,要完成该类表的操作,目标主要有:
DNAT、SNAT、MASQUERADE和REDIRECT。
它包含PREROUTING(oralteringincomingpacketsbeforerouting)、OUTPUT(foralteringlocally-generatedpacketsbeforerouting)和POSTROUTING(foralteringpacketsastheyareabouttogoout)三个建的链。
如果信息包及其头进行了任何更改,则使用mangle表。
该表包含一些规则来标记用于高级路由的信息包,处理的目标有:
TOS、TTL和MARK。
在核2.4.17中该表包含PREROUTING和OUTPUT链;在核2.4.18以后,该表支持三个建链INPUT(forpacketscomingintotheboxitself)、FORWARD(foralteringpacketsbeingroutedthroughthebox)和POSTROUTING(foralteringpacketsastheyareabouttogoout)。
raw:
ThistableisusedmainlyforconfiguringexemptionsfromconnectiontrackingincombinationwiththeNOTRACKtarget,Itregistersatthenetfilterhookswithhigherpriorityandisthuscalledbeforeip_conntrack,oranyotherIPtables.Itprovidesthefollowingbuilt-inchains:
PREROUTING(forpacketsarrivingviaanynetworkinterface)OUTPUT(forpacketsgeneratedbylocalprocesses)。
filter、nat和mangle三个规则链为常用。
3.1命令(command):
-A,--append
在所选择的链(chains)末添加一条或更多规则。
当源(地址)或者/与目的(地址)转换为多个地址时,这条规则会加到所有可能的地址(组合)后面。
-D,--delete
从所选链(chainas)中删除一条或更多规则。
这条命令可以有两种方法:
可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。
-R,--replace
从选中的链中取代一条规则。
如果源(地址)或者/与目的(地址)被转换为多地址,该命令会失败。
规则序号从1开始。
-I,--insert
根据给出的规则序号向所选链中插入一条或更多规则。
所以,如果规则序号为1,规则会被插入链的头部。
这也是不指定规则序号时的默认方式。
-L,--list
显示所选链的所有规则。
如果没有选择链,所有链将被显示。
也可以和Z选项一起使用,这时链会被自动列出和归零。
精确输出受其它所给参数影响。
-F,--flush
清空所选链。
这等于把所有规则一个个的删除。
-Z,--zero
把所有链的包及字节的计数器清空。
它可以和-L配合使用,在清空前察看计数器。
-N,--new-chain
根据给出的名称建立一个新的用户定义链。
这必须保证没有同名的链存在。
-X,--delete-chain
删除指定的用户自定义链。
这个链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。
如果没有给出参数,这条命令将试着删除每个非建的链。
-P,--policy
设置链的目标规则。
-E,--rename-chain
根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。
TARGETS参数给出一个合法的目标。
只有非用户自定义链可以使用规则,而且建链和用户自定义链都不能是规则的目标。
-h,--Help
帮助。
给出当前命令语法非常简短的说明。
3.2match(匹配具体的规则,对命令增加、删除、替换等的rule-specification弥补)
-p,--protocal[!
]protocol
规则或者包检查(待检查包)的协议。
指定协议可以是tcp(6)、udp(17)、icmp
(1)中的一个或者全部all,也可以是数值,代表这些协议中的某一个。
当然也可以使用在/etc/protocols中定义的协议名。
在协议名前加上“!
”表示相反的规则。
数字0相当于所有all。
all会匹配所有协议,而且这是缺省时的选项。
在和check命令结合时,all可以不被使用。
-s,--source[!
]ipaddress[/mask]
指定源地址,可以是主机名、网络名和一般的IP地址。
mask说明可以是网络掩码或一般的数字,比如mask值为24等于255.255.255.0。
在指定地址前加上“!
”说明指定了相反的地址段。
标志--src是这个选项的简写。
-d,--destination[!
]address[/mask]
指定目标地址,与-s标志的说明类似。
标志--dst是这个选项的简写。
-j,--jumptarget表示-j目标跳转
指定包匹配规则后应当做什么。
目标可以是建的(如DROP),也可以是用户自定义链(不是这条规则所在的),或者一个扩展(参见下面的EXTENSIONS)。
如果规则的这个选项被忽略,那么匹配的过程不会对包产生影响,不过规则的计数器会增加。
-i,--in-interface[!
][name]
这是包经由该接口接收的可选的入口名称(即接口名称),包通过该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。
当在接口名前使用“!
”说明后,指的是相反的名称。
如果接口名后面加上“+”,则所有以此接口名开头的接口都会被匹配。
如果这个选项被忽略,那么将匹配任意接口。
-o,--out-interface[!
][name]
这是包经由该接口送出的可选的出口名称,包通过该口输出(在链FORWARD、OUTPUT和POSTROUTING中送出的包)。
当在接口名前使用“!
”说明后,指的是相反的名称。
如果接口名后面加上“+”,则所有以此接口名开头的接