配置iptables防火墙(上)

时间:2022-01-30 23:50:29
                  配置iptables防火墙 一.     防火墙介绍 1.防火墙作用是隔离内外网,过滤非法数据。 2.Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤型防火墙(或称网络层防火墙)。Linux的防火墙体系基于内核编码实现,因此具有非常稳定的性能和高效率,也因此被更加广泛的采纳和应用。 3.iptables的作用在于为包过滤机制的实现提供规则(或称策略),通过各种不同的规则,告诉netfilter对来自某些源、前往某些目的地或具有某些协议特征的数据包应该如何处理。 二.iptables的规则表、链结构      为了更方便地组织和管理防火墙策略,iptables采用了“表”和“链”的分层结构。每个规则“表”相当于内核空间的一个容器,根据处理数据包的时机不同,表容器内包括不同的规则“链”。针对特定数据包的各种防火墙规则,按顺序依次放入对应的规则“链”中。 1.规则表 按防火墙策略的不同用途,iptables4个不同的表,其功能分别由独立的内核模块实现。 u     filter Ø       包含3个规则链:INPUTFORWARDOUTPUT Ø       主要对数据包进行过滤,根据具体规则决定是否放行数据包。 Ø       对应的内核模块为iptable_filter u     nat Ø       包含3个规则链:PREROUTINGPOSTROUTINGOUTPUT Ø       主要用于修改数据包的IP地址、端口号等信息。 Ø       对应的内核模块iptable_nat u     mangle Ø       包含5个规则链:PREROUTINGPOSTROUTINGINPUT OUTPUTFORWARD Ø       主要用于修改数据包的TOS(服务类型)、TTL(生存周期)值以及数据包设置Mark标记,以实现Qos调整以及策略路由等应用,需要相应的路由设备支持,因此应用并不广泛。 Ø       对应的内核模块为iptable_mangle u     raw Ø       包含2个规则链:OUTPUTPREROUTINGG Ø       主要用于决定数据包是否被状态跟踪机制处理。 Ø       对应的内核模块是iptable_raw 2.规则链 在处理各种数据包时,根据防火墙规则的不同介入时机,iptables共涉及5种默认规则链,其应用时间点对应如下: Ø       INPUT:当接收到访问防火墙本机地址的数据包(入站)时 Ø       OUTPUT:当防火墙本机向外发送数据包(出站)时 Ø       FORWARD:当接收到需要通过防火墙发送给其他地址的数据包     (转发)时 Ø       PREROUTING:在对数据包作路由选择之前,应用此链中的规则 Ø       POSTROUTING:在对数据包作路由选择之后 其中,INPUTOUTPUT链更多应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制:而FORWARDPREROUTINGPOSTROUTING链更多应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。 三.数据包过滤匹配流程 1.规则表之间的优先顺序 当数据包抵达防火墙时,将依次应用下面表中对应链内的规则(如果有规则的话),为从左到右的优先顺序。 raw表————mangle表————nat表————filter 2.规则链之间的优先顺序 由于默认规则链是根据规则介入时机进行分类的,因此优先顺序直接取决于数据包的具体流向。 Ø       入站数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标地址是防火墙本机(如Internet用户访问防火墙主机中Web服务的数据包),那么内核将其传递给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(如httpd服务器)进行响应。 Ø       转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理,之后会进行路由选择,如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING链(是否修改数据包的地址等)进行处理。 Ø       出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙上测试公网DNS服务时),首先被OUTPUT链处理,之后进行路由选择,然后传递给POSTROUTING链(是否修改数据包的地址等)进行处理。 3.规则链内部各条防火墙规则之间的优先顺序 Ø       按规则顺序依次进行匹配和处理 Ø       如果找到一条能够匹配该数据包的规则,则不再继续检查后面的规则(使用LOG记录日志的规则除外) Ø       如果对比完整个规则链,也找不到和数据包相匹配的规则,就按照该规则链的默认策略进行处理。 四.管理和设置iptables规则 1.使用iptables命令设置防火墙规则时,基本的命令格式为:

 

