Linux系统中iptables防火墙
目录
前言
一、iptables与netfilter的关系
二、iptables的表、链结构
(一)规则表
(二)规则链
三、数据包过滤的匹配流程
四、编写防火墙规则
(一)iptables的安装
(二)基本语法与数据包控制类型
(三)基本操作
(四)匹配条件
五、总结
前言
在网络安全愈发重要的今天,Linux系统凭借其稳定性和强大的功能,在服务器领域广泛应用。iptables作为Linux系统中一款关键的防火墙工具,能有效保护服务器免受恶意攻击。
一、iptables与netfilter的关系
在许多安全技术资料中,netfilter和iptables常被提及,却也容易让人混淆。netfilter是Linux内核中实现包过滤防火墙的内部结构,它运行在内核空间,并不以程序或文件的形式存在,属于“内核态”的防火墙功能体系。而iptables则是用来管理Linux防火墙的命令程序,通常位于/sbin/iptables目录下,属于“用户态”的防火墙管理体系 。简单来说,netfilter负责实际的数据包过滤工作,iptables则是用户用来配置和管理netfilter的工具,正确认识它们之间的关系,对理解Linux防火墙的工作方式至关重要。
二、iptables的表、链结构
(一)规则表
iptables通过四个不同的规则表来管理防火墙规则,每个表都有其特定的功能,且由独立的内核模块实现。
- filter表:主要用于数据包的过滤,根据设定的规则决定如何处理数据包。其对应的内核模块为iptable_filter,包含INPUT、FORWARD、OUTPUT三个链。例如,当我们想禁止特定IP访问服务器时,就可以在filter表的INPUT链中添加规则。
- nat表:即网络地址转换表,主要用于修改数据包的IP地址、端口号等信息,实现网络地址转换功能。对应的内核模块是iptable_nat,包含PREROUTING、POSTROUTING、OUTPUT三个链。在搭建网络地址转换网关时,就会用到nat表的相关功能。
- mangle表:用于修改数据包的TOS(服务类型)、TTL(生存周期),或者为数据包设置Mark标记,以实现流量整形、策略路由等高级应用。其内核模块为iptable_mangle,包含PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD五个链。不过,mangle表在日常应用中相对较少。
- raw表:这是iptables 1.2.9以后版本新增的表,主要用于决定是否对数据包进行状态跟踪。对应的内核模块是iptable_raw,包含OUTPUT、PREROUTING两个链,应用场景也相对有限。在本博客中,我们主要关注filter表和nat表的应用。
(二)规则链
iptables默认划分了五种不同的规则链,根据防火墙规则介入数据包处理的时机不同而区分。
- INPUT链:当收到访问防火墙本机地址的数据包(入站)时,会应用此链中的规则。比如,我们可以在INPUT链中设置规则,禁止某些恶意IP访问服务器。
- OUTPUT链:当防火墙本机向外发送数据包(出站)时,此链中的规则会被应用。例如,限制服务器对外访问特定的网站。
- FORWARD链:当接收到需要通过防火墙中转发送给其他地址的数据包(转发)时,会用到该链中的规则。在作为网络网关时,FORWARD链的规则设置就显得尤为重要。
- PREROUTING链:在对数据包做路由选择之前,应用此链中的规则。比如,可以在这个链中对数据包的目的地址进行修改。
- POSTROUTING链:在对数据包做路由选择之后,应用此链中的规则。常用于修改数据包的源地址。其中,INPUT、OUTPUT链主要用于“主机型防火墙”,保护服务器本机;FORWARD、PREROUTING、POSTROUTING链则多用于“网络型防火墙”,如网关服务器。
三、数据包过滤的匹配流程
数据包在iptables防火墙中的过滤匹配流程是一个涉及规则表、规则链以及各链内规则的有序处理过程,具体如下:
- 确定规则表处理顺序:iptables有filter、nat、mangle和raw四个默认规则表。当数据包到达防火墙时,并非所有表都会被处理,而是按照一定顺序筛选。通常,raw表优先处理,因为它主要用于决定是否对数据包进行状态跟踪,若在raw表中标记了不进行状态跟踪,后续相关操作会受影响。接着处理mangle表,它可修改数据包的TOS、TTL等字段。然后是nat表,用于网络地址转换。最后处理filter表,进行数据包的过滤操作。不过,实际处理中并非每个数据包都需经过所有表,例如某些只在本地处理、不涉及网络地址转换的数据包,可能不会经过nat表。
- 依据数据包流向选择规则链:在选定的规则表内,根据数据包的流向和处理阶段确定使用的规则链。
- 入站数据包:访问防火墙本机地址的入站数据包,会进入INPUT链。比如外部主机尝试访问本地Web服务器,其数据包进入INPUT链接受规则检查。
- 出站数据包:防火墙本机向外发送的数据包,进入OUTPUT链。像本地用户通过浏览器访问外部网站时,数据包从OUTPUT链流出。
- 转发数据包:需要通过防火墙中转发送给其他地址的数据包,进入FORWARD链。当企业内部网络通过防火墙访问外部网络时,转发的数据包会经过FORWARD链。
- 路由前处理:在对数据包做路由选择之前,会先进入PREROUTING链。此链可用于修改数据包的目的地址,例如实现目的地址转换。
- 路由后处理:数据包完成路由选择之后,进入POSTROUTING链。常用于修改数据包的源地址,比如在NAT场景中改变数据包的源IP地址。
- 规则链内部规则匹配:数据包进入相应规则链后,链内规则按顺序依次匹配。遵循“匹配即停止”原则(LOG日志操作规则除外) 。比如在INPUT链中有多条规则,第一条规则检查数据包源IP地址,第二条检查目的端口。若某数据包源IP地址符合第一条规则的拒绝条件,立即按该规则处理,不再检查后续规则。若整个链中都未找到匹配规则,则按该链的默认策略处理,默认策略一般为ACCEPT或DROP。若INPUT链默认策略是DROP,数据包找不到匹配规则时就会被丢弃。
- 特殊情况处理:在匹配过程中,LOG规则比较特殊。它用于在/var/log/messages文件中记录日志信息,记录后数据包继续传递给下一条规则进行匹配,不会因LOG规则匹配而停止。比如在排查网络问题时,使用LOG规则记录特定数据包信息,以便分析网络流量情况。
- 流程图示:
四、编写防火墙规则
在使用iptables防火墙之前,需要先关闭firewalld防火墙,避免产生冲突。可以使用以下命令关闭并禁用firewalld:
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
(一)iptables的安装
如果系统中未安装iptables,可以使用以下命令进行安装(以Open Euler 24.03操作系统为例):
[root@localhost ~]# yum -y install iptables iptables-services
安装完成后,启动iptables防火墙并设置开机启动:
[root@localhost ~]# systemctl start iptables.service
[root@localhost ~]# systemctl enable iptables.service
(二)基本语法与数据包控制类型
iptables命令的基本语法格式为:
iptables [-t表名]管理选项[链名][匹配条件][-j控制类型]
其中,表名和链名指定操作的对象,未指定表名时默认使用filter表;管理选项用于指定操作方式,如插入、增加、删除、查看等;匹配条件用来筛选数据包;控制类型决定数据包的处理方式,常见的有:
- ACCEPT:允许数据包通过。
- DROP:直接丢弃数据包,不给出任何回应信息。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息。
- LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。
例如,要在filter表的INPUT链中插入一条规则,拒绝发给本机的使用ICMP协议的数据包,可以执行以下命令:
[root@localhost ~]# iptables -t filter -I INPUT -p icmp -j REJECT
执行此操作后,其他主机将无法ping通本机。
(三)基本操作
- 添加规则:使用“-A”追加规则,“-I”插入规则。例如,在filter表INPUT链末尾添加允许TCP协议数据包通过的规则:
[root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
使用“-I”时可指定顺序号,未指定则默认作为第一条。如添加两条规则:
[root@localhost ~]# iptables -I INPUT -p udp -j ACCEPT
[root@localhost ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
- 查看规则:使用“-L”查看规则列表,结合“--line-numbers”可显示规则序号。查看filter表INPUT链所有规则及序号:
[root@localhost ~]# iptables -L INPUT --line-numbers
以数字形式显示地址和端口信息可加快命令执行速度:
[root@localhost ~]# iptables -n -L INPUT
- 删除、清空规则:使用“-D”删除一条规则,例如删除filter表INPUT链中的第三条规则:
[root@localhost ~]# iptables -D INPUT 3
使用“-F”清空所有规则:
[root@localhost ~]# iptables -F
(四)匹配条件
- 基本匹配:可以根据源地址、目标地址、协议等进行匹配。例如,拒绝转发源地址为192.168.1.11的数据包:
[root@localhost ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
- 隐含匹配:
- 端口匹配:针对TCP或UDP协议,使用“--sport源端口”或“--dport目标端口”。允许为网段192.168.4.0/24转发DNS查询数据包:
[root@localhost ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -d 192.168.4.0/24 -p udp --sport 53 -j ACCEPT
- ICMP类型匹配:针对ICMP协议,使用“--icmp-type ICMP类型”。禁止其他主机ping本机,但允许本机ping其他主机:
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp -j DROP
- 显式匹配:
- 多端口匹配:使用“-m multiport --dports端口列表”或“-m multiport --sports端口列表”。允许本机开放25、80、110、143端口提供电子邮件服务:
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
- IP范围匹配:使用“-m iprange --src-range IP范围”或“-m iprange --dst-range IP范围”。禁止转发源IP地址在192.168.4.21 - 192.168.4.28之间的TCP数据包:
[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range192.168.4.21-192.168.4.28 -j DROP
- MAC地址匹配:使用“-m mac --mac-source MAC地址”。根据MAC地址封锁主机访问本机:
[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
- 状态匹配:使用“-m state --state连接状态”。禁止转发与正常TCP连接无关的非--syn请求数据包:
[root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp! --syn -j DROP
五、总结
通过对iptables防火墙的深入学习,我们了解了它与netfilter的关系,掌握了iptables的表、链结构和数据包过滤匹配流程,还学会了如何编写和管理防火墙规则。在实际应用中,我们可以根据不同的网络环境和安全需求,灵活配置iptables规则,为Linux系统构建一道坚固的网络安全防线。