1. 首页 > 服务器安全

如何选择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防火墙的处理过程如下图

netfilter的体系结构

📌 补充说明:上图展示了数据包从网卡进入、经过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的防火墙堆栈

firewalld防火墙工具

📊 防火墙管理工具横向对比
| 特性 | 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

2.1、图形化界面NetworkManager

在NetworkManager连接编辑器中,可以在"常规"选项卡下设置"防火墙区域",将某个网卡绑定到特定区域,实现接口级隔离。

2.2、图形化界面firewall-config

终端执行:firewall-config

2.2、图形化界面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验证规则是否加载成功。

配置文件新增规则_图2

四、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/8

 UFW高级用法速览
- 设置速率限制: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

五、三大工具综合对比与选型建议

对比维度iptablesfirewalldUFW
学习成本高(需理解表、链、状态、模块)中(区域概念需适应,但命令友好)低(极简语法,上手快)
配置灵活性极高(可操作所有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

联系我们

在线咨询:点击这里给我发消息

Q Q:2220678578