Centos 8 管理防火墙

firewall-cmd

检查与安装

在 CentOS 8 上安装和启用 firewalld(提供 firewall-cmd 工具)的步骤如下:


1. 检查 **firewalld** 是否已安装

在安装前,先检查系统中是否已安装:

bash 复制代码
sudo firewall-cmd --version

如果返回版本号,说明已安装。如果提示 command not found,继续以下步骤。


2. **安装 ****firewalld**

运行以下命令安装 firewalld

bash 复制代码
sudo dnf install firewalld -y

3. **启用并启动 ****firewalld**

安装完成后,启用并启动 firewalld 服务:

bash 复制代码
sudo systemctl enable firewalld
sudo systemctl start firewalld

4. 验证防火墙状态

确认 firewalld 已成功运行:

bash 复制代码
sudo systemctl status firewalld

如果看到类似以下输出,表示服务已正常运行:

sql 复制代码
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since ...

5. **测试 ****firewall-cmd**

确保 firewall-cmd 工具可用:

bash 复制代码
sudo firewall-cmd --state

如果返回 running,表示防火墙已正常运行。


6. 开放常用端口(可选)

安装完成后,可以根据需要开放一些常用端口:

  • 开放 HTTP 端口(80):
bash 复制代码
sudo firewall-cmd --permanent --add-service=http
  • 开放 HTTPS 端口(443):
bash 复制代码
sudo firewall-cmd --permanent --add-service=https
  • 重新加载规则以生效:
bash 复制代码
sudo firewall-cmd --reload

7. 卸载其他防火墙工具(可选)

如果你之前使用的是 iptables 或其他防火墙工具,可以在 firewalld 安装后将其卸载或停用以避免冲突:

bash 复制代码
sudo systemctl stop iptables
sudo systemctl disable iptables

完成以上步骤后,firewalldfirewall-cmd 已成功安装并启用!

查看配置

在 CentOS 8 中,可以使用 **firewall-cmd** 命令查看当前防火墙的配置和状态。以下是一些常用的方法:


1. 查看防火墙状态

检查防火墙是否正在运行:

bash 复制代码
sudo firewall-cmd --state
  • 返回 running 表示防火墙已启用。
  • 返回 not running 表示防火墙未启动。

2. 查看当前活动的规则

查看当前启用的服务:
bash 复制代码
sudo firewall-cmd --list-services

这将列出当前区域中已启用的服务(如 httphttps)。

查看当前启用的端口:
bash 复制代码
sudo firewall-cmd --list-ports

这将显示所有显式开放的端口及其协议(如 8080/tcp)。


3. 查看所有区域的配置

列出所有区域:
bash 复制代码
sudo firewall-cmd --get-zones
查看当前默认区域:
bash 复制代码
sudo firewall-cmd --get-default-zone
查看特定区域的详细配置(以 public 为例):
bash 复制代码
sudo firewall-cmd --zone=public --list-all

这将显示以下信息:

  • 启用的服务
  • 显式开放的端口
  • 默认行为等

4. 查看防火墙规则是否永久生效

查看永久规则(不依赖当前运行状态):

bash 复制代码
sudo firewall-cmd --list-all --permanent

5. 检查防火墙日志

如果需要深入分析,可以检查日志记录:

bash 复制代码
sudo journalctl -u firewalld

示例输出说明

以下是运行 sudo firewall-cmd --zone=public --list-all 的示例输出:

yaml 复制代码
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 8080/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

说明:

  • **services**:列出了启用的服务(如 HTTP、HTTPS 等)。
  • **ports**:列出了显式开放的端口(如 8080/tcp)。
  • **masquerade**:是否启用了网络地址转换 (NAT)。
  • **rich rules**:复杂自定义规则。

通过这些命令,你可以清晰了解防火墙当前的配置状态,并根据需要进行调整。

4o

iptables

如果 CentOS 8 没有安装 firewalld(或 firewall-cmd),你可以使用 iptables 来查看和管理防火墙规则。以下是查看当前防火墙配置的命令和步骤:


1. 查看当前的防火墙规则

bash 复制代码
sudo iptables -L -n -v
  • **-L**:列出所有规则。
  • **-n**:以数字显示(不会解析为主机名或服务名)。
  • **-v**:显示详细信息,如流量统计。

2. 查看指定链的规则

iptables 的规则按链划分(默认链为 INPUTOUTPUTFORWARD)。如果你只需要查看某一链的规则,可以指定链名称:

