当前位置: 首页 > news >正文

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通过四个不同的规则表来管理防火墙规则,每个表都有其特定的功能,且由独立的内核模块实现。

  1. filter表:主要用于数据包的过滤,根据设定的规则决定如何处理数据包。其对应的内核模块为iptable_filter,包含INPUT、FORWARD、OUTPUT三个链。例如,当我们想禁止特定IP访问服务器时,就可以在filter表的INPUT链中添加规则。
  2. nat表:即网络地址转换表,主要用于修改数据包的IP地址、端口号等信息,实现网络地址转换功能。对应的内核模块是iptable_nat,包含PREROUTING、POSTROUTING、OUTPUT三个链。在搭建网络地址转换网关时,就会用到nat表的相关功能。
  3. mangle表:用于修改数据包的TOS(服务类型)、TTL(生存周期),或者为数据包设置Mark标记,以实现流量整形、策略路由等高级应用。其内核模块为iptable_mangle,包含PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD五个链。不过,mangle表在日常应用中相对较少。
  4. raw表:这是iptables 1.2.9以后版本新增的表,主要用于决定是否对数据包进行状态跟踪。对应的内核模块是iptable_raw,包含OUTPUT、PREROUTING两个链,应用场景也相对有限。在本博客中,我们主要关注filter表和nat表的应用。

(二)规则链

iptables默认划分了五种不同的规则链,根据防火墙规则介入数据包处理的时机不同而区分。

  1. INPUT链:当收到访问防火墙本机地址的数据包(入站)时,会应用此链中的规则。比如,我们可以在INPUT链中设置规则,禁止某些恶意IP访问服务器。
  2. OUTPUT链:当防火墙本机向外发送数据包(出站)时,此链中的规则会被应用。例如,限制服务器对外访问特定的网站。
  3. FORWARD链:当接收到需要通过防火墙中转发送给其他地址的数据包(转发)时,会用到该链中的规则。在作为网络网关时,FORWARD链的规则设置就显得尤为重要。
  4. PREROUTING链:在对数据包做路由选择之前,应用此链中的规则。比如,可以在这个链中对数据包的目的地址进行修改。
  5. POSTROUTING链:在对数据包做路由选择之后,应用此链中的规则。常用于修改数据包的源地址。其中,INPUT、OUTPUT链主要用于“主机型防火墙”,保护服务器本机;FORWARD、PREROUTING、POSTROUTING链则多用于“网络型防火墙”,如网关服务器。

三、数据包过滤的匹配流程

数据包在iptables防火墙中的过滤匹配流程是一个涉及规则表、规则链以及各链内规则的有序处理过程,具体如下:

  1. 确定规则表处理顺序:iptables有filter、nat、mangle和raw四个默认规则表。当数据包到达防火墙时,并非所有表都会被处理,而是按照一定顺序筛选。通常,raw表优先处理,因为它主要用于决定是否对数据包进行状态跟踪,若在raw表中标记了不进行状态跟踪,后续相关操作会受影响。接着处理mangle表,它可修改数据包的TOS、TTL等字段。然后是nat表,用于网络地址转换。最后处理filter表,进行数据包的过滤操作。不过,实际处理中并非每个数据包都需经过所有表,例如某些只在本地处理、不涉及网络地址转换的数据包,可能不会经过nat表。
  2. 依据数据包流向选择规则链:在选定的规则表内,根据数据包的流向和处理阶段确定使用的规则链。
  • 入站数据包:访问防火墙本机地址的入站数据包,会进入INPUT链。比如外部主机尝试访问本地Web服务器,其数据包进入INPUT链接受规则检查。
  • 出站数据包:防火墙本机向外发送的数据包,进入OUTPUT链。像本地用户通过浏览器访问外部网站时,数据包从OUTPUT链流出。
  • 转发数据包:需要通过防火墙中转发送给其他地址的数据包,进入FORWARD链。当企业内部网络通过防火墙访问外部网络时,转发的数据包会经过FORWARD链。
  • 路由前处理:在对数据包做路由选择之前,会先进入PREROUTING链。此链可用于修改数据包的目的地址,例如实现目的地址转换。
  • 路由后处理:数据包完成路由选择之后,进入POSTROUTING链。常用于修改数据包的源地址,比如在NAT场景中改变数据包的源IP地址。
  1. 规则链内部规则匹配:数据包进入相应规则链后,链内规则按顺序依次匹配。遵循“匹配即停止”原则(LOG日志操作规则除外) 。比如在INPUT链中有多条规则,第一条规则检查数据包源IP地址,第二条检查目的端口。若某数据包源IP地址符合第一条规则的拒绝条件,立即按该规则处理,不再检查后续规则。若整个链中都未找到匹配规则,则按该链的默认策略处理,默认策略一般为ACCEPT或DROP。若INPUT链默认策略是DROP,数据包找不到匹配规则时就会被丢弃。
  2. 特殊情况处理:在匹配过程中,LOG规则比较特殊。它用于在/var/log/messages文件中记录日志信息,记录后数据包继续传递给下一条规则进行匹配,不会因LOG规则匹配而停止。比如在排查网络问题时,使用LOG规则记录特定数据包信息,以便分析网络流量情况。
  3. 流程图示:

