6.1 防火墙

6.1 防火墙 #

6.1.1 分类 #

软件防火墙和硬件防火墙是两种常见的网络安全设备或软件,用于保护计算机系统和网络免受未授权访问、恶意攻击和网络威胁等。

  1. 软件防火墙(Software Firewall):

软件防火墙是一种安装在计算机系统上的软件应用程序,用于监控和控制网络流量。它可以通过检查网络数据包的来源、目的地、协议和端口等信息,来判断是否允许或阻止数据包的传输。软件防火墙通常运行在操作系统的网络协议栈之上,能够保护单个计算机系统或网络中的特定主机。常见的软件防火墙包括Windows防火墙、IPTables、NetFilter等。

  1. 硬件防火墙(Hardware Firewall):

硬件防火墙是一种独立的物理设备,专门用于网络安全防护。它通常部署在网络的边界位置,作为网络流量的第一道防线。硬件防火墙通过硬件和专用的嵌入式软件来执行数据包过滤和访问控制。它可以监控和检测网络流量,并根据预先定义的规则和策略来允许或阻止数据包的传输。硬件防火墙通常具有更高的性能和吞吐量,并且对于整个网络中的所有主机都提供保护。常见的硬件防火墙包括 Cisco ASA、Palo Alto Networks、Fortinet 等。

包过滤防火墙(Packet Filtering Firewall)和应用层防火墙(Application Layer Firewall)是防火墙的两种不同类型:

  1. 包过滤防火墙:

包过滤防火墙是一种基于网络数据包的源地址、目的地址、端口号和协议等信息进行过滤和控制的防火墙。它工作在网络协议栈的较低层,可以根据预定义的规则,对数据包进行简单的检查和处理。包过滤防火墙通常比较高效,并且适用于处理大量数据包的情况。但它的检查范围相对较窄,仅能检查和过滤网络层(IP层)和传输层(TCP/UDP层)的信息。

  1. 应用层防火墙:

应用层防火墙是一种工作在网络协议栈较高层的防火墙,它能够检查和过滤网络流量中的应用层数据,如 HTTP、FTP、SMTP 等协议的内容。应用层防火墙能够深入检查数据包的有效载荷,根据应用层协议的特征和规则来判断和阻止恶意行为。它提供了更高级的安全功能,如访问控制、应用程序识别、反病毒扫描、入侵检测等。然而,相对于包过滤防火墙,应用层防火墙的处理开销较大,对性能有一定的影响。

综上,软件防火墙和硬件防火墙是不同类型的防火墙设备或软件,而包过滤防火墙和应用层防火墙是防火墙的两种不同功能和层次的分类。它们的选择和使用取决于网络环境、安全需求和性能要求。

iptables #

iptables 是一个软件防火墙,而不是硬件防火墙,提供了对 Linux 内核网络层的访问控制和数据包过滤的功能。

iptables 可以通过定义规则集来控制传入、传出和转发的网络流量。这些规则可以基于源 IP 地址、目标 IP 地址、协议、端口号等条件进行过滤和操作。使用 iptables 可以实现诸如网络地址转换(NAT)、端口转发、数据包屏蔽、阻止 DoS(拒绝服务)攻击等功能。

iptables 的工作方式是通过配置 iptables 规则表来匹配和处理网络数据包。常见的 iptables 规则表包括 filter 表(用于过滤数据包)、nat 表(用于网络地址转换)和 mangle 表(用于特殊处理数据包)。管理员可以使用命令行界面(CLI)或脚本来配置和管理 iptables。

尽管 iptables 是一个软件防火墙,但它在 Linux 系统中可以与硬件防火墙配合使用。在网络架构中,可以将 Linux 服务器作为边界设备放置在硬件防火墙之后,并使用 iptables 来增强安全性和网络流量控制。这种组合的优势是,硬件防火墙负责网络的第一道防线,而 iptables 在服务器本身提供了更细粒度的流量控制和策略定制能力。

CentOS 6 默认的防火墙是 iptables。CentOS 7 默认的防火墙是 firewallD(底层使用 netfilter)。

6.1.2 iptables 表和链 #

规则表有 filter,nat,mangle,raw。

规则链:

  • INPUT OUTPUT FORWARD
  • PREROUTING(路由前转换) POSTROUTING(路由后转换)

filter #

iptables -t filter 命令 规则链 规则

常见的命令有:

命令 说明
-L 用于列出当前 iptables 规则集的信息,包括不同表中的规则和链的状态
-A 用于向指定链(如 INPUT、OUTPUT、FORWARD)添加规则,插入到最后。-A 后面通常跟着链名和规则的具体内容
-I 用于在指定链中插入规则,在最开始插入。-I 后面通常跟着链名、位置和规则的具体内容。
-D 用于删除指定链中的规则。-D 后面通常跟着链名和要删除的规则的具体内容。
-F 用于清除指定链中的所有规则,将链重置为空。-F 后面通常跟着链名,如果不加链名就是清楚所有自定义规则。
-P 用于设置指定链的默认策略。-P 后面通常跟着链名和策略(ACCEPT、DROP、REJECT 等)。
-N 用于创建一个新的用户定义链,以便将规则归类和组织。-N 后面通常跟着链名。
-X 用于删除一个用户定义链,如果该链不再需要。-X 后面通常跟着链名。
-E 用于对用户定义链进行重命名。-E 后面通常跟着原始链名和新链名。

iptables -vnL 命令是省略了 filter 表的命令。命令将显示所有表的规则列表,包括详细信息和禁用反向解析。