查看 INPUT 链的规则:
bash 复制代码
sudo iptables -L INPUT -n -v
查看 OUTPUT 链的规则:
bash 复制代码
sudo iptables -L OUTPUT -n -v

3. 查看 NAT(Network Address Translation) 规则

如果你正在使用网络地址转换 (NAT),可以查看 NAT 表中的规则:

bash 复制代码
sudo iptables -t nat -L -n -v
  • **-t nat**:指定 NAT 表。

4. 检查端口转发规则

如果有端口转发规则,可以在 NAT 表中查找 PREROUTINGPOSTROUTING 链的配置:

bash 复制代码
sudo iptables -t nat -L PREROUTING -n -v
sudo iptables -t nat -L POSTROUTING -n -v

5. 查看当前规则的保存文件

iptables 的规则通常会保存到配置文件中,CentOS 8 的保存文件路径可能是:

bash 复制代码
/etc/sysconfig/iptables

用文本编辑器查看规则:

bash 复制代码
sudo cat /etc/sysconfig/iptables

6. 查看系统服务状态

如果防火墙规则由系统服务管理,可以检查相关服务的状态:

bash 复制代码
sudo systemctl status iptables

示例输出说明

运行 sudo iptables -L -n -v 后的示例输出:

sql 复制代码
Chain INPUT (policy ACCEPT 300 packets, 20400 bytes)
 pkts bytes target     prot opt in     out     source               destination
  100  6000 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
   50  3000 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
   20  1500 DROP       all  --  *      *       192.168.1.100        0.0.0.0/0

说明:

  • **policy ACCEPT**:默认策略为接受(ACCEPT)。
  • **tcp dpt:22**:规则允许 TCP 22 端口(SSH)流量。
  • **tcp dpt:80**:规则允许 TCP 80 端口(HTTP)流量。
  • **DROP**:规则拒绝特定来源的流量。

7. 管理规则

如果需要调整规则,可直接使用 iptables 命令进行管理。例如:

添加规则:

bash 复制代码
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

删除规则:

bash 复制代码
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT

要删除 iptables 中的规则,首先需要找到规则的具体位置。由于你提供的规则在 PREROUTING 链中,且规则是通过 REDIRECT 操作将端口 80 和 443 转发到 8081 和 8443,因此我们需要精确地删除这些规则。

步骤 1: 查看当前 PREROUTING 链中的规则
  1. 使用 iptables -t nat -L PREROUTING -n 来查看 NAT 表中 PREROUTING 链的规则,确保能够确认规则。
bash 复制代码
sudo iptables -t nat -L PREROUTING -n

输出类似如下所示:

sql 复制代码
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         
31325 1640K REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 redir ports 8443
591K   24M REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8081
步骤 2: 删除规则

iptables 删除规则的命令格式是:

bash 复制代码
sudo iptables -t nat -D <chain> <rule-specification>

或者可以使用规则编号删除。

方案 1:基于规则内容删除

根据规则的内容删除,将规则中每个元素逐一指定。

  • 删除第一个规则(端口 443 转发到 8443):
bash 复制代码
sudo iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
  • 删除第二个规则(端口 80 转发到 8081):
bash 复制代码
sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
方案 2:基于规则编号删除

你还可以通过规则编号删除,这要求你先查看规则编号。

  1. 运行命令列出规则及编号:
bash 复制代码
sudo iptables -t nat -L PREROUTING --line-numbers -n

输出可能是这样的:

sql 复制代码
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num  pkts bytes target     prot opt in     out     source               destination         
1    31325 1640K REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 redir ports 8443
2    591K   24M REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8081
  1. 使用规则编号删除:
    • 删除编号为 1 的规则(端口 443 转发到 8443):
bash 复制代码
sudo iptables -t nat -D PREROUTING 1
复制代码
- 删除编号为 2 的规则(端口 80 转发到 8081):
bash 复制代码
sudo iptables -t nat -D PREROUTING 2
步骤 3: 保存 iptables 配置

CentOS 8 默认使用 iptables 配置不会自动保存,因此删除规则后,需要保存配置,以确保规则删除后能够持久化。

  1. 使用 service 命令保存配置:
bash 复制代码
sudo service iptables save
  1. 启动 iptables 服务以确保配置生效:
bash 复制代码
sudo systemctl start iptables
  1. 设置 iptables 开机启动:
bash 复制代码
sudo systemctl enable iptables
步骤 4: 验证规则删除

最后,验证规则是否删除成功:

bash 复制代码
sudo iptables -t nat -L PREROUTING -n

如果规则已成功删除,输出中将不再显示这些 REDIRECT 规则。


总结

