Linux防火墙基础
Linux 的防火墙体系主要工作在网络层,针对 TCP/IP 数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux 系统的防火墙体系基于内核编码实现,具有非常稳定的性能和高效率,也因此获得广泛的应用。
在许多安全技术资料中,netfilter 和 iptables 都用来指 Linux 防火墙,往往使读者产生迷惑。
netfilter 和 iptables 的主要区别如下。
netfilter 指的是 Linux 内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在。属于“内核态”(Kernel space,又称为内核空间)的防火墙功能体系。
iptables 指的是用来管理 Linux 防火墙的命令程序,通常位于/sbin/iptables 目录下,属于“用户态”(User space,又称为用户空间)的防火墙管理体系。
iptables 的表、链结构
1、规则表
为了从规则集的功能上有所区别,iptables 管理着四个不同的规则表,其功能分别由独立的内核模块实现。这四个表的名称、包含的链及各自的用途如下:
filter filter表用来对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包。filter 表对应的内核模块为 iptable_filter,表内包含三个链,即 INPUT、FORWARD、OUTPUT。
nat nat(Network Address Translation,网络地址转换)表主要用来修改数据包的 IP 地址、端口号等信息。nat 表对应的内核模块为 iptable_nat,表内包含三个链,即 PREROUTING、POSTROUTING、OUTPUT.
mangle mangle 表用来修改数据包的 TOS(Type Of service,服务类型)、TTL(Time To Live.生存周期),或者为数据包设置 Mark 标记,以实现流量整形、策略路由等高级应用。mangle 表 对应的内核模块为 iptable mangle,表内包含五个链,即 PREROUTING、POSTROUTING、INPUT.OUTPUT.FORWARD.
raw raw 表是自1.2.9 以后版本的 iptables 新增的表,主要用来决定是否对数据包进行状态跟踪。raw 表对应的内核模块为 iptable_raw,表内包含两个链,即 OUTPUT、PREROUTING。
2、规则链
在处理各种数据包时,根据防火墙规则的不同介入时机,iptables默认划分五种不同的规则链,这五种链的名称、各自的介入时机如下:
INPUT 当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。
OUTPUT 当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
FORWARD 当接收到需要通过防火墙中转发送给其他地址的数据包(转发)时,应用此链中的规则。
PREROUTING 在对数据包做路由选择之前,应用此链中的规则。
POSTROUTING 在对数据包做路由选择之后,应用此链中的规则。
数据包过滤的匹配流程
规则表之间的顺序
当数据包抵达防火墙时,将以此应用raw表、mangle表、nat表和filter表中对应链内的规则(如果存在),应用顺序为 raw-mangle-nat-filter。
入站数据流向 来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应发往何处):如果数据包的目标地址是防火墙本机(如Internet 用户访问网关的 web 服务端口),那么内核将其传递给 INPUT 链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序如 httpd 服务器)进行响应。
转发数据流向 来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理,然后再进行路由选择:如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问 QQ服务器),则内核将其传递给FORWARD 链进行处理(允许转发或拦截、丢弃),最后交给 POSTROUTING 链(是否修改数据包的地址等)进行处理。
出站数据流向 防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网 DNS 服务时),首先进行路由选择,确定了输出路径后,再经由 OUTPUT 链处理,最后再交给 POSTROUTING 链(是否修改
数据包的地址等)进行处理。
基本语法、数据包控制类型
使用 iptables 命令管理、编写防火墙规则时,基本的命令格式如下:
iptables 【-t 表名】 管理选项 【链名】 【匹配条件】 【-j 控制类型】
对于防火墙,数据包的控制类型非常关键,直接关系刀数据包的放行、封堵及做相应的日志记录等,在 iptables 防火墙体系中,最常见的几种控制类型如下:
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给出任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应信息
LOG 在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
添加、查看、删除规则等基本操作
类别 选项 用途
增加 -A 追加到最后一行
-I 插入到第一行(或指定序号)
查看 -L 列出所有规则
-n 以数字形式显示
-v 详细信息
--line(--line-numbers) 显示序号
删除 -D 删除一条(指定序号或内容)
-F 情况所有
修改 -R 替换某条规则
设置默认 -P 设置默认规制
1、添加新的规则
添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则。例如,若要在 filter 表 INPUT 链的末尾添加一条防火墙规则,可以执行以下操作(其中“-p 协议名”作为匹配条件)。
当使用管理选项“-I”时,允许同时指定新添加规则的顺序号,未指定序号时默认作为第一条。例如,以下操作添加的两条规则将分别位于 filter 表的第一条、第二条(其中省略了“-tfilter”选项,默认使用 filter 表)。
2、查看规则列表
查看已有的防火墙规则时,使用管理选项“-L”,结合“--line-numbers”选项还可显示各条规则在链内的顺序号。例如,若要査看 filter 表 INPUT 链中的所有规则,并显示规则序号,可以执行以下操作。
当防火墙规则的数量较多时,若能够以数字形式显示地址和端口信息,可以减少地址解析的环节,在-定程度上加快命令执行的速度。例如,若要以数字地址形式査看 filter 表 INPUT 链中的所有规则,可以执行以下操作。
3、删除、清空规则
删除一条防火墙规则时,使用管理选项“-D”,例如,若要删除filter表 INPUT 链中的第三条规则,可以执行以下操作:
清空指定链或表中的所有防火墙规则,使用管理选项“-F”。例如,若要清空 filter 表 INPUT 链中的所有规则,可以执行以下操作。
使用管理选项“-F”时,允许省略链名而清空指定表所有链的规则。例如,执行以下操作分别用来清空 filter 表、nat 表、mangle 表。
4、设置默认策略
iptables 的各条链中,默认策略是规则匹配的最后一个环节-一当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。例如,执行以下操作可以将 filter 表中 FORWARD 链的默认策略设为丢弃,OUTPUT 链的默认策略设为允许。
要注意的是,当使用管理选项“-F”清空链时,默认策略不受影响。因此若要修改默认策略,必须通过管理员选项“-P” 重新进行设置;另外,默认策略并不参与链内规则的顺序编排,因此在其他规则之前或之后设置并无区别。
规则的匹配条件
在编写防火墙规则时,匹配条件的设置起着决定性的作用。只有清晰、准确地设置好匹配条件,防火墙才知道要对符合什么条件的数据包进行处理,避免“误杀”。对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效。根据数据包的各种特征,结合 iptables 的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显式匹配。
通用匹配
通用匹配也称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。常见的通用匹配包括协议匹配、地址匹配、网络接口匹配。
1、协议匹配
编写 iptables 规则时使用“-p 协议名”的形式指定,用来检査数据包所使用的网络协议(--protoco1),如 tcp、udp、icmp 和 a11(针对所有 IP 数据包)等,可用的协议类型存放于 Linux系统的/etc/procotols 文件中。例如,若要丢弃通过 icmp 协议访问防火墙本机的数据包,允许转发经过防火墙的除 icmp 协议之外的数据包,可以执行以下操作。
2、地址匹配
编写 iptables 规则时使用“-s 源地址”或“-d 目标地址”的形式指定,用来检査数据包的源地址(--source)或目标地址(--destination)。IP 地址、网段地址等都是可以接受的,但不建议使用主机名、域名地址(解析过程会影响效率)。例如,若要拒绝转发源地址为 192.168.1.11 的数据,允许转发源地址位于 192.168.7.0/24 网段的数据,可以执行以下操作。
当遇到小规模的网络扫描或攻击时,封锁 IP地址是比较有效的方式。例如,若检测到来自某个网段(如 10.20.30.0/24)的频繁扫描、登录穷举等不良企图,可立即添加防火墙规则进行封锁。
显式匹配
这种匹配方式要求有额外的内核模块提供支持,必须手动以“-m 模块名称”的形式调用相应的模块,然后方可设置匹配条件。添加了带显式匹配条件的规则以后,可以执行“1smodgrep xt_”命令査看到相关的内核扩展模块(如 xt multiport、xt iprange、xt mac、xt_state)。常见的显式匹配包括多端口匹配、IP 范围匹配、MAC 地址匹配、状态匹配。
1、多端口匹配
编写 iptables 规则时使用“-m multiport --dports 端口列表”、“-m multiport --sports 端口列表”的形式,用来检査数据包的源端口、目标端口,多个端口之间以逗号进行分隔。例如,若要允许本机开放 25、80、110、143 端口,以便提供电子邮件服务,可以执行以下操作。
2、IP 范围匹配
编写 iptables 规则时使用“-m iprange --src-range Ip 范围”、“-m iprange --dst-rangeIP 范围”的形式,用来检査数据包的源地址、目标地址,其中 IP范围采用“起始地址-结束地址”的形式表示。例如,若要禁止转发源 IP 地址位于 192.168.4.21 与 192.168.4.28 之间的 TCP 数据包,可以执行以下操作。
3、MAC 地址匹配
编写 iptables 规则时使用“-m mac --mac-source MAc 地址”的形式,用来检査数据包的源 MAC地址。由于 MAC 地址本身的局限性,此类匹配条件一般只适用于内部网络。例如,若要根据 MAC 地址封锁主机,禁止其访问本机的任何应用,可以参考以下操作。
4、状态匹配
编写 iptables 规则时使用“-m state --state 连接状态”的形式,基于 iptables 的状态跟踪机制用来检查数据包的连接状态(state)。常见的连接状态包括 NEW(与任何连接无关的)、ESTABLISHED(响应请求或者已建立连接的)和 RELATED(与已有连接有相关性的,如FTP 数据连接)。例如,若要禁止转发与正常 TCP 连接无关的非--syn 请求数据包(如伪造的网络攻击数据包),可以执行以下操作。