具体选项的含义如下:

  • -v:显示详细信息,包括规则的计数器和数据包/字节的计数。
  • -n:禁止对 IP 地址和端口进行反向解析,以避免 DNS 查询延迟。
  • -L:显示所有表(filter、nat、mangle、raw、security)的规则列表。

对于只显示 filter 表规则列表的命令,应使用 iptables -vnx -L。其中的 -x 选项用于显示精确的数据包/字节计数,而不使用单位扩展。


-A -I 区别

可以看到 -A 和 -I 唯一的区别就是添加的顺序,-I 插入到第一条。

-P 修改默认规则

默认规则(Default Policy)用于定义当数据包不匹配任何规则时应采取的动作。默认规则通常应用于各个链(如 INPUT、OUTPUT、FORWARD 等),并在规则列表的末尾指定。

以下是 iptables 中默认规则的常见取值:

ACCEPT:接受数据包。如果数据包不匹配任何规则,则允许数据包通过。

DROP:丢弃数据包。如果数据包不匹配任何规则,则直接丢弃数据包,不给予任何响应。

REJECT:拒绝数据包,并发送拒绝消息给发送者。如果数据包不匹配任何规则,则向发送者发送拒绝响应。

RETURN:返回到调用链中的上一级。用于在子链中执行完操作后,将控制权返回给上级链。

默认情况下,iptables 中的默认规则通常设置为 ACCEPT。这意味着如果数据包不匹配任何规则,它将被默认接受。

要更改默认规则,可以使用 -P 选项。以下是一个更改默认规则的示例命令:

iptables -P INPUT DROP

上述命令将更改 INPUT 链的默认规则为 DROP,即数据包不匹配任何规则时将被丢弃。


# 运行某个 ip 通过某个网络接口(网卡)访问指定协议的指定端口
iptables -t filter -A INPUT -i eth0 -s 10.0.0.2 -p tcp --dport 80 -j ACCEPT

nat #

iptables -t nat 命令 规则链 规则
  • PREROUTING 目的地址转换
  • POSTROUTING 源地址转换
# 目录地址转换
iptables -t nat -A POEROUTING -i eth0 114.115.116.117 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1

# 内网所有 10.0.0.0/24 都会伪装成 111.112.113.114 与外网通信
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j SNAT --to-source 111.112.113.114

6.1.3 iptables 配置文件 #

iptables 配置文件在 /etc/sysconfig/iptables。

CentOS 6 在保存时可以执行:

service iptables save|start|stop|restart

在 CentOS 7 中需要先安装:

yum install iptables-services

6.1.4 firewallD 服务 #

FirewallD 是 CentOS 7 及其衍生发行版中使用的动态防火墙管理工具。它提供了一种简单的方式来配置和管理防火墙规则,以保护服务器免受未授权访问和恶意网络活动的威胁。

FirewallD 的主要特点包括:

  1. 动态更新:FirewallD 允许在运行时动态添加、删除和修改防火墙规则,而无需重启防火墙服务。
  2. 区域(Zone)概念:FirewallD 使用区域来定义网络环境,并为每个区域指定不同的防火墙策略。
  3. 简化的规则管理:FirewallD 通过提供简单的命令和工具,使规则管理更易于操作和维护。

以下是一些常用的 FirewallD 服务管理命令:

  • 启动 FirewallD 服务:

    systemctl start firewalld
    
  • 停止 FirewallD 服务:

    systemctl stop firewalld
    
  • 设置 FirewallD 服务在系统启动时自动启动:

    systemctl enable firewalld
    
  • 禁止 FirewallD 服务在系统启动时自动启动:

    systemctl disable firewalld
    
  • 查看 FirewallD 服务状态:

    systemctl status firewalld
    
  • 查看所有可用的防火墙区域:

    firewall-cmd --get-zones
    
  • 查看当前活动的防火墙区域:

    firewall-cmd --get-active-zones
    
  • 查看指定区域的详细信息:

    firewall-cmd --zone=<zone_name> --list-all
    
  • 添加端口到指定区域:

    firewall-cmd --zone=<zone_name> --add-port=<port_number>/tcp
    
  • 重新加载防火墙配置:

    firewall-cmd --reload
    

要添加服务和端口到 FirewallD 的配置中,可以使用 firewall-cmd 命令。下面是一些常见的命令示例:

  1. 添加一个端口到指定的防火墙区域:
firewall-cmd --zone=<zone_name> --add-port=<port_number>/tcp

其中,<zone_name> 是要添加端口的防火墙区域的名称,<port_number> 是要添加的端口号。例如,要将端口 8080 添加到 public 区域,可以执行以下命令:

firewall-cmd --zone=public --add-port=8080/tcp

这将允许 TCP 流量通过端口 8080。

  1. 添加一个预定义的服务到指定的防火墙区域:
firewall-cmd --zone=<zone_name> --add-service=<service_name>

其中,<zone_name> 是要添加服务的防火墙区域的名称,<service_name> 是要添加的预定义服务的名称。例如,要将 SSH 服务添加到 public 区域,可以执行以下命令:

firewall-cmd --zone=public --add-service=ssh

这将允许 SSH 连接通过防火墙。

  1. 永久保存更改:

上述命令添加的规则在系统重启后会失效。要使更改永久生效,可以添加 --permanent 选项,并重新加载防火墙配置:

firewall-cmd --zone=<zone_name> --add-port=<port_number>/tcp --permanent
firewall-cmd --reload

例如:

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

这将在系统重启后仍然允许通过端口 8080 的 TCP 流量,并将更改永久保存。