你可以通过 iptables -t nat -D PREROUTING 命令删除基于端口的转发规则,或者使用规则编号删除。删除完规则后,别忘了保存配置以确保修改在重启后生效。

保存规则:
bash 复制代码
sudo service iptables save

补充说明

如果系统需要更现代的防火墙工具,可以考虑安装并切换到 firewalldnftables,这将更易于管理。

总结

概念 描述
表 (Tables) 主要有 filternatmanglerawsecurity,分别处理不同类型的网络流量和规则。
链 (Chains) 每个表包含多个链,最常见的链有 INPUTOUTPUTFORWARD,每个链包含过滤规则。
默认链策略 每个链有默认策略,常见的策略有 ACCEPT(接受)和 DROP(丢弃)。
NAT 和过滤 nat 表处理地址转换,filter 表处理数据包过滤。

唯一确定规则的元素

  1. 表 (Table)iptables 中有不同的表(例如 filternatmanglerawsecurity),每个表有不同的作用。规则必须指定所在的表。
  2. 链 (Chain) :每个表中有若干个链(例如 INPUTOUTPUTFORWARDPREROUTINGPOSTROUTING),规则会应用到这些链之一。不同链的规则用途不同。
  3. 协议 (Protocol) :规则通常会基于协议进行过滤,如 tcpudpicmp 等,指定协议帮助精确匹配流量类型。
  4. 端口 (Port) :对于 tcpudp 协议,通常会指定具体的端口(如 8022)。这使得规则能够匹配特定的应用服务。
  5. 跳转目标 (Jump target) :每个规则都有一个目标(也叫跳转目标,如 ACCEPTDROPREJECT,或是跳转到其他链),它决定了数据包匹配规则后应该如何处理。

唯一确定规则的方式

为了唯一确定一个 iptables 规则,可以将上述几个元素结合起来:

bash 复制代码
<表> + <链> + <协议> + <端口> + <跳转目标>

具体解释

  • 表 (Table) :规则所在的表,决定了数据包处理的上下文。例如 filter 表用于过滤流量,nat 表用于网络地址转换。
  • 链 (Chain) :链决定了规则适用于数据流的哪个阶段。例如,INPUT 链用于入站流量,FORWARD 链用于转发流量,OUTPUT 链用于出站流量。
  • 协议 (Protocol) :规则匹配特定协议的数据包,例如 tcpudpicmp。你可以指定协议类型来匹配特定类型的流量。
  • 端口 (Port) :对于某些协议(如 TCP 和 UDP),可以进一步限定端口号。例如,HTTP 服务通常使用端口 80,SSH 服务通常使用端口 22
  • 跳转目标 (Jump target) :在规则匹配后,数据包将会执行的操作。常见的目标包括 ACCEPT(允许数据包通过)、DROP(丢弃数据包)和 REJECT(拒绝数据包并返回错误)。

示例规则

假设我们有如下的规则:

bash 复制代码
sudo iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
  • filter(该规则是过滤表中的规则)
  • INPUT(该规则是应用于入站流量的)
  • 协议tcp(该规则只匹配 TCP 协议的数据包)
  • 端口80(该规则只匹配目的端口为 80 的 TCP 数据包,即 HTTP 流量)
  • 跳转目标ACCEPT(如果数据包匹配规则,则允许通过)

如果另一个规则是:

bash 复制代码
sudo iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
  • filter
  • INPUT
  • 协议tcp
  • 端口22(该规则匹配 SSH 流量)
  • 跳转目标ACCEPT

这两个规则是不同的,因为它们匹配不同的端口(80 和 22)。因此,在 iptables 中,表 + 链 + 协议 + 端口 + 跳转目标 组合起来能唯一确定一条规则。

更复杂的规则

你还可以使用更多的匹配条件,例如:

  • 源 IP 地址-s 192.168.1.1
  • 目标 IP 地址-d 192.168.1.2
  • 源端口--sport 1024
  • TTL(生存时间)--ttl 64

例如,下面的规则:

bash 复制代码
sudo iptables -t filter -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j ACCEPT

此规则的唯一确定性进一步增强,因为它不仅匹配端口 80 的 TCP 流量,还限制了源 IP 为 192.168.1.100


总结

要唯一确定 iptables 规则,必须综合考虑以下几个元素:

  • :规则所在的表
  • :规则应用于的链
  • 协议 :例如 tcpudp
  • 端口:协议所涉及的端口号
  • 跳转目标:规则匹配后应执行的操作

通过这些组合,你可以准确地描述和唯一确定 iptables 的每一条规则。