Centos 8 管理防火墙
firewall-cmd
检查与安装
在 CentOS 8 上安装和启用 firewalld
(提供 firewall-cmd
工具)的步骤如下:
1. 检查 **firewalld**
是否已安装
在安装前,先检查系统中是否已安装:
sudo firewall-cmd --version
如果返回版本号,说明已安装。如果提示 command not found
,继续以下步骤。
2. **安装 ****firewalld**
运行以下命令安装 firewalld
:
sudo dnf install firewalld -y
3. **启用并启动 ****firewalld**
安装完成后,启用并启动 firewalld
服务:
sudo systemctl enable firewalld
sudo systemctl start firewalld
4. 验证防火墙状态
确认 firewalld
已成功运行:
sudo systemctl status firewalld
如果看到类似以下输出,表示服务已正常运行:
● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)Active: active (running) since ...
5. **测试 ****firewall-cmd**
确保 firewall-cmd
工具可用:
sudo firewall-cmd --state
如果返回 running
,表示防火墙已正常运行。
6. 开放常用端口(可选)
安装完成后,可以根据需要开放一些常用端口:
- 开放 HTTP 端口(80):
sudo firewall-cmd --permanent --add-service=http
- 开放 HTTPS 端口(443):
sudo firewall-cmd --permanent --add-service=https
- 重新加载规则以生效:
sudo firewall-cmd --reload
7. 卸载其他防火墙工具(可选)
如果你之前使用的是 iptables
或其他防火墙工具,可以在 firewalld
安装后将其卸载或停用以避免冲突:
sudo systemctl stop iptables
sudo systemctl disable iptables
完成以上步骤后,firewalld
和 firewall-cmd
已成功安装并启用!
查看配置
在 CentOS 8 中,可以使用 **firewall-cmd**
命令查看当前防火墙的配置和状态。以下是一些常用的方法:
1. 查看防火墙状态
检查防火墙是否正在运行:
sudo firewall-cmd --state
- 返回
running
表示防火墙已启用。 - 返回
not running
表示防火墙未启动。
2. 查看当前活动的规则
查看当前启用的服务:
sudo firewall-cmd --list-services
这将列出当前区域中已启用的服务(如 http
、https
)。
查看当前启用的端口:
sudo firewall-cmd --list-ports
这将显示所有显式开放的端口及其协议(如 8080/tcp
)。
3. 查看所有区域的配置
列出所有区域:
sudo firewall-cmd --get-zones
查看当前默认区域:
sudo firewall-cmd --get-default-zone
查看特定区域的详细配置(以 public
为例):
sudo firewall-cmd --zone=public --list-all
这将显示以下信息:
- 启用的服务
- 显式开放的端口
- 默认行为等
4. 查看防火墙规则是否永久生效
查看永久规则(不依赖当前运行状态):
sudo firewall-cmd --list-all --permanent
5. 检查防火墙日志
如果需要深入分析,可以检查日志记录:
sudo journalctl -u firewalld
示例输出说明
以下是运行 sudo firewall-cmd --zone=public --list-all
的示例输出:
public (active)target: defaulticmp-block-inversion: nointerfaces: eth0sources:services: dhcpv6-client http https sshports: 8080/tcpprotocols:masquerade: noforward-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. 查看当前的防火墙规则
sudo iptables -L -n -v
**-L**
:列出所有规则。**-n**
:以数字显示(不会解析为主机名或服务名)。**-v**
:显示详细信息,如流量统计。
2. 查看指定链的规则
iptables 的规则按链划分(默认链为 INPUT
、OUTPUT
和 FORWARD
)。如果你只需要查看某一链的规则,可以指定链名称:
查看 INPUT
链的规则:
sudo iptables -L INPUT -n -v
查看 OUTPUT
链的规则:
sudo iptables -L OUTPUT -n -v
3. 查看 NAT(Network Address Translation) 规则
如果你正在使用网络地址转换 (NAT),可以查看 NAT 表中的规则:
sudo iptables -t nat -L -n -v
**-t nat**
:指定 NAT 表。
4. 检查端口转发规则
如果有端口转发规则,可以在 NAT 表中查找 PREROUTING
或 POSTROUTING
链的配置:
sudo iptables -t nat -L PREROUTING -n -v
sudo iptables -t nat -L POSTROUTING -n -v
5. 查看当前规则的保存文件
iptables 的规则通常会保存到配置文件中,CentOS 8 的保存文件路径可能是:
/etc/sysconfig/iptables
用文本编辑器查看规则:
sudo cat /etc/sysconfig/iptables
6. 查看系统服务状态
如果防火墙规则由系统服务管理,可以检查相关服务的状态:
sudo systemctl status iptables
示例输出说明
运行 sudo iptables -L -n -v
后的示例输出:
Chain INPUT (policy ACCEPT 300 packets, 20400 bytes)pkts bytes target prot opt in out source destination100 6000 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2250 3000 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8020 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
命令进行管理。例如:
添加规则:
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
删除规则:
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT
要删除 iptables
中的规则,首先需要找到规则的具体位置。由于你提供的规则在 PREROUTING
链中,且规则是通过 REDIRECT
操作将端口 80 和 443 转发到 8081 和 8443,因此我们需要精确地删除这些规则。
步骤 1: 查看当前 PREROUTING
链中的规则
- 使用
iptables -t nat -L PREROUTING -n
来查看 NAT 表中PREROUTING
链的规则,确保能够确认规则。
sudo iptables -t nat -L PREROUTING -n
输出类似如下所示:
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
删除规则的命令格式是:
sudo iptables -t nat -D <chain> <rule-specification>
或者可以使用规则编号删除。
方案 1:基于规则内容删除
根据规则的内容删除,将规则中每个元素逐一指定。
- 删除第一个规则(端口 443 转发到 8443):
sudo iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
- 删除第二个规则(端口 80 转发到 8081):
sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
方案 2:基于规则编号删除
你还可以通过规则编号删除,这要求你先查看规则编号。
- 运行命令列出规则及编号:
sudo iptables -t nat -L PREROUTING --line-numbers -n
输出可能是这样的:
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 的规则(端口 443 转发到 8443):
sudo iptables -t nat -D PREROUTING 1
- 删除编号为 2 的规则(端口 80 转发到 8081):
sudo iptables -t nat -D PREROUTING 2
步骤 3: 保存 iptables
配置
CentOS 8 默认使用 iptables
配置不会自动保存,因此删除规则后,需要保存配置,以确保规则删除后能够持久化。
- 使用
service
命令保存配置:
sudo service iptables save
- 启动
iptables
服务以确保配置生效:
sudo systemctl start iptables
- 设置
iptables
开机启动:
sudo systemctl enable iptables
步骤 4: 验证规则删除
最后,验证规则是否删除成功:
sudo iptables -t nat -L PREROUTING -n
如果规则已成功删除,输出中将不再显示这些 REDIRECT
规则。
总结
你可以通过 iptables -t nat -D PREROUTING
命令删除基于端口的转发规则,或者使用规则编号删除。删除完规则后,别忘了保存配置以确保修改在重启后生效。
保存规则:
sudo service iptables save
补充说明
如果系统需要更现代的防火墙工具,可以考虑安装并切换到 firewalld
或 nftables
,这将更易于管理。
总结
概念 | 描述 |
---|---|
表 (Tables) | 主要有 filter 、nat 、mangle 、raw 、security ,分别处理不同类型的网络流量和规则。 |
链 (Chains) | 每个表包含多个链,最常见的链有 INPUT 、OUTPUT 、FORWARD ,每个链包含过滤规则。 |
默认链策略 | 每个链有默认策略,常见的策略有 ACCEPT (接受)和 DROP (丢弃)。 |
NAT 和过滤 | nat 表处理地址转换,filter 表处理数据包过滤。 |
唯一确定规则的元素
- 表 (Table):
iptables
中有不同的表(例如filter
、nat
、mangle
、raw
、security
),每个表有不同的作用。规则必须指定所在的表。 - 链 (Chain):每个表中有若干个链(例如
INPUT
、OUTPUT
、FORWARD
、PREROUTING
、POSTROUTING
),规则会应用到这些链之一。不同链的规则用途不同。 - 协议 (Protocol):规则通常会基于协议进行过滤,如
tcp
、udp
、icmp
等,指定协议帮助精确匹配流量类型。 - 端口 (Port):对于
tcp
或udp
协议,通常会指定具体的端口(如80
、22
)。这使得规则能够匹配特定的应用服务。 - 跳转目标 (Jump target):每个规则都有一个目标(也叫跳转目标,如
ACCEPT
、DROP
、REJECT
,或是跳转到其他链),它决定了数据包匹配规则后应该如何处理。
唯一确定规则的方式
为了唯一确定一个 iptables
规则,可以将上述几个元素结合起来:
<表> + <链> + <协议> + <端口> + <跳转目标>
具体解释
- 表 (Table):规则所在的表,决定了数据包处理的上下文。例如
filter
表用于过滤流量,nat
表用于网络地址转换。 - 链 (Chain):链决定了规则适用于数据流的哪个阶段。例如,
INPUT
链用于入站流量,FORWARD
链用于转发流量,OUTPUT
链用于出站流量。 - 协议 (Protocol):规则匹配特定协议的数据包,例如
tcp
、udp
或icmp
。你可以指定协议类型来匹配特定类型的流量。 - 端口 (Port):对于某些协议(如 TCP 和 UDP),可以进一步限定端口号。例如,HTTP 服务通常使用端口
80
,SSH 服务通常使用端口22
。 - 跳转目标 (Jump target):在规则匹配后,数据包将会执行的操作。常见的目标包括
ACCEPT
(允许数据包通过)、DROP
(丢弃数据包)和REJECT
(拒绝数据包并返回错误)。
示例规则
假设我们有如下的规则:
sudo iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
- 表:
filter
(该规则是过滤表中的规则) - 链:
INPUT
(该规则是应用于入站流量的) - 协议:
tcp
(该规则只匹配 TCP 协议的数据包) - 端口:
80
(该规则只匹配目的端口为 80 的 TCP 数据包,即 HTTP 流量) - 跳转目标:
ACCEPT
(如果数据包匹配规则,则允许通过)
如果另一个规则是:
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
例如,下面的规则:
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
规则,必须综合考虑以下几个元素:
- 表:规则所在的表
- 链:规则应用于的链
- 协议:例如
tcp
、udp
等 - 端口:协议所涉及的端口号
- 跳转目标:规则匹配后应执行的操作
通过这些组合,你可以准确地描述和唯一确定 iptables
的每一条规则。