如何选择Linux防火墙管理工具?iptables、firewalld、UFW对比详解
前言
iptables与firewalld防火墙管理工具在linux发行版Redhat7系列使用较为广泛。 UFW则是在linux发行版Ubuntu下进行管理防火墙的一款管理工具。
在选用防火墙工具的时候,运维或者是开发人员往往会纠结使用哪个。这里给出建议,使用iptables工具管理就禁用firewalld,使用firewalld工具管理就禁用iptables,二者选其一即可,避免产生混乱。对于Ubuntu系统,UFW是默认推荐的选择,它基于iptables但提供了更友好的命令封装。需要特别注意的是,同一时刻只能运行一种防火墙管理工具,如果同时启用多个工具,它们会争夺netfilter规则链的控制权,导致规则互相覆盖或冲突,最终造成安全策略失效。例如,在CentOS 7系统中,如果你先启用了firewalld并配置了开放端口,之后又启动iptables服务并添加规则,那么iptables可能会清空或覆盖firewalld生成的规则,导致服务意外被阻断。
此篇文章不会在原理上做深究,主要以实用性为主,原理可以阅读相关书籍慢慢品味。不过,为了帮助大家更好地理解后续操作,我们会适度补充Netfilter内核模块的基础知识以及各工具的设计哲学差异,让读者不仅"知其然",更能"知其所以然"。
一、Netfilter内核模块
无论是使用iptables还是firewalld,不妨先了解一下Netfilter内核模块什么是Netfilter :linux操作系统核心层内部的一个数据包处理模块。 Hook point :数据包在Netfilter中的挂载点。(PRE_ROUTING INPUT OUTPUT FORWORD POST_ROUTING)
🔍 知识拓展:Netfilter与防火墙的关系
许多初学者误以为iptables或firewalld就是防火墙本身,实际上它们只是管理工具,真正执行数据包过滤、地址转换(NAT)、连接跟踪(connection tracking)等核心功能的是Linux内核中的Netfilter框架。Netfilter自Linux 2.4.x内核起被集成,它提供了一套完整的钩子(hook)机制,允许内核模块在数据包穿越网络协议栈的不同位置时进行干预。可以这样理解:Netfilter是"高速公路上的检查站",而iptables/firewalld/UFW则是"检查站的规章制度制定者",它们负责将管理员配置的规则翻译成Netfilter能够识别的指令。
1、netfilter的体系结构
网络数据包的的统信主要通过以下相关步骤,对应netfilter定义的钩子函数,具体可以参考源码介绍。
- NF_IP_PRE_ROUTING :
网络数据包进入系统,经过简单检测(如校验和检查、报文长度验证等)后,数据包转交给该函数进行处理,然后根据系统设置的规则对数据包进行处理,如果数据包不被丢弃则交给路由函数进行处理。在该函数中可以替换IP包的目的地址,及DNAT(目标网络地址转换) 。DNAT常用于端口转发场景,例如将公网IP的80端口流量转发到内网某台Web服务器的8080端口。
- NF_IP_LOCAL_IN:
所有发送给本机的数据包都要通过该函数进行处理,该函数根据系统设置的系统规则对数据包进行处理,如果数据包不被丢弃则交给本地的应用程序(如sshd、nginx、mysqld等监听进程)。这是入站流量过滤的核心钩子点,通常用于限制外部访问本机服务的规则。
- NF_IP_FORWARD:
所有不是发送给本机的数据包都要通过该函数进行处理,该函数会根据系统设置的规则对数据包进行处理,如数据包不被丢弃则转给NF_IP_POST_ROUTING处理。此钩子仅当服务器开启了IP转发功能(net.ipv4.ip_forward=1)时才会生效,是实现路由器或网关功能的关键环节。
- NF_IP_LOCAL_OUT:
所有从本地应用程序出来的数据包必须通过该函数进行处理,该函数会根据系统设置的规则对数据包进行处理,如数据包不被丢弃则交给路由函数进行处理。这是出站流量过滤的钩子点,可用于限制本机进程对外发起的连接,例如防止恶意程序向外传送数据。
- NF_IP_POST_ROUTING :
所有数据包在发送给其它主机之前需要通过该函数进行处理,该函数会根据系统设置的规则对数据包进行处理,如数据包不被丢弃,将数据包发给数据链路层。在该函数中可以替换IP包的源地址,即SNAT(源网络地址转换) 。SNAT是让内网机器共享公网IP上网的核心技术,也是企业级NAT网关的基石。
💡 术语解释:DNAT与SNAT的区别
| 转换类型 | 作用方向 | 典型应用场景 | 配置示例 |
|---|---|---|---|
| DNAT(目标地址转换) | 修改数据包的目标IP/端口 | 端口映射、负载均衡、将公网流量引入内网服务器 | 访问 1.2.3.4:80 实际转发到 192.168.1.10:8080 |
| SNAT(源地址转换) | 修改数据包的源IP/端口 | 内网主机通过公网IP上网、隐藏内部网络结构 | 内网 192.168.x.x 发出包,源地址改为公网IP 1.2.3.4 |
| MASQUERADE(伪装) | SNAT的特殊形式,自动使用出口网卡IP | 拨号网络、动态公网IP场景 | 无需指定固定源IP,系统自动获取出口IP |
数据包通过linux防火墙的处理过程如下图

