Linux操作系统-防火墙 Linux 防火墙实战iptables 与 firewalld 全面解析引言“我的服务器怎么访问不了了”相信不少运维新手都经历过这样的时刻——应用服务正常运行端口也监听着但浏览器就是打不开。折腾半天最后试探性地执行了一条命令systemctl stop firewalld网页瞬间恢复访问。你顿时明白原来是防火墙在“搞鬼”。在 Linux 系统中防火墙是保障网络安全的第一道防线。而说到 Linux 防火墙绕不开两个名字iptables和firewalld。它们到底是什么关系有什么区别日常工作中该用哪个今天这篇文章就带你彻底搞明白。一、Netfilter一切防火墙的“地基”在讲 iptables 和 firewalld 之前有必要先认识一下Netfilter。Netfilter 是 Linux 内核中的一个框架它在网络协议栈的关键路径上设置了一系列“挂载点”钩子函数。当数据包经过这些挂载点时内核会依次调用挂载点上所有的钩子函数直到数据包的处理结果被明确为接受、拒绝或丢弃。iptables 和 firewalld 都不是真正的防火墙本身它们只是用来定义防火墙规则的管理工具。真正执行这些规则的是内核中的 Netfilter 框架。你可以这样理解Netfilter 内核里的“执行引擎”iptables / firewalld 用户用来下命令的“控制台”明确了这一点后面的内容就更好理解了。二、iptablesLinux 防火墙的“元老”2.1 核心架构表、链、规则iptables 采用“表Table-链Chain-规则Rule”三级结构来管理网络流量。四表Table表名作用filter默认表用于数据包过滤ACCEPT / DROP / REJECTnat网络地址转换SNAT / DNAT / MASQUERADE用于端口转发或共享上网mangle修改数据包头部如 TTL、TOS用于 QoS 或流量标记raw绕过 Netfilter 的连接跟踪提升性能五链Chain链名作用PREROUTING数据包进入路由决策之前INPUT过滤发往本机的流量FORWARD过滤经过本机转发的流量路由器场景OUTPUT过滤本机发出的流量POSTROUTING数据包离开网卡之前规则优先级raw mangle nat filterIptables的4表5链Iptables数据包转发流程数据包先经过PREOUTING由该链确定数据包走向目的地址是本地则发送到INPUT让INPUT决定是否接收下来送到用户空间流程为①—②若满足PREROUTING的nat表上的转发规则则发送给FORWARD然后再经过POSTROUTING发送出去流程为①—③—④—⑥主机发送数据包时流程则是⑤—⑥其中PREROUTING和POSTROUTING指的是数据包的流向如上图所示POSTROUTING指的是发往服务器发出的数据包而PREROUTING指的是来自服务器外部的数据包。2.2 iptable命令用法iptables的用法可以参考下图table:--t使用的表包括filter、nat、mangle、raw默认不指明是filter.command-A顺序添加添加一条新规则添加到末尾-I插入插入一条新规则-I后面加一数字表示插入到哪行-R修改 删除一条新规则-D后面加一数字表示删除哪行-D删除删除一条新规则-D后面加一数字表示删除哪行-N新建一个链-X删除一个自定义链,删除之前要保证次链是空的,而且没有被引用-L查看(1.iptables-L-n以数字的方式显示2. iptables-L-v显示详细信息3. iptables-L-x显示精确信息)-E重命名链-F清空链中的所有规则-Z清除链中使用的规则-P设置默认规则match:隐含匹配-ptcp udp icmp --sport指定源端口 --dport指定目标端-s源地址-d目的地址-i数据包进入的网卡-o数据包出口的网卡扩展匹配-mstate--state匹配状态的-mmutiport --source-port 端口匹配 ,指定一组端口-mlimit--limit3/minute 每三分种一次-mlimit --limit-burst5只匹配5个数据包-mstring--string--algobm|kmp --stringxxxx匹配字符串 -mtime--timestart8:00--timestop12:00 表示从哪个时间到哪个时间段 -mtime--days 表示那天-mmac --mac-source xx:xx:xx:xx:xx:xx 匹配源MAC地址-mlayer7--l7protoqq 表示匹配腾讯qq的 当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用-mlayer7 这个显示扩展匹配动作DROP 直接丢掉 ACCEPT 允许通过 REJECT 丢掉但是回复信息-jLOG --log-prefix说明信息,自己随便定义记录日志 SNAT 源地址转换 DNAT 目标地址转换 REDIRECT 重定向 MASQUERAED 地址伪装2.3 iptables常用命令iptables 的命令语法虽然有一定学习曲线但掌握核心的几个命令就足够应对日常工作了。查看规则# 查看所有链的规则默认 filter 表iptables-L# 查看特定链的规则带行号iptables-LINPUT-n--line-numbers# 查看 nat 表的规则iptables-tnat-L添加规则# 在 INPUT 链末尾追加规则允许 SSH端口22iptables-AINPUT-ptcp--dport22-jACCEPT# 在 INPUT 链首位插入规则禁止 ICMPpingiptables-IINPUT1-picmp-jDROP# 允许来自特定 IP 的访问iptables-AINPUT-s192.168.1.100-jACCEPT删除规则# 按行号删除先查看行号iptables-DINPUT1# 按内容删除iptables-DINPUT-ptcp--dport80-jACCEPT设置默认策略白名单模式# 默认拒绝所有入站流量iptables-PINPUT DROP# 再逐条开放必要服务iptables-AINPUT-ptcp--dport80-jACCEPT iptables-AINPUT-ptcp--dport443-jACCEPT保存与恢复规则# 保存当前规则iptables-save/etc/sysconfig/iptables# 恢复规则iptables-restore/etc/sysconfig/iptables2.3 高级应用NAT 与端口转发SNAT源地址转换让内网主机通过防火墙访问外网iptables-tnat-APOSTROUTING-oeth0-jMASQUERADEDNAT目的地址转换将外部请求转发到内网服务器iptables-tnat-APREROUTING-ptcp--dport80-jDNAT --to-destination192.168.1.100:802.4 连接状态跟踪提升性能的关键利用conntrack模块可以避免对已建立的连接重复匹配规则# 允许已建立的连接和相关连接通过iptables-AINPUT-mconntrack--ctstateESTABLISHED,RELATED-jACCEPT# 仅允许新的 SSH 连接iptables-AINPUT-mconntrack--ctstateNEW-ptcp--dport22-jACCEPT这样做的好处是一旦 SSH 连接建立成功后续的数据包直接放行不再逐条匹配规则大幅提升效率。三、firewalld更友好的“动态管家”3.1 设计理念区域 服务firewalld 是建立在 iptables 之上的动态防火墙管理工具提供了更高层次的抽象。它从 RHEL/CentOS 7 开始成为默认防火墙。firewalld 的核心优势在于支持运行时动态修改规则无需重启防火墙服务不会中断现有连接。核心概念概念说明区域Zone按信任级别划分的网络环境如public默认、trusted完全信任、block拒绝所有等服务Service预定义的端口和协议组合如http、ssh、mysql源地址Source基于 IP 或网段绑定特定区域富规则Rich Rule支持复杂条件IP、端口、协议、时间等的自定义规则3.2 常用命令firewalld 的核心管理工具是firewall-cmd。状态与区域管理# 查看防火墙状态firewall-cmd--state# 查看所有可用区域firewall-cmd --get-zones# 查看默认区域firewall-cmd --get-default-zone# 查看指定区域的详情firewall-cmd--zonepublic --list-all服务与端口管理# 添加服务到默认区域永久生效需加 --permanentfirewall-cmd --add-servicehttp--permanentfirewall-cmd --add-servicehttps--permanent# 开放端口firewall-cmd --add-port3306/tcp--permanent# 重新加载配置使永久规则生效firewall-cmd--reload# 查看已开放的服务和端口firewall-cmd --list-services firewall-cmd --list-ports关键区别不加--permanent的修改只对当前运行生效重启后丢失加了--permanent需要执行--reload才能生效。源地址控制# 允许特定子网访问firewall-cmd--zonepublic --add-source192.168.1.0/24 --add-servicessh--permanent# 拒绝特定 IPfirewall-cmd--zonepublic --add-rich-rulerule familyipv4 source address10.0.0.5 reject--permanent3.3 自定义服务如果应用使用非标准端口可以创建自定义服务文件!-- /etc/firewalld/services/custom_http.xml --?xml version1.0 encodingutf-8?serviceshortCustom HTTP/shortdescriptionCustom HTTP service on port 8080/descriptionportprotocoltcpport8080//servicefirewall-cmd--reloadfirewall-cmd --add-servicecustom_http--permanent3.4 富规则与端口转发富规则支持更复杂的条件控制# 允许特定 IP 访问特定端口仅在工作时间firewall-cmd --add-rich-rulerule familyipv4 source address192.168.1.100 port port8080 protocoltcp accept--permanent端口转发# 开启伪装端口转发的前提firewall-cmd --add-masquerade--permanent# 将本机 8080 端口转发到 80 端口firewall-cmd --add-forward-portport8080:prototcp:toport80--permanent四、iptables vs firewalld一张表看懂区别对比维度iptablesfirewalld定位底层、精细控制的防火墙工具高层、易用的动态管理工具配置模型基于“链规则”的底层模型基于“区域服务”的高层抽象规则更新修改后需全部刷新可能中断连接动态更新不中断现有连接学习曲线较陡峭需理解表、链、匹配条件更友好通过“区域”概念简化配置配置文件/etc/sysconfig/iptables/usr/lib/firewalld/和/etc/firewalld/默认策略默认允许所有需要拒绝的才限制默认拒绝所有传入流量图形界面无有firewall-config后端支持直接操作 netfilter可使用 iptables 或 nftables 后端适用场景精细控制、复杂规则、脚本化部署快速配置、日常运维、云环境一句话总结iptables 是“乐高”——什么都能搭但需要自己动手firewalld 是“精装房”——拎包入住省心省力。五、实战两个工具解决同一个需求假设我们要完成一个常见任务开放 Web 服务80 和 443 端口并允许 SSH 管理22 端口其余入站流量全部拒绝。用 iptables 实现# 1. 设置默认策略拒绝所有入站iptables-PINPUT DROP iptables-PFORWARD DROP# 2. 允许已建立的连接iptables-AINPUT-mconntrack--ctstateESTABLISHED,RELATED-jACCEPT# 3. 开放必要端口iptables-AINPUT-ptcp--dport22-jACCEPT iptables-AINPUT-ptcp--dport80-jACCEPT iptables-AINPUT-ptcp--dport443-jACCEPT# 4. 允许本地回环iptables-AINPUT-ilo-jACCEPT# 5. 保存规则iptables-save/etc/sysconfig/iptables用 firewalld 实现# 1. 确保默认区域是 public默认拒绝入站firewall-cmd --get-default-zone# 应该是 public# 2. 添加服务firewall-cmd --add-servicessh--permanentfirewall-cmd --add-servicehttp--permanentfirewall-cmd --add-servicehttps--permanent# 3. 重新加载生效firewall-cmd--reload# 4. 验证firewall-cmd --list-services对比一下firewalld 只需要 4 条命令而 iptables 需要 6 条命令加一个保存操作。对于日常运维场景firewalld 的简洁性显而易见。六、常见问题与排错指南Q1firewalld 和 iptables 能同时用吗不建议同时启用。两者都操作同一套 netfilter 规则同时启用可能导致规则冲突。如果启用了 firewalld建议禁用 iptables 服务systemctl stop iptables systemctl disable iptables systemctlenable--nowfirewalldQ2修改了 firewalld 规则为什么不生效检查两个地方是否加了--permanent但没有执行--reload是否修改了正确的区域--zone参数Q3iptables 规则重启后消失了iptables 规则默认是临时的需要手动保存# CentOS/RHELserviceiptables save# 通用方法iptables-save/etc/sysconfig/iptablesQ4服务启动失败怎么排查服务启动失败可以参考如下步骤排查# 1. 查看防火墙状态systemctl status firewalld firewall-cmd--state# 2. 查看当前规则firewall-cmd --list-all iptables-L-n-v# 3. 临时关闭防火墙测试仅用于排查systemctl stop firewalld# 如果关闭后服务正常说明是防火墙规则问题# 4. 查看selinux状态getenforceQ5找不到iptables服务,报错Unit iptables.service could not be found.Centos7以后默认没有安装iptables服务需要通过yuminstall-yiptables-services之后就可以通过systemctl管理iptables服务了七、iptables和firewalld到底应该选哪一个什么时候用 firewalld大多数现代 Linux 系统CentOS 7、RHEL、Fedora日常服务器运维、快速配置端口和服务需要动态调整防火墙策略的场景如云环境运维新手或不想花太多时间研究防火墙细节的人什么时候用 iptables需要极致精细的流量控制复杂的 NAT 和路由策略嵌入式系统或资源受限的环境维护已有的大量 iptables 脚本一句话建议对于绝大多数新建 Linux 服务器优先使用 firewalld只有在 firewalld 无法满足的复杂场景下才考虑降级到 iptables。对于一些较老的服务器iptables用得较多一些比较资深的运维人员也比较习惯使用iptables作为linux的防火墙。总结从 iptables 到 firewalldLinux 防火墙管理走过了一条从“底层精细”到“高层易用”的演进之路。两者都基于 Netfilter 框架但设计理念截然不同iptables是“工匠型”工具——强大、灵活但需要你亲手搭建每一块砖。firewalld是“管家型”工具——开箱即用日常运维省心省力。记住三句话Netfilter 是内核的执行引擎iptables 和 firewalld 只是管理工具不要搞混。默认策略决定安全基调iptables 默认允许firewalld 默认拒绝——理解这一点很多问题迎刃而解。生产环境优先用 firewalld复杂场景再用 iptables 补充。防火墙是服务器的“守门人”配置得当能挡住绝大部分恶意流量配置失误也可能把自己挡在门外。希望这篇文章能帮你建立起清晰的防火墙管理思路下次再遇到“服务访问不了”的问题能快速定位是防火墙在“搞鬼”还是真的程序出了 bug。如果你有任何问题或经验分享欢迎在评论区留言讨论