Iptables [-t 表名命令选项 链名 [条件匹配] [-j 目标动作或跳转]
2.常用的管理选项如下:

 

选项名 功能及特点
-A 在指定链的末尾添加一条新的规则
-D 删除指定链中的某一条规则,按规则序号或内容确定要删除的规则
-I 在指定链中插入一条新的规则,若未指定插入位置,则默认在链的开头
-R 修改、替换指定链中的某一条规则,按规则序号或内容来确定要删除的规则
-L 列出指定链中所有的规则进行查看,若未指定链名,则列出表中所有链的内容
-F 清空指定链中的所有规则,若未指定链名,则清空表中所有链的内容
-N 新建一条用户自定义的规则链
-X 删除指定表中用户自定义的规则链
-P 设置指定链的默认策略
-n 使用数字形式显示输出结果,如显示主机的IP地址而不是主机名
-v 查看规则列表时显示详细信息
-V 查看iptables命令工具的版本信息
-h 查看命令帮助信息
--line-numbers 查看规则列表时,同时显示规则在规则链中的顺序号
3.条件匹配 1)通用条件 Ø       协议匹配:“-p 协议名” Ø       地址匹配:“-s 源地址”和“-d 目标地址” Ø       网络接口匹配:“-i 网络接口名”和“-o 网络接口名”,分别对应接收数据包的网卡和发送数据包的网卡。 2)隐含条件匹配 Ø       端口匹配:“--sport 源端口号”和“--dport 目标端口号”,需要以“-p tcp”或“-p udp”匹配为前提,端口可以为单个端口号或用冒号“:”分隔的端口范围。 Ø       TCP标记匹配:“--tcp-flags 检查范围被设置的标记”,两个参数“检查范围”和“被设置的标记”均为TCP标记的列表,各标记之间用逗号分隔。“检查范围”告诉iptables需要检查数据包的哪几个标记,“被设置的标记”则明确匹配对应值为1的标记。需要以“-p tcp”或“-p udp”匹配为前提。 Ø       ICMP类型匹配:需要以“-p icmp”匹配为前提,使用“--icmp-type ICMP类型”的形式。ICMP类型可以使用字符串或数字代码,有3TCMP类型: u     请求:Echo-Reply0 u     回显:Echo-Request8 u     目标不可达:Destination-Unreachable3 3)显式条件匹配  这种匹配的功能需要由额外的内核模块提供,因此需要手工指定匹配方式。在iptables命令中使用“-m 模块关键字”的形式调用显示匹配,当然,还得指定对应的匹配内容。在使用过显式匹配以后,可以执行“lsmod | grep xt_”命令查看扩展防火墙功能的相关内核模块(如xt_macxt_state,xt_multiport等)。 常见的显式匹配有以下几种: Ø       MAC地址匹配:主要用于检查数据包的源MAC地址,在iptables命令中使用“--mac-source MAC地址” Ø       多端口匹配:用于匹配多个不连续的端口,使用“--dport 端口列表”或“--dport 端口列表”的形式, Ø       IP地址匹配:用于匹配一段范围内的IP地址,在iptables命令中使用“--src-range IP地址范围”或“--dst-range IP地址范围”。 Ø       状态匹配:基于iptables的状态跟踪机制,检查数据包的连接状态。常见的数据包状态主要包括3种: u     NEW(与任何连接无关的) u     ESTABLISHED(响应请求或已建立连接的) u     RELATED(与已有连接有相关性的,如FTP数据连接) 4.数据包的控制 iptables对满足“条件匹配”指定条件的数据包,最常采用处理方式 Ø       ACCEPT:允许数据包通过 Ø       DROP:直接丢弃数据包,不给出任何回应信息 Ø       REJECT:拒绝数据包通过,必要时会给数据包发送端一个响应信息 Ø       LOG:/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。通常情况下,只要在规则链中找到一条相匹配的规则,则不再继续检查该链内后面的规则;但使用LOG处理方式的规则是一个特例,因此LOG只是一种辅助动作,并没有真正的处理数据包。 Ø       用户自定义链:将数据包传递给用户自定义的链(内的规则)进行处理 Ø       SNAT::修改数据包的源IP地址 Ø       DNAT:修改数据包的目标IP地址 五.设置iptables规则实例 1:在filter表的INPUT链中插入一条规则(作为链中第2条规则)

 