📌 补充说明:上图展示了数据包从网卡进入、经过PREROUTING→路由判断→(若目的为本机则走INPUT,若需转发则走FORWARD→POSTROUTING)→最终从网卡发出的完整路径。理解这个流程图是掌握防火墙规则链顺序的基础——规则在哪个钩子点生效,取决于数据包当前所处的阶段。例如,限制外部访问本机SSH服务的规则应放在INPUT链,而限制本机访问外网的规则则应放在OUTPUT链。
2、包过滤
每个函数都可以对数据包进行处理,最基本的操作是对数据包进行过滤。系统管理员可以通过iptables工具来向内核模块注册多个过滤规则,并且指明过滤规则的优先权。设置完以后每个钩子按照规则进行匹配。如果规则匹配,函数就会进行一些过滤操作,这些操作主要如下:
- NF_ACCEPT:继续正常的传递包。
- NF_DROP:丢弃包,阻止传送。客户端通常不会收到任何反馈,表现为"连接超时"。
- SF_STOLEN:已经接管了包,不需要继续传送。
- NF_QUEUE:排列包。
- NF_REPEAT:再次使用钩子。
⚠️ 专家建议:DROP vs REJECT
在实际生产环境中,DROP和REJECT的选择需要谨慎权衡:
- DROP:静默丢弃,客户端会等待超时(通常几十秒到几分钟),适用于防范端口扫描,因为扫描器无法快速判断端口是否开放,增加了攻击者的时间成本。
- REJECT:主动返回ICMP不可达或TCP RST包,客户端能立即感知连接被拒绝(如Connection refused错误),用户体验更好,但会暴露防火墙的存在。
- 安全最佳实践:对于公网暴露的服务,推荐使用DROP来隐藏端口状态;对于内部管理网络,可以使用REJECT以便快速排查问题。
篇幅受限,介绍过多反而不好。关于包过滤就介绍这么多,后续会进一步完善。但这里需要补充一个重要概念——连接跟踪(conntrack) :Netfilter还维护了一张连接状态表,记录每个数据包所属的连接状态(NEW、ESTABLISHED、RELATED、INVALID)。基于状态的防火墙规则能大大简化配置,例如允许所有已建立连接(ESTABLISHED)的数据包通过,只需重点管理新连接(NEW)的准入策略。这也是为什么很多iptables教程都会推荐在规则链开头添加-m state --state ESTABLISHED,RELATED -j ACCEPT的原因。
二、firewalld防火墙工具
以Redhat系列为例子做简单的介绍,熟悉centos的基本上可以套用。Redhat 7/8/9以及CentOS 7/8/9、Rocky Linux、AlmaLinux等主流RHEL衍生发行版均采用firewalld作为默认防火墙管理工具。
firewalld简介
在RHEL7之前的版本中,iptables和ip6tables作为防火墙配置管理工具。在RHEL7中防火墙管理工具变成了firewalld,它是一个支持自定义网络区域(zone)及接口安全等级的动态防火墙管理工具。利用firewalld,用户可以实现许多强大的网络功能,例如防火墙、代理服务器以及网络地址转换。
之前版本的system-config-firewall和lokkit防火墙模型是静态的,每次修改防火墙规则都需要完全重启。在此过程中包括提供防火墙的内核模块netfilter需要卸载和重新加载。而卸载会破坏已建立的连接和状态防火墙。与之前的静态模型有区别,firewalld将动态地管理防火墙,不需要重新启动防火墙,也不需重新加载内核模块。但firewalld服务要求所有关于防火墙的变更都要通过守护进程来完成,从而确保守护进程中的状态与内核防火墙之间的一致性。
许多不了解的人,认为RHEL7中的防火墙从iptables变成了firewalld。其实不然,无论是iptables还是firewalld都无法提供防火墙功能。他们都只是linux系统中的一个防火墙管理工具,负责生成防火墙规则与内核模块netfilter进行"交流",真正实现防火墙功能的是内核模块netfilter。
firewalld提供了两种管理模式:其一是firewall-cmd命令管理工具,其二是firewall-config图形化管理工具。在之前版本中的 iptables将规则保存在文件/etc/sysconfig/iptables中,现在firewalld将配置文件保存在/usr/lib/firewalld和/etc/firewalld 目录的xml文件中。🔥 firewalld的核心设计理念——区域(Zone)
firewalld引入了"区域"概念,将不同的网络接口(如eth0连接公网、eth1连接内网)划分到不同的安全区域,每个区域拥有独立的规则集。系统预定义了9个区域(从最信任到最不信任):trusted > home > internal > work > public > external > dmz > block > drop。默认区域为public,它仅允许SSH等少数服务入站,其余均拒绝。这种分层设计使得多网卡服务器(例如同时连接互联网、内网和DMZ区的服务器)的防火墙策略管理变得异常清晰。
虽然RHEL7中将默认的防火墙管理工具从iptables换成了firewalld,但在RHEL7中仍然可以使用iptables的,只需要通过yum命令进行安装启用iptables服务即可。换句话说,红帽将这个选择权交给了用户。
下面给出RHEL7的防火墙堆栈