四、编写防火墙规则

在使用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通本机。

(三)基本操作

  1. 添加规则:使用“-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
  1. 查看规则:使用“-L”查看规则列表,结合“--line-numbers”可显示规则序号。查看filter表INPUT链所有规则及序号:
[root@localhost ~]# iptables -L INPUT --line-numbers

以数字形式显示地址和端口信息可加快命令执行速度:

[root@localhost ~]# iptables -n -L INPUT
  1. 删除、清空规则:使用“-D”删除一条规则,例如删除filter表INPUT链中的第三条规则:
[root@localhost ~]# iptables -D INPUT 3

使用“-F”清空所有规则:

[root@localhost ~]# iptables -F

(四)匹配条件

  1. 基本匹配:可以根据源地址、目标地址、协议等进行匹配。例如,拒绝转发源地址为192.168.1.11的数据包:
[root@localhost ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
  1. 隐含匹配
  • 端口匹配:针对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
  1. 显式匹配
  • 多端口匹配:使用“-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系统构建一道坚固的网络安全防线。

相关文章:

  • 松灵Cobot Magic双臂具身遥操机器人(基于ROS的定位建图与协同导航技术)
  • DeepSeek 即将联合 vLLM 开源推理引擎
  • AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B专属管家大模型
  • C++ 俄罗斯方块 | Tetris⚡YQW · Studio ⚡【无需下载图片】
  • 铅酸电池充电器方案EG1253+EG4321
  • JVM 学习
  • Spring Boot 版本与对应 JDK 版本兼容性
  • 雨滴传感器详解(STM32)
  • Sharding-JDBC 系列专题 - 第二篇:广播表(Broadcast Tables)
  • VuePress 使用教程:从入门到精通
  • 算法题(129):二维前缀和
  • RHCSA Linux 系统文件内容显示2
  • FPGA学习(五)——DDS信号发生器设计
  • 国产动漫记录
  • LangChain4j语言模型选型指南:主流模型能力全景对比
  • FreeRTOS中断管理
  • 【Agent】AI智能体评测基座AgentCLUE-General
  • python解压复制文件
  • Python多进程并发编程:深入理解Lock与Semaphore的实战应用与避坑指南
  • 【每日八股】复习 Redis Day1:Redis 的持久化(上)
  • 波音CEO称中方因中美“贸易战”停止接收波音飞机,外交部回应
  • 《亡命驾驶》:一场对于男子气概的终极幻想
  • 王鹏任海南文昌市委书记
  • 特斯拉一季度净利下滑七成,马斯克表态将继续倡导关税下调
  • 王励勤当选中国乒乓球协会新一任主席
  • 网培机构围猎中老年人:低价引流卖高价课、“名师”无资质,舆论呼吁加强监管