文章目录
- 防火墙管理
- 1. Linux 防火墙管理
- 1.1 防火墙是什么?
- 2. Netfilter 子系统
- Nftables 子系统
- 3. 静态防火墙和动态防火墙
- 4. Firewalld 防火墙
- 5. Firewalld 区域 Zone
- 6. Firewalld 规则匹配优先级
- 7. Firewalld 配置方式
- 两个基本概念
- 8. firewall-cmd 核心命令与反馈
- 8.1 zone 管理
- 8.2 service 管理
- 8.3 port 管理
- 8.4 masquerade 管理
- 8.5 forward-port 管理
- 9. 命令速查表
- 10. 易错点与复习自测
- 易错点
- 自测题
- 自测题
防火墙管理
1. Linux 防火墙管理
1.1 防火墙是什么?
防火墙工作在网络或主机边缘,对进出网络或主机的数据包基于规则进行检查,匹配规则后按规则定义行为处理。
基本思路:默认关闭所有通过型访问,只开放允许访问的策略。
希望外网访问的主机通常放在 DMZ(隔离区)网络中。
按保护范围划分:
- 主机防火墙:服务范围为当前一台主机。
- 网络防火墙:服务范围为防火墙一侧的局域网。
按实现方式划分:
- 硬件防火墙:专用硬件级别实现,如华为、华三、天融信等。
- 软件防火墙:运行在通用硬件平台上的防火墙软件,如
iptables、firewalld。
按网络协议划分:
- 网络层防火墙:工作在 OSI 下四层,又称包过滤防火墙。依据 ACL 检查源地址、目的地址、端口号、协议状态等。
优点:对用户透明、处理速度快、易于维护。
缺点:无法检查应用层数据,如病毒等。 - 应用层防火墙 / 代理服务器:工作在 OSI 七层或承担 proxy 代理网关。
优点:提供应用层保护。
缺点:处理速度慢。
2. Netfilter 子系统
Netfilter 是 Linux 内核中强大的网络过滤子系统。
对进入系统的每个数据包,在到达用户空间组件或应用之前进行检查,可通过编程方式修改、丢弃或路由数据包。
Netfilter 工作在内核态,用户使用以下命令配置防火墙规则:
iptables:过滤 IPv4 协议数据包。ip6tables:过滤 IPv6 协议数据包。arptables:过滤 arp 协议数据包。ebtables:过滤数据链路层数据包。
命令反馈:
[root@centos7 ~]# ls -1 /sbin/*tables-rwxr-xr-x1root root5987211月62016/sbin/arptables -rwxr-xr-x.1root root70164月112018/sbin/ebtables lrwxrwxrwx.1root root138月115:45 /sbin/ip6tables ->xtables-multi lrwxrwxrwx.1root root138月115:45 /sbin/iptables ->xtables-multiNftables 子系统
Nftables 是 netfilter 的增强版,保留了 netfilter 架构。
优点:
- 更快的数据包处理
- 更快的规则集更新
- 使用单个
nft用户空间实用程序管理所有协议
3. 静态防火墙和动态防火墙
| 类型 | 特点 | 例子 |
|---|---|---|
| 静态防火墙 | 修改规则时需要重新加载所有防火墙规则,会导致网络连接丢失 | iptables |
| 动态防火墙 | 只将变更部分保存并更新到运行中的 iptables,不需要重新加载整个规则列表 | firewalld |
4. Firewalld 防火墙
Firewalld 是 Red Hat 开发的防火墙软件,默认后端为nftables。
在 CentOS 7 中,firewalld取代iptables成为默认防火墙软件。
Firewalld 和 iptables 的关系:
firewalld提供了 daemon 和 service,还有命令行和图形界面配置工具。- 它仅替代了
iptables service部分。 - 底层还是使用
iptables作为防火墙规则管理入口。 - 真正干活的是内核的
netfilter。
5. Firewalld 区域 Zone
Firewalld 将所有网络流量分为多个区域(zone),每个 zone 就是一套过滤规则集。
常用 zone:
| zone | 说明 |
|---|---|
| trusted | 允许所有传入流量 |
| public | 允许与 ssh 或 dhcpv6-client 预定义服务匹配的传入流量,其余拒绝。新添加网络接口的默认区域 |
| external | 允许与 ssh 预定义服务匹配的传入流量,其余拒绝。默认将通过此区域转发的 IPv4 传出流量进行地址伪装 |
| home | 允许与 ssh、mdns、samba-client 或 dhcpv6-client 预定义服务匹配的传入流量,其余拒绝 |
| internal | 默认与 home 区域相同 |
| work | 允许与 ssh、dhcpv6-client 预定义服务匹配的传入流量,其余拒绝 |
| dmz | 允许与 ssh 预定义服务匹配的传入流量,其余拒绝 |
| block | 拒绝所有传入流量 |
| drop | 丢弃所有传入流量,并且不产生包含 ICMP 的错误响应 |
数据包与 zone 匹配规则:
- 该源地址被分配给特定区域,则应用该区域规则。
- 如果数据包未匹配源地址,则分配给与传入网络接口关联的区域,并应用该区域规则。
- 如果以上都未匹配,firewalld 将数据包分配给默认区域。
注意事项:
firewalld默认指定public区域为默认区域。- 将
lo回环接口映射至trusted区域。 - 如果流量不与允许的端口、协议或服务匹配,通常会被拒绝。
6. Firewalld 规则匹配优先级
区域内规则匹配优先级:
- 首先匹配为该区域设置的任何端口转发和伪装原则。
- 其次匹配该区域设置的任何允许规则。
- 最后匹配该区域设置的任何拒绝规则。
- 还可以同时为以上 3 类规则设置记录和审计规则,可以同时生效。
- 富规则中的规则优先级高于区域中其他规则。
- 如果区域中所有规则都不匹配,通常会拒绝该包,
trusted例外。
7. Firewalld 配置方式
配置方法:
- 直接编辑
/etc/firewalld/中的配置文件。 firewall-cmd命令行工具。firewall-config图形工具。
不建议直接修改配置文件,推荐使用firewall-cmd。
两个基本概念
runtime:运行态,立刻生效。permanent:永久态,写入配置文件,需要--reload才生效。
配置规则必须在一个区域内。如果不使用--zone选项,则使用默认区域public。
建议配置防火墙时一次性写两条规则:
- 第一条使用
--permanent永久生效。 - 第二条不使用
--permanent立刻生效。
8. firewall-cmd 核心命令与反馈
8.1 zone 管理
# 查看 zone 清单[root@centos7 ~]# firewall-cmd --get-zonesblock dmz drop external home internal public trusted work# 查看激活的 zone 清单[root@centos7 ~]# firewall-cmd --get-active-zonespublic interfaces: ens32# 查看默认 zone[root@centos7 ~]# firewall-cmd --get-default-zonepublic# 设置默认 zone[root@centos7 ~]# firewall-cmd --set-default-zone=trusted# 查看默认 zone 中的规则[root@centos7 ~]# firewall-cmd --list-allpublic(active)target: default icmp-block-inversion: no interfaces: ens32 sources: services: cockpit dhcpv6-clientsshports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:复习提示:
--list-all不加--zone时显示默认/活动区域信息;示例输出可能因 runtime/permanent 和当前激活区域不同而变化,实际以你的环境为准。
8.2 service 管理
# 查看系统中预定义了哪些服务[root@centos7 ~]# firewall-cmd --get-services# 添加放行服务[root@centos7 ~]# firewall-cmd --add-service=http# 查看放行服务列表[root@centos7 ~]# firewall-cmd --list-servicescockpit dhcpv6-client httpssh# 查看服务是否放行[root@centos7 ~]# firewall-cmd --query-service=httpyes# 删除服务[root@centos7 ~]# firewall-cmd --remove-service=http8.3 port 管理
# 添加放行端口[root@centos7 ~]# firewall-cmd --add-port=5900/tcp# 查看端口放行列表[root@centos7 ~]# firewall-cmd --list-ports5900/tcp# 删除端口[root@centos7 ~]# firewall-cmd --remove-port=5900/tcp8.4 masquerade 管理
masquerade 用于 SNAT,让内网主机通过本机访问外网。
# 查看 masquerade 是否启动[root@centos7 ~]# firewall-cmd --query-masqueradeno# 启动 masquerade[root@centos7 ~]# firewall-cmd --add-masquerade# 禁用 masquerade[root@centos7 ~]# firewall-cmd --remove-masquerade8.5 forward-port 管理
使用 port forward 前,确保对应 zone 启用 masquerade 功能。
# 访问本机端口 8000 转发到本机 80[root@centos7 ~]# firewall-cmd --add-forward-port=port=8000:proto=tcp:toport=80# 访问本机端口 1022 转发到 10.1.1.11:22[root@centos7 ~]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11# 查询端口转发清单[root@centos7 ~]# firewall-cmd --list-forward-portsport=8000:proto=tcp:toport=80:toaddr=port=1022:proto=tcp:toport=22:toaddr=10.1.1.119. 命令速查表
| 操作 | 命令 |
|---|---|
| 查看所有 zone | firewall-cmd --get-zones |
| 查看激活 zone | firewall-cmd --get-active-zones |
| 查看默认 zone | firewall-cmd --get-default-zone |
| 设置默认 zone | firewall-cmd --set-default-zone=trusted |
| 查看当前区域规则 | firewall-cmd --list-all |
| 查看预定义服务 | firewall-cmd --get-services |
| 添加服务 | firewall-cmd --add-service=http |
| 查看服务列表 | firewall-cmd --list-services |
| 查询服务 | firewall-cmd --query-service=http |
| 删除服务 | firewall-cmd --remove-service=http |
| 添加端口 | firewall-cmd --add-port=5900/tcp |
| 查看端口 | firewall-cmd --list-ports |
| 删除端口 | firewall-cmd --remove-port=5900/tcp |
| 查询伪装 | firewall-cmd --query-masquerade |
| 开启伪装 | firewall-cmd --add-masquerade |
| 关闭伪装 | firewall-cmd --remove-masquerade |
| 添加端口转发 | firewall-cmd --add-forward-port=port=8000:proto=tcp:toport=80 |
| 查看端口转发 | firewall-cmd --list-forward-ports |
10. 易错点与复习自测
易错点
runtime和permanent不分:- 不加
--permanent的命令立刻生效,但重启或--reload后可能丢失。 - 加
--permanent的命令不会立刻生效,需要--reload。
- 不加
- 忘记指定
--zone:- 默认使用
public区域。
- 默认使用
- 区域匹配顺序:
- 源地址 → 入接口关联区域 → 默认区域。
- 规则优先级:
- 端口转发/伪装 > 允许规则 > 拒绝规则;富规则优先级高于区域其他规则。
forward-port前要确认对应 zone 已启用masquerade。- 默认
public,lo映射到trusted。 - 不建议直接编辑
/etc/firewalld/,推荐firewall-cmd。
自测题
- 如何查看当前默认 zone?
- 如何添加一个永久放行
http服务,并让它立刻生效? firewall-cmd --add-port=5900/tcp和加--permanent有什么区别?- 端口转发前为什么要确认 masquerade?
→ 默认区域。
- 规则优先级:
- 端口转发/伪装 > 允许规则 > 拒绝规则;富规则优先级高于区域其他规则。
forward-port前要确认对应 zone 已启用masquerade。- 默认
public,lo映射到trusted。 - 不建议直接编辑
/etc/firewalld/,推荐firewall-cmd。
自测题
- 如何查看当前默认 zone?
- 如何添加一个永久放行
http服务,并让它立刻生效? firewall-cmd --add-port=5900/tcp和加--permanent有什么区别?- 端口转发前为什么要确认 masquerade?
- 数据包没有匹配任何源地址和接口时,会进入哪个区域?