📊 防火墙管理工具横向对比
| 特性 | iptables | firewalld | UFW |
|---|---|---|---|
| 默认系统 | RHEL6及以前、CentOS6 | RHEL7+、CentOS7+、Fedora | Ubuntu、Debian |
| 规则生效方式 | 静态(需重启服务) | 动态(实时生效) | 动态(实时生效) |
| 配置接口 | 命令行(iptables) | 命令行(firewall-cmd)+ 图形(firewall-config) | 命令行(ufw)+ 图形(gufw) |
| 配置文件格式 | /etc/sysconfig/iptables(纯文本规则) | /etc/firewalld/*.xml(XML) | /etc/ufw/*.rules |
| 区域/配置文件支持 | 无,全部自定义 | 支持zone,预定义多种场景 | 支持简单配置文件(before/after rules) |
| 学习曲线 | 陡峭(需掌握五链四表) | 中等(命令更语义化) | 平缓(极简命令) |
| 适合场景 | 复杂策略、精细化控制 | 企业服务器、多网卡环境 | 个人开发者、小型VPS |
1、firewalld命令行模式
1.1、区域选择
当前操作系统安装完成后,防火墙会设置一个默认区域,将接口加入到默认区域中。用户配置防火墙的第一步是获取默认区域并修改,关于操作如下:
查看当前系统中所有区域
firewall-cmd --get-zones
上述命令会列出所有预定义区域,每个区域的规则配置可通过firewall-cmd --zone=public --list-all查看详情。
查看当前默认的区域
firewall-cmd --get-default-zone
查看当前已激活的区域
firewall-cmd --get-active-zones
获取接口ens33所属区域
firewall-cmd --get-zone-of-interface=ens33
修改接口所属区域
firewall-cmd --permanent --zone=internal --change-interface=ens33
💡 实用技巧:将内网接口(如eth1)分配到internal或trusted区域,将外网接口(如eth0)分配到public或drop区域,可以实现"内网全放行、外网严管控"的策略。修改区域后无需重启防火墙,立即生效。
1.2、firewalld服务重载、重启、停止
重新加载防火墙配置(不中断已建立的连接,仅应用新规则)
firewall-cmd --reload
--reload与--complete-reload的区别:--reload是平滑重载,不会中断现有连接;--complete-reload会完全重置防火墙状态,可能导致所有连接短暂中断。日常操作推荐使用--reload。
重启防火墙(redhat系列)
systemctl restart firewalld.service
临时关闭防火墙(注意:仅用于调试,生产环境慎用! )
systemctl stop firewalld.service
开机启用防火墙
systemctl enable firewalld.service
开机禁止防火墙
systemctl disable firewalld.service
查看firewalld的运行状态
firewall-cmd --state
⚠️ 安全警告:临时关闭防火墙会使服务器暴露在公网中,所有端口均可被访问。如果必须关闭,请确保在调试完成后立即重新启用,或使用firewall-cmd --panic-on开启紧急模式(拒绝所有流量,仅允许本机访问)作为临时替代方案。
1.3、firewalld开放端口(public)
公共区域设置开放21端口永久生效并写入配置文件(参数:--permanent)
#参数:--permanent,设置即立刻生效并且写入配置文件 firewall-cmd --zone=public --add-port=21/tcp --permanent
注意:使用--permanent参数后,规则会写入/etc/firewalld/zones/public.xml,但不会立即生效,必须执行firewall-cmd --reload或firewall-cmd --runtime-to-permanent才能加载。如果希望立即生效且写入永久配置,可以不加--permanent先添加运行时规则,测试无误后再用--runtime-to-permanent持久化。
查询防火墙端口21是否开放
firewall-cmd --zone=public --query-port=21/tcp
移除开放的端口21
firewall-cmd --zone=public --remove-port=21/tcp --permanent
📌 端口范围开放语法:开放一段连续端口,使用--add-port=1000-2000/tcp;开放多个不连续端口,可多次执行--add-port或使用逗号分隔(如1000/tcp,2000/tcp,但部分版本不支持逗号,推荐多次执行)。
1.4、区域规则修改
查询防火墙规则列表
firewall-cmd --zone=public --list-all
新增一条区域规则httpd服务(firewalld预定义了多个服务名称,对应标准端口)
firewall-cmd --permanent --zone=internal --add-service=http
预定义服务列表:执行firewall-cmd --get-services可查看所有预定义服务(如http、https、ssh、mysql、smtp等)。每个服务对应一个或多个端口/协议,定义在/usr/lib/firewalld/services/*.xml中。使用服务名称比直接写端口更便于管理,且firewalld会自动处理协议类型(TCP/UDP)。
验证规则
firewall-cmd --zone=internal --list-all
2、firewalld图形化界面
上面的简介也介绍到了firewalld提供了两种管理模式:其一是firewall-cmd命令管理工具,其二是firewall-config图形化管理工具。在之前版本中的iptables将规则保存在文件/etc/sysconfig/iptables中,现在firewalld将配置文件保存在/usr/lib/firewalld和/etc/firewalld目录的xml文件中。
图形化界面中修改接口区域可以使用NetworkManager,也可以使用firewall-config工具。NetworkManager使用方法:打开终端执行命令nm-connection-editor,如下图弹出对话框:
🔧 图形化工具适用场景:对于不熟悉命令行操作的管理员,firewall-config提供了树形菜单和复选框,可以直观地选择区域、添加服务/端口、配置富规则(rich rules)。在桌面版Linux或通过X11转发远程执行时非常方便。但在无图形界面的服务器环境(如云主机)中,仍需依赖firewall-cmd命令行。
2.1、图形化界面NetworkManager
终端执行:nm-connection-editor

在NetworkManager连接编辑器中,可以在"常规"选项卡下设置"防火墙区域",将某个网卡绑定到特定区域,实现接口级隔离。
2.2、图形化界面firewall-config
终端执行:firewall-config

三、iptables防火墙工具
1、安装iptables
假如是centos6,默认是安装了iptables。 如果是centos7或者Redhat7系列,默认没有安装iptables。你需要关闭默认启动的firewalld,二选一即可。
临时关闭firewalld
systemctl stop firewalld
开机禁用firewalld
systemctl disable firewalld
开机启用firewalld
systemctl enable firewalld
通过yum在线安装iptables,检查是否安装了iptables
systemctl status iptables.service service iptables status
安装iptables
yum -y install iptables
升级iptables
yum update iptables
安装iptables-services(提供/etc/init.d/iptables服务管理脚本)
yum -y install iptables-services.x86_64
设置iptables为开机自启
systemctl enable iptables.service
⚠️ 切换防火墙管理工具前的重要检查:在禁用firewalld并启用iptables之前,务必确认当前没有通过firewalld开放的重要端口(如22、80、443),否则切换后这些端口会被iptables默认策略(通常是拒绝所有入站)阻断,导致远程连接断开。建议在切换前先用iptables命令添加允许SSH的规则,或者通过服务器控制台(VNC/串口)操作。
iptables规则组成
- ACCEPT(接收,允许通过)
- DROP(丢弃数据包不做任何反馈)
- REJECT(丢弃数据包,客户端有对应消息返回)
🌐 iptables四表五链基础
iptables管理着四个规则表(Table),每个表包含不同的链(Chain):
- filter表:用于包过滤(最常用),包含INPUT、OUTPUT、FORWARD链。
- nat表:用于网络地址转换,包含PREROUTING、POSTROUTING、OUTPUT链。
- mangle表:用于修改数据包头部(如TOS、TTL),包含所有五个链。
- raw表:用于跳过连接跟踪,包含PREROUTING、OUTPUT链。使用iptables -t 表名指定操作的表,未指定时默认为filter表。理解这张"表-链-规则"三级结构,是精通iptables的基石。
查询已经设置的规则:-L命令
#一般配合-n命令使用 iptables -L #不显示主机地址 iptables -nL
常用组合:iptables -L -n -v --line-numbers,其中-n表示不解析IP/端口为域名(加快显示),-v显示详细统计信息(如数据包计数),--line-numbers显示每条规则的序号,便于后续按序号删除。
清除原来设置的规则:-F命令
iptables -F
注意:-F命令只会清空当前表(默认为filter表)中所有链的规则,不会改变默认策略(如默认DROP)。如果需要彻底重置,还需要执行iptables -X删除自定义链,以及iptables -P INPUT ACCEPT等将默认策略恢复为ACCEPT。
删除某一条已经设置的规则:-D命令
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
删除方式有两种:按序号删除(iptables -D INPUT 3)或按完整规则匹配删除(iptables -D INPUT -s 1.2.3.4 -j DROP)。按序号删除更安全,前提是先通过--line-numbers查看序号。
2、场景一放通端口
插入一些规则:-I命令,放通80、22、10~21(一段)这些端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
-I表示插入到链的开头(最优先级),如果不指定位置,默认插入到第一条。若希望追加到末尾,使用-A。规则顺序非常重要:iptables按顺序匹配,一旦匹配成功就不再向下匹配。因此应将最具体的规则放在前面,通用规则(如放行已建立连接)放在最前,拒绝规则放在最后。
设置某一个固定的IP访问80端口 :-s http://192.168.xxx.xxx
iptables -I INPUT -p tcp -s (你的IP地址) --dport 80 -j ACCEPT
若只允许特定IP段访问,可使用CIDR格式,例如-s 192.168.1.0/24。若需要允许多个独立IP,可多次添加规则或使用ipset模块(集合管理)提升性能。
ssh远程连接本地服务器或者云服务器需要默认启用的端口
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
🔐 安全建议:如果可能,将SSH默认的22端口修改为其他高位端口(如10022),并在iptables中只允许该端口,可大幅减少暴力破解扫描。同时建议配合-m recent模块限制单IP连接频率,例如:iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH 以及后续规则限制每分钟不超过3次尝试。
设置10~21端口开放访问
iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT
设置icmp规则允许访问
iptables -I INPUT -p icmp -j ACCEPT
关于ICMP:允许ICMP(ping)有助于网络连通性测试,但大量ICMP请求可能成为DoS攻击载体。生产环境中建议限制ICMP速率,例如-m limit --limit 1/second。
注意:允许本机可以访问本机,本机访问外网 解决本机可以访问本机(telnet 127.0.0.1 22),添加-i lo(网卡)规则。
设置规则
iptables -I INPUT -i lo -p tcp -j ACCEPT
📌 环回接口(lo):很多新手忘记放行lo接口,导致本机进程间通信(如MySQL连接本地数据库)被阻断。务必添加对lo的完全信任规则。
本机测试访问外网
curl https://www.baidu.com
设置规则
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
上述规则允许本机对外发起任何连接,并允许这些连接的相关返回数据包进入。这是状态防火墙的经典用法,依赖于-m state --state ESTABLISHED,RELATED,比单纯的允许所有出站+所有入站要安全得多。
在设置的最后追加一条规则 :-A命令 拒绝xx规则
iptables -A INPUT -j REJECT
通常最后追加一条iptables -A INPUT -j DROP或REJECT,用于丢弃所有未匹配的入站流量。但注意必须确保在此之前已经放行了SSH和关键服务端口,否则会导致自己无法远程管理。
3、场景二
ftp主动模式下iptables的规则配置(不建议) ftp被动模式下iptables的规则配置(实际应用,推荐)
📘 FTP协议与防火墙的恩怨:FTP有主动和被动两种模式,对防火墙配置影响很大:
- 主动模式:客户端随机端口连接服务器21端口,服务器从20端口主动连接客户端的高位随机端口。这需要客户端开放端口,且服务器需要允许出站到客户端随机端口,配置复杂且安全性差。
- 被动模式:客户端连接服务器21端口后,服务器返回一个随机高位端口(通常为1024-65535),客户端再连接该端口进行数据传输。这要求防火墙放行服务器的高位端口范围,相对更容易配置。对于被动FTP,需要在iptables中加载nf_conntrack_ftp模块并放行指定范围的数据端口:
bash modprobe nf_conntrack_ftp iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 30000:31000 -j ACCEPT # 被动模式数据端口范围
同时确保/etc/vsftpd.conf中配置pasv_min_port=30000和pasv_max_port=31000保持一致。
4、场景三
工作中的一些常用配置,设置好规则后保存到配置文件。chkconfig iptables on 设置开机启动规则。 snat(对原地址,发起地址)规则设置,dnat(目标地址,发往的地址)规则设置。
🌐 SNAT与DNAT实战示例:
- SNAT(让内网上网) :假设内网段为192.168.1.0/24,公网出口IP为1.2.3.4,在POSTROUTING链添加:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 1.2.3.4
- DNAT(端口映射) :将公网访问1.2.3.4:8080的流量转发到内网Web服务器192.168.1.100:80:
iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80配置后记得启用IP转发:echo 1 > /proc/sys/net/ipv4/ip_forward,并写入/etc/sysctl.conf永久生效。
5、iptables防攻击企业应用
iptables防攻击企业应用(根据实际业务设置) 利用iptables防CC攻击connlimit模块作用: 用于限制每一个客户端IP的并发连接数。 参数:--connlimit-above n(次数),限制并发数
例如,限制次数为100
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
🔒 防CC攻击原理:CC(Challenge Collapsar)攻击是应用层DDoS的一种,通过大量合法请求耗尽服务器资源。connlimit模块可以限制每个客户端IP的并发连接数,当同一IP同时建立超过100个连接到Web端口时,后续连接将被拒绝。需要根据业务正常并发量调整阈值,过小可能误伤正常用户,过大则无法起到防护效果。
测试,限制某一固定IP并发次数
iptables -I INPUT -p tcp --dport 80 -s [ip地址] -m connlimit --connlimit-above 10 -j REJECT
6、limit模块
作用: 限速,控制流量 例如
iptable -A INPUT -m limit --limit 3/hour
--limit-burst 5,默认值为5
⏱️ limit模块参数详解:--limit指定平均速率(如3/minute、1/second),--limit-burst指定初始突发令牌桶容量。例如--limit 3/minute --limit-burst 5表示允许瞬间最多5个包通过,之后每分钟只能通过3个包。常用于ICMP限速、SSH防暴力破解等。
在设置最后追加一条过滤规则
iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
拒绝其它规则访问
iptables -A INPUT -p icmp -j DROP
📈 进阶防护组合:除了connlimit和limit,iptables还支持recent模块(追踪最近连接的IP)、string模块(过滤包含特定字符串的包)、geoip模块(按国家/地区屏蔽)。企业级应用通常组合多种模块构建纵深防御体系,例如:
限制SSH每分钟尝试次数不超过3次
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 --name SSH -j DROP
```
设置完,测试接限制的IP地址:
#测试受限IP地址 ping 192.168.245.139
2、配置文件新增规则
文中介绍过iptables安装后的配置文件所在目录。
/etc/sysconfig/iptables

修改配置文件
vim /etc/sysconfig/iptables
📝 配置文件编辑注意事项:
- 编辑/etc/sysconfig/iptables时,顺序必须正确:先*filter声明表,再:INPUT ACCEPT [0:0]等定义链默认策略,然后按顺序写入规则,最后COMMIT提交。任何语法错误都会导致iptables服务启动失败。
- 建议在编辑前先备份:cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
- 修改完后通过systemctl restart iptables生效,并通过iptables -L -n验证规则是否加载成功。

四、UFW防火墙工具
Uncomplicated Firewall
简称UFW,是Ubuntu系统上默认的防火墙组件。UFW是为轻量化配置iptables而开发的一款工具。 UFW 提供一个非常友好的界面用于创建基于IPV4,IPV6的防火墙规则。UFW 在 Ubuntu 8.04 LTS 后的所有发行版中默认可用。 UFW 的图形用户界面叫Gufw。UFW设计哲学:UFW的目标是让防火墙配置变得"无脑简单",它的命令语法比iptables简洁得多,非常适合个人开发者、小型VPS或对防火墙需求不复杂的场景。UFW底层仍然是调用iptables/netfilter,因此所有iptables的功能UFW理论上都能实现,只是对于复杂规则(如SNAT/DNAT、多表操作),UFW需要通过配置文件扩展。
1、开启与关闭防火墙
开启防火墙
ufw enable
关闭防火墙
ufw disable
📌 UFW默认策略:初次启用UFW时,默认策略通常是"拒绝所有入站,允许所有出站",这符合最小权限原则。可以通过ufw default deny incoming和ufw default allow outgoing查看和修改默认策略。
2、显示防火墙状态
2.1、显示防火墙状态
ufw status
2.2、查看防火墙详细状态(包括规则编号、端口范围等)
ufw status verbose
ufw status numbered可以显示每条规则的序号,便于后续通过ufw delete [序号]删除特定规则,比直接写规则内容更快捷。
3、允许与阻止
3.1、增加一条表示允许的规则
ufw allow
3.2、允许通过 21 连接端口使用 tcp 和 udp 协议连线本机
ufw allow 21
若只允许TCP,则写作ufw allow 21/tcp;若同时需要TCP和UDP,可分别添加或使用ufw allow 21(默认同时支持两种协议)。
3.3、增加一条表示阻止的规则
ufw deny
阻止通过 21 连接端口使用 tcp 协议连线本机
ufw deny 21/tcp
3.4、增加一条表示拒绝的规则
ufw reject
UFW中的deny与reject区别:deny对应iptables的DROP(静默丢弃),reject对应REJECT(返回拒绝消息)。建议根据场景选择,道理与前面iptables部分一致。
4、以服务名称代表连接端口
可以采用
less /etc/services
UFW同样支持服务名称(如ssh、http、https),这些名称映射到/etc/services中的标准端口。使用服务名称可提高可读性,例如ufw allow ssh等效于ufw allow 22/tcp。此外,UFW支持更丰富的语法,比如限制特定IP访问:
- 允许192.168.1.10访问SSH:ufw allow from 192.168.1.10 to any port 22
- 拒绝整个IP段:ufw deny from 10.0.0.0/8UFW高级用法速览:
- 设置速率限制:ufw limit ssh(限制SSH连接频率,防暴力破解)
- 日志记录:ufw logging on(开启日志,默认记录被拒绝的包)
- 删除规则:ufw delete allow 80 或先ufw status numbered再ufw delete 3
- 重置所有规则:ufw reset(恢复出厂设置,谨慎使用)
- 启用IPV6:编辑/etc/default/ufw,设置IPV6=yes
五、三大工具综合对比与选型建议
| 对比维度 | iptables | firewalld | UFW |
|---|---|---|---|
| 学习成本 | 高(需理解表、链、状态、模块) | 中(区域概念需适应,但命令友好) | 低(极简语法,上手快) |
| 配置灵活性 | 极高(可操作所有netfilter特性) | 较高(覆盖大多数场景,富规则支持复杂逻辑) | 中(适合常规端口管理,复杂NAT需绕道) |
| 动态更新 | 否(修改后需重启服务,可能中断连接) | 是(无需重启,连接不断) | 是(无需重启) |
| 适用人群 | 资深运维、网络工程师 | 企业级服务器管理员 | 开发者、个人站长、新手 |
| 典型应用 | 复杂NAT、多出口策略路由、高级防攻击 | 多网卡安全分区、生产环境服务器 | 云主机基础防护、开发测试环境 |
| 规则持久化 | 手动保存到/etc/sysconfig/iptables | 自动写入XML(需--permanent) | 自动保存到/etc/ufw/user.rules |
选型专家建议
- 如果你维护的是大型数据中心或需要精细化的流量控制(如策略路由、多ISP负载均衡) → 选择iptables,它提供了最底层的控制能力。
- 如果你管理的是标准的Web服务器、数据库服务器,且运行RHEL/CentOS系 → 选择firewalld,利用区域特性可轻松隔离内外网,且动态更新不中断业务。
- 如果你在Ubuntu/Debian上搭建个人博客、小型应用,或刚接触Linux防火墙 → 选择UFW,5分钟就能上手,足够应对90%的日常需求。
- 无论选择哪个工具,务必记住:生产环境操作前先在测试环境验证,并确保有控制台备用访问通道。
六、未来趋势与思考
随着容器化(Docker/Kubernetes)和云原生架构的普及,传统的节点级防火墙管理正面临新的挑战和演进:
1. 云服务商内置防火墙:如AWS Security Group、阿里云安全组,它们工作在虚拟化层面,独立于操作系统,优先级高于OS内部防火墙。许多企业已不再在云主机内配置复杂规则,而是依赖云平台的安全组。
2. 网络策略即代码(Network Policy as Code) :在Kubernetes中,网络策略(NetworkPolicy)通过CNI插件(如Calico、Cilium)实现,使用YAML声明式配置,更契合DevOps工作流。
3. eBPF技术兴起:eBPF允许在Linux内核中运行沙箱程序,Cilium等项目利用eBPF实现更高效、更细粒度的网络观测和安全策略,未来可能部分替代传统netfilter+iptables组合。
4. 集中式防火墙管理平台:Ansible、Puppet等配置管理工具可以批量推送防火墙规则,减少人工登录每台服务器操作。
但无论技术如何演进,理解底层数据包流转原理(Netfilter钩子、路由决策、NAT)始终是网络排障和架构设计的基础。掌握iptables的核心思想,对理解其他任何防火墙工具都有事半功倍之效。
本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/anquan/9674.html
