iptables防火墙
1、iptables的规则表、规则链结构
iptables的作用在于为包过滤机制的实现提供规则(或称策略),通过各种不同的规则,告诉netfilter对来自某些源、前往某些目的地或者具有某些协议特征的数据包应该如何处理。为了更方便的组织和管理防火墙策略,iptables采用了“表”和“链”的分层结构。每个规则表相当于内核空间的一个容器(如图1所示),根据处理数据包的时机不同,表容器内包括不同的规则“链”。针对特定数据包的各种防火墙规则,按顺序依次放入对应的规则“链”中。
1.1、规则表
按照防火墙策略的不同用途,iptables管理着四个不同的规则表,其功能分别由独立的内核模块实现。
filter表
filter表包含三个规则链:INPUT、FORWARD、OUTPUT。
filter表主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包。
filter表对应的内核模块为iptable_filter。
nat表
nat表包含三个规则链:PREROUTING、POSTROUTING、OUTPUT。
nat表主要用于修改数据包的IP地址、端口号等信息。
nat表对应的内核模块为iptable_nat。
mangle表
mangle表,包含五个规则链:RREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。
mangle表主要用于修改数据包的TOS(type of Service,服务类型)、TTL(Time to live,生存周期)值以及为数据包设置Mark标记,实现Qos(Quality of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。
mangle表对应的内核模块为iptable_mangle。
raw表
raw表,包含两条规则链:OUTPUT、PREROUTING。
raw表自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其它表。
raw表对应的内核模块为iptable_raw。
在iptables的四个规则表中,mangle表和raw表的应用相对较少。filter和nat表的应用较为广泛。
1.2、规则链
在处理各种数据包时,根据防火墙规的不同介入时机,iptables共涉及5种默认规则链,其应用时间点分别对应如下:
INPUT链:当接收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。
OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
FORWARD链:当接收到需要通过防火墙发送给其它地址的数据包(转发)时,应用此链中的规则。
PREROUTING链:在对数据包作路由选择之前,应用此联中的规则。
POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则。
其中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进行进出站数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网管使用时的情况。
2、数据包过滤匹配流程
2.1、规则表之间的先后顺序
当数据包抵达防火墙时,将依次应用raw、mangle、nat、和filter表中对应链内的规则,在图1中对应为自左向右的表优先顺序。
2.2、规则链之间的先后顺序
由于默认规则链是根据规则介入时机进行分类的,因此优先顺序直接取决于数据包的具体流向(如图2)。
入站数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标地址是防火墙本机(如internet用户访问防火墙主机中WEB服务的数据包),那么内核将其传递给INPUT链进行处理(决定是否允许通过),通过以后再交给系统上层的应用程序(如httpd服务器)进行响应。
转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
出站数据流向
防火前本机向外部地址发送的数据包(如在防火墙本机中测试公网DNS服务时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
2.3、规则链内部各条防火墙规则之间的优先顺序
在数据包经由每条规则链的处理过程中,依次按第1条规则、第2条规则……的顺序进行匹配和处理、如果找到一条能够匹配该数据包的规则,则不再继续检查后面的规则(使用LOG记录日志的规则例外)。如果比对完整个规则链,也找不到和数据包相匹配的规则,就按照该规则链的默认策略进行处理。
3、iptables的管理和设置
3.1、iptables的基本语法格式
使用iptables命令设置防火墙规则时,其基本的命令格式如下。
iptables [-t 表名] <-A|I|D|R> 链名 [规则编号] [-i|o 网卡名称] [-p 协议类型] [-s 源ip|源子网] [--sport 源端口号] [-d 目的IP|目标子网] [--dport 目标端口号] [-j 动作]
- 表名、链名:用于指定iptables命令所操作的表和链,若未指定表名,将默认使用filter表;
- 命令选项:用于指定管理iptables规则的方式,如插入、增加、删除以及查看等;
- 条件匹配:用于指定对符合什么样条件的数据包进行处理;
- 目标动作或跳转:用于指定数据包的处理方式,如允许通过、拒绝、丢弃或跳转给其它链进行处理。
3.2、规则管理
在管理iptables防火墙的过程中,首先需要考虑的就是如何查看规则、添加规则、清除连内的规则等基本操作。下表是iptables命令中几个常用的管理选项的使用。
iptables命令的管理控制选项
选项名 | 功能及特点 |
---|---|
-A | 在指定链的结尾添加一条新的规则。 |
-D | 删除指定链中的某一条规则,按照规则序号或内容确定要删除哪一条规则。 |
-I | 在指定链中插入一条新的规则,若未指定插入位置,则默认在链的开头插入。 |
-R | 修改、替换指定链中的某一条规则,按规则序号或内容确定需要替换哪一条规则。 |
-L | 列出指定链中的所有规则,若未指定链名,则列出表中所有的链的内容。 |
-F | 清空指定链中的所有规则,若未指定链名,则清空表中所有的链的内容。 |
-N | 新建一条用户自己定义的规则链。 |
-P | 设置指定链的默认策略。 |
-n | 使用数字形式显示输出结果,如:显示主机的IP地址而不是主机名称。 |
-v | 查看规则列表时显示详细信息。 |
-V | 查看iptables命令工具的版本信息。 |
-h | 查看命令帮助信息(help)。 |
—line-numbers | 查看规则列表时,同时显示规则在链中的顺序号。 |
其中,添加、插入、删除、清空规则和查看规则是最常用的管理选项。
4、条件匹配
对于linux防火墙来说,应该对什么样的数据包进行过滤,对什么样的数据包做地址转换……,对于一条有效的防火墙策略来说,条件匹配的设置起着决定性的作用,linux防火墙需要非常清楚地知道针对符合什么条件的数据包进行什么样的处理。
区分数据包的条件匹配方式可以分为通用条件匹配、隐含条件匹配和显示条件匹配,各种匹配条件可以结合在一起使用。
4.1、通用条件匹配
这种匹配操作一般可以直接使用,而不依赖于其他的条件匹配及其扩展。常见的通用匹配方式包括以下几种:
协议匹配
用于检查数据包的网络协议(–protocol),允许使用的协议名包含在/etc/protocols文件中,常见的为tcp、utp、icmp、和all(针对所有数据包)。在iptables命令中使用“-P 协议名”的形式。
- 拒绝进入防火墙的所有icmp协议数据
# iptables -I INPUT -P icmp -j REJECT
- 允许防火墙转发除icmp协议以外的所有数据包(使用感叹号“!”可以将条件取反)
# iptables -A FORWARD -P ! icmp -j ACCEPT
# iptables -L FORWARD
地址匹配
用于检查数据包的IP地址、网络地址。在iptables命令中使用“-s 源地址”和“-d 目标地址”的形式,分别对应于源(–source)地址和目标(destination)地址。
- 拒绝转发来自192.168.1.11主机的数据,允许转发来自192.168.0.0/24网段的数据。
# iptables -A FORWARD -S 192.168.1.11 -j REJECT
# iptables -A FORWARD -S 192.168.0.0/24 -j ACCEPT
网络接口匹配
用于检查数据包从防火墙的哪一个接口进入或离开。在iptables命令中使用“-i 网络接口名”和“-o 网络接口名”的形式,分别对应于接收数据包(–in-interface)的网卡和发送数据包(–out-interface)的网卡。
- 丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包。
# iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
# iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
- 管理员在网关服务器上检测到来自某个IP网段(如:10.20.30.0/24)的频繁扫描,希望设置iptables规则封堵该IP地址段,两小时后解封。
#iptables -I INPUT -s 10.20.30.0/24 -j DROP
#iptbales -I FORWARD -s 10.20.30.0/24 -j DROP
#at now +2 hours //设置在两小时后删除封堵规则
at>iptables -D INPUT 1
at>iptables -D FORWARD 1
at> //此处按Ctrl + D组合建
注意:在学习iptables规则的过程中,测试编写的iptables规则时,建议先执行“iptables -F”清空相关的规则表和链,以避免因规则顺序或其它规则带来的干扰。
4.2、隐含条件匹配
这种匹配通常需要以指定的协议匹配为前提,其对应的功能由iptables自动(隐含)的装载入内核,一般不需要用户手动加载模块。常见的隐含匹配方式包括以下几种。
端口匹配
用于检查数据包的TCP或UTP端口,需要以”-p tcp”或”-p udp”匹配为前提。在iptables命令中使用”–sport 源端口”、”–dport 目标端口”的形式,分别对应于源端口、目标端口。端口可以表示为单个端口或者用冒号“:”分割的端口范围。
- 仅允许管理员从202.13.0.0/16网段使用SSH方式远程登录防火墙主机。
# iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP
- 允许本机开放从TCP端口22~1024提供的应用服务。
# iptables -A INPUT -p tcp --dport 22:1024 -j ACCEPT
# iptbales -A OUTPUT -p tcp --sport 22:1024 -j ACCEPT
- 作为网关使用时,允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。
# iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
# iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
TCP标记匹配
用于检查数据包的TCP标记位(–tcp-flags),需要以“-p tcp”匹配为前提。在iptables命令中使用“–tcp-flags 检查范围 被设置的标记”的形式,两个参数“检查范围”和“被设置的标记”均为TCP标记的列表,各标记之间用逗号分隔。“检查范围”告诉iptables需要检查数据包的那几个标记,“被设置的标记”则明确匹配对应值为1的标记。
- 拒绝从外网接口(eth1)直接访问防火墙本机的数据包,但是允许响应防火墙TCP请求的数据包进入。
# iptables -p INPUT DROP
# iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT
# iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
ICMP类型匹配
用于检查ICMP数据包的类型(–icmp-type),有选择的过滤数据包,需要以“-p icmp”匹配为前提。在iptables命令中使用“–icmp-type ICMP类型”的形式。ICMP类型可以使用字符串或数字代码,例如“Echo-Request”(数字代码为8)、“Echo-Reply”(数字代码为0)、“Destination-Unreachable”(数字代码为3),分别对应ICMP协议的请求、回显、目标不可达数据。
- 禁止其它主机ping防火墙主机,但是允许从防火墙上ping其它主机(允许接收ICMP回应数据)。
# iptables -A INPUT -p icmp --icmp-type Echo-Reques -j DROP
# iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
4.3、显示条件匹配
这种匹配的功能需要由额外的内核模块提供,因此需要手工指定匹配方式。在iptables命令中使用“-m 模块关键字”的形式调用显示匹配,当然,还得指定对应的匹配内容。在使用过显示匹配以后,可以执行“lsmod |grep xt_”命令查看到扩展防火墙功能的相应内核模块(例如xt_mac,xt_state,xt_multiport等)。常见的显示匹配包括以下几种。
MAC地址匹配
主要用于检查数据包的源MAC地址。在iptables命令中使用“–mac-source MAC地址”的形式。
- 禁止转发来自MAC地址为00:11:22:33:44:55的主机的数据包。
# iptables -A FORWARD -m mac --mac-source 00:11:22:33:44:55 -j DROP
多端口匹配
检查数据包的源端口、目标端口时,用于匹配多个不连续的端口号。在iptables命令中主要使用“–dport 端口列表”或者“–sport 端口列表”的形式,分别对应源端口地址列表、目标端口地址列表。
- 允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250~1280。
#iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
多IP地址匹配
检查数据包的源地址、目标地址时,用于匹配一段范围内的IP地址。在iptables命令中主要使用“–src-range IP地址范围”或者“–dst-range IP地址范围”的形式,分别对应源IP地址范围、目标IP地址范围。
- 禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包。
# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
状态匹配
基于iptables的状态跟踪机制,检查数据包的连接状态(State)。常见的数据包状态主要包括NEW(与任何连接无关)、ESTABLISHED(响应请求或者已建立连接的)和RELATED(与已有连接有相关性的,如FTP数据连接)。
- 禁止转发与正常TCP连接无关的非–syn请求数据包(如网络中可能存在的一些非法攻击数据包)。
# iptables -A FORWARD -m state --state NEW -p tcp! --syn -j DROP
- 拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包。
# iptables -A INPUT -p tcp -m state --state NEW -j DROP
# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
- 在服务器中设置防火墙策略,只开放本机的Web服务(80端口)、FTP服务(21、20端口、20450~20480),放行外部主机发往服务器其它端口的应答数据包,将其它入站数据包均予以丢弃处理。
# iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
# iptables -I INPUT -P tcp --dport 20450:20480 -j ACCEPT
# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
# iptables -P INPUT DROP
5、数据包控制
在前面几个小节中,通过一些iptables规则的实例,已经接触到了如ACCEPT、DROP、REJECT等数据包控制方式。iptables对满足“条件匹配”指定条件的数据包,最常采用的处理方式如下:
处理字段 | 字段说明 |
---|---|
ACCEPT | 允许数据包通过。 |
DROP | 直接丢弃数据包,不给出任何回应信息。 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应信息。 |
LOG | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。 |
通常情况下,只要在规则链中找到一条相匹配的规则,则不再继续检查连内后面的规则;但使用LOG处理方式的规则是一个特例,因为LOG只是一种辅助动作,并没有真正处理数据包。
- 对于尝试通过SSH方式登录防火墙主机的访问数据,记录日志信息并禁止其访问。
# iptables -I INPUT -p tcp --dport 22 -j DROP
# iptables -I INPUT -p tcp --dport 22 -j LOG
为了避免日志记录过于频繁,通常结合LIMIT显示匹配(-m limit)对日志写入频率进行限制。例如以下规则,用于将记录日志的频率限制为三次/分钟,允许的峰值为八次。
# iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG
- 自定义一个新的链MyLan1,转发自/至192.168.1.0/24网段的数据包均交给该链中的规则处理。
# iptables -t filter -N MyLan1
# iptables -A FORWARD -s 192.168.1.0/24 -j MyLan1
# iptables -A FORWARD -d 192.168.1.0/24 -j MyLan1
# iptables -A MyLan1 -p icmp -j DROP
可以再MyLan1规则链中添加更多的规则,此处省略。
–北大青鸟教材。