一、概述
- 防火墙的作用
在 Linux 系统中,防火墙用于控制进出系统的网络流量,基于预定义的安全规则允许或拒绝数据包,从而保护系统免受未经授权的访问、恶意攻击,并确保网络服务的安全运行。
二、常见的 Linux 防火墙软件
-
iptables
- 基本介绍:是 Linux 内核中集成的一款经典的防火墙软件,基于 Netfilter 框架工作。它通过定义规则链( Chains)和规则(Rules)来实现对网络流量的过滤。
- 规则链类型:包括 INPUT(处理进入本机的数据包)、OUTPUT(处理本机发出的数据包)、FORWARD(处理经过本机转发的数据包,常用于路由器等有转发功能的设备)等。例如,若要阻止某个 IP 地址访问本机的 SSH 服务,可以在 INPUT 链添加规则。
- 规则操作:可以对符合条件的数据包执行 ACCEPT(允许通过)、DROP(直接丢弃,不回应)、REJECT(拒绝,向源端发送错误信息)等操作。
- 表(Tables)的概念:iptables 有不同的表,如 filter 表(用于过滤数据包,是最常用的表,主要涉及 INPUT、OUTPUT、FORWARD 链)、nat 表(用于网络地址转换,如端口转发、源地址伪装等)、mangle 表(用于修改数据包的某些标志位等)。
-
firewalld
- 基本介绍:是 CentOS 等 Linux 发行版中新一代的防火墙管理工具,它提供了动态管理防火墙规则的功能,支持区域(Zones)的概念。
- 区域概念:不同的区域有不同的默认安全级别和策略。例如,public 区域通常用于公共网络环境,默认拒绝大多数传入连接;trusted 区域则允许所有的网络连接。可以根据网络接口所处的环境将其分配到不同的区域。
- 动态管理:相比 iptables,firewalld 可以在不重启防火墙服务的情况下动态地修改规则和区域设置,更适合于需要频繁更改防火墙策略的场景,如在服务器运行过程中临时开放某个端口用于调试。
iptables和firewalld对比:
-
firewalld可以动态修改单条规则,不需要像iptables那样,修改规则后必须全部刷新才可生效
-
firewalld默认动作是拒绝,则每个服务都需要去设置才能放行,而iptables里默认是每个服务是允许,需要拒绝的才去限制
-
iptables防火墙类型为静态防火墙firewalld 防火墙类型为动态防火墙
-
firewalld和iptables一样自身并不具备防火墙功能,它们的作用都是用于维护规则,而真正使用规则干活的是内核防火墙模块
-
firewalld 加入了区域(zone)概念
三、iptables 知识点
-
规则的基本组成部分
- 匹配条件:包括源 IP 地址、目的 IP 地址、端口号、协议类型(如 TCP、UDP、ICMP)等。例如,可以设置规则只允许来自特定网段(如 192.168.1.0/24)的 TCP 协议数据包通过某个端口。
- 目标动作:如上述提到的 ACCEPT、DROP、REJECT 等。
-
命令语法示例
- 查看规则:
iptables -L
(列出当前的 iptables 规则,默认查看 filter 表的规则),可以添加-n
参数以数字形式显示 IP 地址和端口号,添加-v
参数查看更详细的规则信息,如数据包和字节计数器。 - 添加规则:
iptables -A INPUT -s 192.168.1.100 -j DROP
,此规则在 INPUT 链中添加一条拒绝来自 192.168.1.100 地址数据包的规则。 - 删除规则:
iptables -D INPUT 1
(删除 INPUT 链中的第一条规则,需要谨慎使用,因为删除错误可能导致意外的安全漏洞)。 - 修改规则:
iptables -R INPUT 1 -s 192.168.1.200 -j ACCEPT
(将 INPUT 链中的第一条规则修改为接受来自 192.168.1.200 的数据包)。
- 查看规则:
-
保存和恢复规则
在基于 iptables 的系统中,由于 iptables 规则在内存中,重启系统后会丢失。可以使用iptables - save > /etc/sysconfig/iptables
将当前规则保存到文件中,在系统启动时,可以通过iptables - restore < /etc/sysconfig/iptables
来恢复规则。
四、firewalld 知识点
-
区域操作
- 查看区域信息:
firewall - cmd -- get - zones
(列出所有可用的区域),firewall - cmd -- get - active - zones
(查看当前正在使用的区域及其关联的网络接口)。 - 设置区域:
firewall - cmd -- set - zone = home -- add - interface = eth0
(将 eth0 接口设置到 home 区域)。
- 查看区域信息:
-
端口和服务管理
- 开放端口:
firewall - cmd -- zone = public -- add - port = 8080/tcp -- permanent
(在 public 区域永久开放 TCP 端口 8080,-- permanent
参数表示规则在防火墙重启后仍然有效,若不添加此参数,规则仅在当前会话有效)。 - 开放服务:
firewall - cmd -- zone = public -- add - service = http -- permanent
(在 public 区域永久添加 HTTP 服务,firewalld 预定义了许多常见的服务,通过服务名来管理比直接管理端口更方便和安全,因为服务名对应的端口可能会因软件版本等因素变化)。
- 开放端口:
-
重新加载和重启 firewalld
- 重新加载规则:
firewall - cmd -- reload
(重新加载防火墙规则,使新添加或修改的规则生效,不会中断已建立的连接)。 - 重启服务:
systemctl restart firewalld
(完全重启 firewalld 服务,会中断所有连接)。
- 重新加载规则:
五、防火墙策略规划与安全考虑
- 最小化原则
只开放系统运行所需的网络服务和端口,关闭不必要的端口和服务,减少系统的攻击面。例如,对于一个只运行 Web 服务的服务器,只需要开放 80(HTTP)或 443(HTTPS)端口以及相关的管理端口(如果有)。 - 分层防御
防火墙只是安全防护的一部分,应与其他安全措施(如 SELinux、入侵检测系统等)结合使用,构建多层次的安全防护体系。例如,即使防火墙允许了某个连接,SELinux 仍可以根据其安全策略限制该连接对系统资源的访问。 - 定期审查和更新
随着系统服务的变化和网络威胁的演变,需要定期审查和更新防火墙策略。例如,当安装了新的网络服务或发现新的安全漏洞时,及时调整防火墙规则。