一、firewalld 与 direct.xml 的基础认知

在 Linux 系统的网络安全领域,firewalld 可谓是中流砥柱般的存在,它是 CentOS 7 及后续版本、Fedora 等系统默认的防火墙管理工具 ,取代了之前的 iptables 防火墙。firewalld 工作在网络层,属于包过滤防火墙,通过定义一组防火墙规则来控制主机上的进入流量。它的强大之处在于提供了支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理功能,支持 IPv4、IPv6 防火墙设置以及以太网桥,这使得它能在各种复杂的网络环境中发挥关键作用。
而 /etc/firewalld/direct.xml 文件,在 firewalld 的庞大配置体系里占据着举足轻重的地位。firewalld 的配置文件大多以 xml 格式存储,/etc/firewalld/direct.xml 便是其中之一,它主要用于存储用户自定义的直接规则(direct rules)。这些直接规则能够让用户以更底层、更直接的方式操控防火墙,突破常规配置的限制,实现一些复杂且个性化的网络访问控制需求。
二、direct.xml 的文件结构探秘

direct.xml 文件采用标准的 XML 结构,其顶层标签为<direct> ,所有的直接规则相关配置都包含在这个标签内部。在<direct>标签下,主要包含<chain>和<rule>这两种关键标签,它们各司其职,共同构建起灵活且强大的防火墙规则体系。
<chain>标签用于定义自定义链,通过这个标签,用户可以创建出符合特定需求的链,满足复杂网络场景下的多样化过滤需求。例如:
<chain table="raw" ipv="ipv4" chain="blacklist"/>
上述代码定义了一个名为 “blacklist” 的自定义链,它基于 IPv4 协议,隶属于 “raw” 表。其中,“table” 属性指定了链所属的 iptables 表,常见的有 “filter”(过滤表)、“nat”(网络地址转换表)、“mangle”(修改数据标记位表)、“raw”(关闭连接跟踪机制表)和 “security”(强制访问控制表) ;“ipv” 属性明确了 IP 版本,支持 “ipv4” 和 “ipv6” ;“chain” 属性则赋予了自定义链一个独一无二的名称。
<rule>标签用于定义具体的防火墙规则,这些规则是实现网络访问控制的核心指令。一个<rule>标签内可以包含多个属性,用于精准地描述规则的匹配条件和执行动作,就像为防火墙制定了一套细致入微的行为准则。比如:
<rule priority="0" table="raw" ipv="ipv4" chain="PREROUTING">
-s 192.168.10.0/24 -j blacklist
</rule>
这段代码展示了一个典型的<rule>标签配置。“priority” 属性表示规则的优先级,数值越小优先级越高,就如同在众多规则中给这条规则设定了一个执行顺序的 “特权” ;“table”“ipv”“chain” 属性与<chain>标签中的对应属性含义一致,这里 “chain” 指定为 “PREROUTING”,表示该规则作用于数据包进入主机时的路由前阶段;标签内部的 “-s
192.168.10.0/24 -j blacklist” 则是具体的 iptables 规则内容,它表示将源 IP 地址为
192.168.10.0/24 网段的数据包跳转到名为 “blacklist” 的链进行后续处理,“-s” 用于指定源 IP 地址,“-j” 用于指定执行的动作 。
再看一个更复杂的示例,假设要拒绝特定 IP 地址通过 TCP 协议访问本机的 22 端口,在 direct.xml 中可以这样定义规则:
<rule ipv="ipv4" table="filter" chain="INPUT" priority="1">
-p tcp --dport 22 -s 192.168.1.100 -j REJECT
</rule>
在这个例子中,“-p tcp” 指定协议为 TCP ,“--dport 22” 指定目标端口为 22 ,“-s
192.168.1.100” 指定源 IP 为
192.168.1.100 ,“-j REJECT” 表示匹配到该规则的数据包将被拒绝。通过这样的方式,利用<rule>标签的各种属性和 iptables 规则语法,能够实现对网络访问的精细控制,满足不同场景下的安全需求。
三、direct.xml 配置实践
允许特定 IP 访问特定端口
在实际的网络环境中,经常会遇到需要允许特定 IP 地址访问服务器特定端口的情况,比如只允许公司内部的某个 IP 地址访问服务器的 Web 服务端口 80。利用 direct.xml 可以轻松实现这一需求。
- 编辑 direct.xml 文件:使用文本编辑器,如 vim,打开 direct.xml 文件,命令如下:
sudo vim /etc/firewalld/direct.xml
- 添加规则:在<direct>标签内添加如下规则:
<rule ipv="ipv4" table="filter" chain="INPUT" priority="1">
-p tcp --dport 80 -s 192.168.1.100 -j ACCEPT
</rule>
这条规则表示允许源 IP 地址为
192.168.1.100 的设备通过 TCP 协议访问本机的 80 端口。其中,“-p tcp” 指定协议为 TCP ,“--dport 80” 指定目标端口为 80 ,“-s
192.168.1.100” 指定源 IP 为
192.168.1.100 ,“-j ACCEPT” 表示匹配到该规则的数据包将被接受。
- 保存并退出:完成规则添加后,保存并退出编辑器。在 vim 中,按下 “Esc” 键,输入 “:wq” 并回车即可。
- 使配置生效:重新加载 firewalld 配置,使刚刚添加的规则生效,执行命令:
sudo firewall-cmd --reload
设置端口转发
端口转发在很多场景下都非常实用,比如将服务器的某个外部端口映射到内部服务器的不同端口,实现隐藏内部服务器真实端口的目的,同时也方便进行流量管理和安全防护。下面以将本机 8080 端口的流量转发至本机 80 端口为例进行配置。
- 确保开启 IP 伪装:端口转发需要开启 IP 伪装功能,使用以下命令开启:
sudo firewall-cmd --zone=public --add-masquerade
- 编辑 direct.xml 文件:打开 direct.xml 文件:
sudo vim /etc/firewalld/direct.xml
- 添加端口转发规则:在<direct>标签内添加如下规则:
<rule ipv="ipv4" table="nat" chain="PREROUTING" priority="1">
-p tcp --dport 8080 -j REDIRECT --to-ports 80
</rule>
这条规则作用于 “nat” 表的 “PREROUTING” 链,它表示当有 TCP 协议的数据包到达本机的 8080 端口时,将其重定向到本机的 80 端口。“-p tcp” 指定协议为 TCP ,“--dport 8080” 指定目标端口为 8080 ,“-j REDIRECT --to-ports 80” 表示将数据包重定向到 80 端口。
- 保存并退出:完成规则添加后,保存并退出编辑器。
- 使配置生效:重新加载 firewalld 配置:
sudo firewall-cmd --reload
通过以上配置实践,利用 direct.xml 文件对 firewalld 进行灵活配置,能够满足各种复杂的网络访问控制和端口转发需求,为服务器的网络安全和高效运行提供有力保障 。在实际操作中,根据具体的网络场景和安全需求,合理调整和扩展这些规则,能够进一步提升网络的安全性和稳定性。
四、direct.xml 与其他配置的关联
direct.xml 在 firewalld 的配置体系中并非孤立存在,它与其他配置文件紧密协作,共同构建起一个完整且高效的防火墙配置系统,就像一台精密机器中的各个零部件,各自发挥作用又相互配合。
在众多关联配置文件中,区域配置文件(位于 /etc/firewalld/zones/ 目录下)与 direct.xml 的关系尤为密切。区域配置文件定义了不同的网络区域,每个区域都有其特定的访问规则和安全策略 ,比如 public 区域用于公共网络,默认只允许部分选定的传入连接;trusted 区域则接受所有的数据包。这些区域配置就像是为不同安全等级的网络流量规划了不同的 “通道” 和 “规则”。而 direct.xml 中的直接规则,可以看作是对这些区域规则的一种补充和细化,能够在特定区域内实现更个性化、更底层的控制。
举个例子,假设在 public 区域配置文件中,已经允许了 HTTP 服务(端口 80)的访问,这是一种常规的区域规则配置。但如果此时想要对来自某个特定 IP 地址段的 HTTP 访问进行更严格的限制,比如限制其访问频率,就可以在 direct.xml 中针对 public 区域添加相应的直接规则。在 direct.xml 中添加类似如下规则:
<rule ipv="ipv4" table="filter" chain="INPUT" priority="1" zone="public">
-s 192.168.2.0/24 -p tcp --dport 80 -m recent --set --name HTTP_LIMIT --rsource
-s 192.168.2.0/24 -p tcp --dport 80 -m recent --update --seconds 60 --hitcount 10 --name HTTP_LIMIT --rsource -j DROP
</rule>
这段规则的含义是,对于来自
192.168.2.0/24 网段、访问 80 端口的 TCP 流量,使用 “recent” 模块进行跟踪。首先使用 “--set” 选项将其记录到名为 “HTTP_LIMIT” 的跟踪列表中;然后使用 “--update” 选项检查该网段在 60 秒内的访问次数,如果超过 10 次,就将其数据包丢弃(“-j DROP”)。通过这样的方式,direct.xml 中的规则与 public 区域配置文件中的规则协同工作,在保证 public 区域基本 HTTP 服务访问的基础上,对特定来源的访问进行了更精细的控制。
再比如,在配置端口转发时,direct.xml 中的端口转发规则需要与区域配置中的 IP 伪装设置相互配合。如前文提到的将本机 8080 端口的流量转发至本机 80 端口的配置,在 direct.xml 中添加了端口转发规则后,还需要在区域配置中开启 IP 伪装,命令如下:
sudo firewall-cmd --zone=public --add-masquerade
只有这样,端口转发才能正常生效,否则数据包在转发过程中可能会因为缺少必要的地址转换而无法正确传输。这充分体现了 direct.xml 与区域配置在实现复杂网络功能时的紧密关联性和相互依赖性。
在配置 direct.xml 与其他配置协同工作时,需要注意一些关键事项。首先,规则的优先级设置非常重要。direct.xml 中的规则优先级与其他配置中的规则优先级可能会相互影响,因此要确保规则的执行顺序符合预期。一般来说,direct.xml 中的规则优先级可以通过 “priority” 属性进行设置,数值越小优先级越高。在设置时,要综合考虑其他配置文件中的规则优先级,避免出现规则冲突或覆盖不当的情况。
其次,在修改 direct.xml 或其他配置文件后,一定要记得重新加载 firewalld 配置,使修改生效。如前文所述,使用 “sudo firewall-cmd --reload” 命令来重新加载配置,但要注意,该命令会重新应用所有的防火墙规则,可能会对正在运行的网络服务产生短暂影响,因此建议在业务低峰期进行操作。
此外,在配置过程中,要充分理解各个配置文件的作用和规则语法,确保配置的准确性和合理性。对于复杂的网络场景,可能需要多次测试和调整配置,以达到最佳的安全和性能平衡。例如,在同时配置 direct.xml 和区域配置文件时,要仔细检查每个区域的规则是否与 direct.xml 中的规则相互冲突,确保整个防火墙配置系统的一致性和稳定性。
五、常见问题与解决之道
在使用 direct.xml 进行配置的过程中,难免会遇到各种各样的问题,这些问题可能会影响防火墙的正常运行,甚至导致网络访问异常。下面我们来看看一些常见问题及对应的解决方法。
配置错误导致防火墙无法启动
这是一个较为常见的问题,当 direct.xml 中的配置存在语法错误或逻辑错误时,可能会导致 firewalld 无法正常启动。比如在规则中使用了错误的参数、标签不匹配或者规则顺序错误等。
假设在 direct.xml 中添加了如下错误的规则:
<rule ipv="ipv4" table="filter" chain="INPUT" priority="1">
-p tcp --dport 80 -s 192.168.1.100 -j ACCEPTT <!-- 这里ACCEPTT拼写错误,应为ACCEPT -->
</rule>
当尝试重新加载 firewalld 配置时,就会出现错误提示,导致防火墙无法启动。解决这类问题的关键在于仔细检查配置文件,找出错误所在。可以使用文本编辑器的语法检查功能(如果支持的话),也可以参考 iptables 的官方文档,确保规则语法正确。对于上述例子,只需将 “ACCEPTT” 修正为 “ACCEPT” 即可。
规则冲突导致访问异常
在 direct.xml 中添加的规则可能会与其他配置文件中的规则发生冲突,从而导致网络访问出现异常。比如在 direct.xml 中添加了允许某个 IP 地址访问特定端口的规则,但在区域配置文件中又设置了禁止该 IP 地址访问的规则,这样就会产生冲突。
假设在 direct.xml 中添加了如下规则:
<rule ipv="ipv4" table="filter" chain="INPUT" priority="1">
-p tcp --dport 80 -s 192.168.1.100 -j ACCEPT
</rule>
而在 public 区域配置文件中存在如下规则:
<rule family="ipv4" source address="192.168.1.100" reject />
这样就会导致
192.168.1.100 这个 IP 地址无法访问 80 端口。解决规则冲突问题,需要对整个防火墙配置体系有清晰的了解,明确各个配置文件中规则的优先级和作用范围。在这种情况下,可以根据实际需求,调整 direct.xml 或区域配置文件中的规则,确保规则之间的一致性。如果希望
192.168.1.100 能够访问 80 端口,就需要删除或修改区域配置文件中的拒绝规则。
配置生效问题
有时候,在修改 direct.xml 文件并重新加载 firewalld 配置后,发现配置并没有生效。这可能是由于缓存问题或者配置文件没有正确保存导致的。
首先,确保在修改 direct.xml 文件后,正确保存了文件。在使用文本编辑器时,要注意保存操作是否成功,避免因为误操作导致修改未保存。其次,firewalld 可能会有缓存机制,即使重新加载配置,也可能不会立即生效。可以尝试使用 “sudo firewall-cmd --complete-reload” 命令来彻底重新加载 firewalld 配置,该命令会清除缓存并重新读取所有配置文件,确保配置生效。
在排查问题时,可以使用 “sudo firewall-cmd --direct --get-all-rules” 命令来查看当前 direct.xml 中配置的规则是否正确加载,以及 “sudo firewall-cmd --list-all” 命令来查看整个防火墙的配置状态,包括各个区域的规则,通过对比分析来找出问题所在。同时,查看 firewalld 的日志文件(通常位于 /var/log/firewalld/ 目录下)也能获取更多关于配置和运行状态的信息,有助于快速定位和解决问题 。
六、总结与展望
在 Linux 系统的防火墙体系中,/etc/firewalld/direct.xml 文件是实现复杂网络访问控制的关键所在。它允许用户通过自定义的直接规则,突破常规配置的限制,实现对网络流量的精准把控。无论是允许特定 IP 访问特定端口,还是设置端口转发,direct.xml 都提供了灵活且强大的配置方式。
通过对 direct.xml 文件结构的深入了解,我们掌握了<chain>和<rule>等关键标签的使用方法,能够根据实际需求构建出个性化的防火墙规则。在配置实践中,我们学会了如何利用这些规则实现具体的网络安全需求,并了解了 direct.xml 与其他配置文件的紧密关联,明白了它们是如何协同工作,共同保障网络安全的。
尽管在使用 direct.xml 时可能会遇到一些问题,但只要我们掌握了正确的排查和解决方法,如仔细检查配置错误、解决规则冲突以及确保配置生效等,就能充分发挥其强大功能。在未来,随着网络技术的不断发展,防火墙配置技术也将持续演进。我们有理由期待更加智能化、自动化的防火墙配置工具的出现,它们将能够根据网络环境的变化自动调整规则,提供更高效、更可靠的网络安全防护。同时,direct.xml 也可能会不断优化和完善,以适应日益复杂的网络安全需求。希望大家在今后的网络管理工作中,能够充分利用 direct.xml 的优势,为自己的网络环境构筑起坚固的安全防线。
墨者安全 防护盾
墨者安全作为专业级别安全防护专家,在应对 Webshell 风险隐患方面展现出了卓越的能力。其拥有全面的检测机制,能够精准识别 Webshell 的各种类型和变体,无论是复杂的大马,还是隐蔽的内存马,都难逃其敏锐的监测。
墨者安全防护盾具备强大的实时监控功能,对服务器的各项活动进行 7*24 小时不间断的监视。一旦发现任何可疑的 Webshell 活动迹象,立即发出警报,并迅速采取隔离和清除措施,将风险扼杀在萌芽状态。
在防护策略上,墨者安全防护盾采用了多层次的防御体系。不仅能够在网络层面阻挡外部的恶意访问和攻击,还能深入系统内部,对服务器的文件系统、进程等进行深度检查和保护,确保 Webshell 无法植入和运行。
同时,墨者安全防护盾拥有快速的应急响应能力。当 Webshell 攻击事件发生时,专业的安全团队能够迅速介入,进行深入的分析和处理,最大程度减少攻击带来的损失,并帮助用户快速恢复服务器的正常运行。
墨者安全防护盾还注重用户教育和培训,为用户提供关于 Webshell 防范的专业知识和最佳实践,帮助用户提升自身的安全意识和防范能力,共同构建坚实的网络安全防线。