[root@localhost ~]#iptables -I INPUT 2 -p icmp -j ACCEPT
2:查看filterINPUT链中所有规则,同时显示各条规则顺序号

 

[root@localhost ~]#iptables -L INPUT --line-numbers
3:查看filter表各链中所有规则的详细信息,同时以数字形式显示地址和端口信息。

 

[root@localhost ~]# iptables -vnL
注意:-L选项放最后,否则会将vn当成链名。 4:管理员在网关服务器上检测到来自某个IP网段(10.20.20.0/24)的频繁扫描,希望设置iptables规则封堵该IP地址段,两个小时后解封。

 

[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -j DROP [root@localhost ~]# iptables -I FORWARD -s 10.10.10.0/24 -j DROP [root@localhost ~]# at now +2 hours //设置在2小时后删除封堵规则 at> iptables -D INPUT 1 at> iptables -D FORWARD 1 at>                             //此处按Ctrl+D组合键 job 1 at 2010-08-15 20:35 [root@localhost ~]#  
5:作为网关使用时,允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。

 

[root@localhost ~]# iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT [root@localhost ~]# iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
6:拒绝从外网接口(eth1)直接访问防火墙本机的数据包,但是允许响应防火墙TCP请求的数据包进入。

 

[root@localhost ~]# iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT [root@localhost ~]# iptables -I INPUT -i eth1 -p tcp ! --syn -j ACCEPT
注意:--syn的用法为兼容旧版本iptables的形式,此处等同于 --tcp-flags SYN,RST,ACK SYN 7:禁止其他主机ping防火墙本机,但是允许从防火墙ping其他主机(允许接受ICMP回应数据)。

 

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP [root@localhost ~]# iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT [root@localhost ~]# iptables -A INPUT -p icmp --icmp-type Destination-Unreachable -j ACCEPT
8:允许本机对外开放TCP端口202125以及被动模式FTP端口1250~1280

 

[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,1250:1280 -j ACCEPT
9:拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包。

 

[root@localhost ~]# iptables -A INPUT -p tcp -m state --state NEW -j DROP [root@localhost ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
10:在服务器上设置防火墙策略,只开放本机的Web服务(80端口)、FTP服务(212020450~20480),放行外部主机发往服务器其他端口的应答数据包,将其他入站数据包均予以丢弃处理。

 

[root@localhost ~]# iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT [root@localhost ~]# iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT [root@localhost ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT [root@localhost ~]# iptables -P INPUT DROP
11:对于尝试通过SSH方式登录防火墙主机的访问数据,记录日志信息并禁止其访问。

 

[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j DROP [root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j LOG
为了避免日志记录过于频繁,通常结合LIMIT显式匹配(-m limit)对日志写入频率进行限制。如:用于将记录日志的频率限制为平均3/分钟,允许的峰值为8次。

 

[root@localhost ~]# iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG
12:自定义一个新的链LWB,转发自/192.168.1.0/24网段的数据包均交给该链中的规则处理。

 

[root@localhost ~]# iptables -t filter -N LWB [root@localhost ~]# iptables -A FORWARD -s 192.168.1.0/24 -j LWB [root@localhost ~]# iptables -A FORWARD -d 192.168.1.0/24 -j LWB [root@localhost ~]# iptables -A LWB -p icmp -j DROP
六.导出、导入防火墙规则 iptables软件包提供了两个命令iptables-saveiptables-restore,分别用于保存和恢复防火墙规则,使用这两个命令可以很方便地导出和导入规则。 1.iptables-save 直接执行iptables-save命令时,将会把当前设置的防火墙规则信息输出到终端。 例:将当前设置好的iptables规则保存到配置文件,并通过iptables服务脚本自动加载。

 

[root@localhost ~]# iptables-save > /etc/sysconfig/iptables [root@localhost ~]# service iptables restart [root@localhost ~]# chkconfig iptables on
2.iptables-restore 使用iptables-restore命令,可以从已保存的配置文件中导入iptables规则(该文件必须是使用iptables-save命令导出的配置数据) 例:从已保存的规则配置文件中导入iptables规则。

 

[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables