ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

    • Linux基础

    • Linux服务

      • Rsync文件传输
      • Sersync实时同步
      • NFS文件服务
      • SSH远程连接
      • Keepalived高可用
      • Supervospr进程管理
      • APT包管理工具
      • Samba文件共享
      • JumpServer堡垒机
      • Linux搭建DNS服务
      • Tmux终端管理
      • Iptables
      • Firewalld防火墙管理
        • Firewalld
          • 介绍
          • 区域
          • 规则状态
          • 区域相关命令
          • 放行规则命令
          • 转发规则命令
          • 直接规则命令
          • 富规则命令
          • 其他命令
      • OpenVPN代理
      • 本地yum仓库搭建
    • Windows Server笔记

    • Shell笔记

    • Ansible笔记

  • 虚拟化服务

  • 数据库服务

  • 监控服务

  • Web服务

  • 数据处理

  • Ops
  • 操作系统
  • Linux服务
Hoshinozora
2024-06-21
目录

Firewalld防火墙管理

# Firewalld

# 介绍

Firewalld是Linux系统中的一款防火墙管理工具。firewalld和iptables一样只用于维护规则,真正使用规则生效、实现防火墙功能的是内核的netfilter。

firewalld和iptables的相同点:

  1. 都是Linux系统中的防火墙策略管理工具。
  2. 都是基于内核的netfilter实现防火墙功能,以处理和过滤网络数据包。

firewalld和iptables的不同点:

  1. firewalld相较iptables多了区域(zones)的概念,区域用于分组规则,更加直观和易于管理。
  2. firewalld除了命令行工具firewall-config外,还提供firewall-config工具进行图形化方式的管理,而iptables仅支持命令行工具进行管理。
  3. firewalld提供动态防火墙管理,无需重启服务即可应用规则的更改。而iptables更改规则通常需要重新加载整个规则集,这可能会短暂中断正在处理的连接。
  4. firewalld使用--permanent参数来将规则持久化到配置文件中,从而使规则在重启后仍然有效。而iptables需要使用外部脚本(如iptables-save和iptables-restore)来保存和恢复规则。
  5. firewalld是一个动态的守护进程,它可以在不中断服务的情况下实时应用防火墙规则更改。而iptables并不是一个守护进程,它实际上是一套用于配置netfilter的用户空间工具。

# 区域

# 介绍

区域(zones)是firewalld的核心概念之一,它用于提供了一种灵活的方式来管理不同网络接口和规则的分组。区域可以看作是防火墙策略的容器,每个容器包含一组规则和设置,用来定义如何处理对应区域的入站和出站流量,以适应不同的安全需求。

实际使用时,我们可以根据根据网络的信任级别(即网络位置,例如家庭、公共、受信任等)或用途来划分区域,并定义不同区域允许或拒绝的服务、流量类型等。

每个网络接口可以指定一个区域,未明确设置的任何网络接口将使用默认的public区域,我们可以根据不同场景给接口关联合适的区域。

例如:有内网和外网的接口,我们可以给内网接口关联internal区域并允许DHCP,给外网接口关联external区域并允许HTTP和SSH。

# 内置区域

区域 默认规则策略
trusted 用于信任网络,允许所有的数据包流入与流出。
home 用于家庭网络,仅接收ssh、mdns、gp-client、samba-client、dhcpv6-client相关服务的数据包。
internal 用于内部网络,同等于home区域。
work 用于工作网络,仅接受ssh、ipp-client、dhcpv6-client相关服务的数据包。
public 公共区域,firewalld的默认区域,仅接受ssh、dhcpv6-client相关服务的数据包。
external 用于外部网络,仅接受ssh相关服务的数据包。
dmz 隔离区域,仅接受ssh相关服务的数据包。
block 拒绝区域,拒绝所有的数据包,会回复拒绝。
drop 丢弃区域,丢弃所有的数据包,直接丢弃数据包。

内置区域的配置文件保存在/usr/lib/firewalld/zones/目录下。

# 规则状态

Firewalld的规则两种状态:

  • 运行时(runtime),指定规则后会立即临时生效,但不会持久化到配置文件,重载后不会被保留。

    firewall-cmd [RULE]
    
    1
  • 持久配置(permanent),规则会被持久化到配置文件中,需要重载才会生效。

    firewall-cmd --permanent [RULE]
    firewall-cmd --reload
    
    1
    2

# 区域相关命令

# 查询

# 查看指定区域配置信息,不指定则查询默认的public区域
firewall-cmd --list-all --zone=[区域名]
# 查看当前默认区域
firewall-cmd --get-default-zone
# 查看所有可用区域
firewall-cmd --get-zones
# 查看正在使用的区域与网卡名
firewall-cmd --get-active-zones
# 查看网卡绑定在了哪个区域
firewall-cmd --get-zone-of-interface=[网络接口名]
# 查看所有ICMP类型
firewall-cmd --get-icmptypes
1
2
3
4
5
6
7
8
9
10
11
12

区域配置信息说明

public (active) # 活动的区域。

target: default # 默认启动的区域。

icmp-block-inversion: no # 切换ICMP数据包黑白名单模式,默认为no表示黑名单模式,默认放行。

interfaces: ens33 # 关联的网卡接口。

sources: 192.168.182.147 # 允许的来源,可以是IP地址,也可以是mac地址。

services: dhcpv6-client ssh # 允许的服务。

ports: 2181/tcp 8888/tcp 80/tcp # 允许的目标端口。

protocols: # 协议值可以是一个协议ID数字,或者一个协议名。

masquerade: no # 表示这个区域是否允许IP伪装。如果yes将允许IP转发,可以让主机作为一个路由器。

forward-ports: # 列出转发的端口。

source-ports: # 允许的来源端口。

icmp-blocks: # ICMP黑名单模式下指定的ICMP类型会被拒绝,ICMP白名单模式下指定的ICMP类型会被放行。

rich rules: # 富规则,即更细致的防火墙规则策略,它的优先级在所有的防火墙策略中是最高的。

# 新增

# 新增自定义区域
firewall-cmd --new-zone=[区域名]
# 在icmp-blocks中添加ICMP类型
firewall-cmd --add-icmp-block=[ICMP类型] --zone=[区域名]
# 新增指定网卡与指定区域关联
firewall-cmd --add-interface=[网卡名] --zone=[区域名]
1
2
3
4
5
6

# 修改

# 修改默认区域
firewall-cmd --set-default-zone=[区域名]
# 修改指定网卡与指定区域关联
firewall-cmd --change-interface=[网卡名] --zone=[区域名]
1
2
3
4

# 删除

# 删除自定义区域
firewall-cmd --delete-zone=[区域名]
# 在icmp-blocks中删除ICMP类型
firewall-cmd --zone=[区域名] --remove-icmp-block=[ICMP类型]
# 删除指定网卡与指定区域的关联
firewall-cmd --remove-interface=[网卡名] --zone=[区域名]
1
2
3
4
5
6

# 放行规则命令

不指定区域则表示使用默认的public区域。

# 查询

# 查询预定义的服务名,只有预定义的服务才能被规则使用
firewall-cmd --get-services
# 查询区域放行的端口
firewall-cmd --list-ports --zone=[区域名]
# 查询区域放行的IP段
firewall-cmd --list-sources --zone=[区域名]
1
2
3
4
5
6

# 新增

如果需要添加多个规则可以使用{xxx, xxx, ...}的方式书写,例如:--add-port={1000/tcp, 1002/tcp}

另外端口规则还可以指定范围,例如:--add-port=1000-1005/tcp

如果需要持久化到配置则需要加上--permanent参数并在添加后使用--reload重载配置。

# 在指定区域新增端口放行规则
firewall-cmd --zone=[区域名] --add-port=[端口/协议]
# 在指定区域新增来源放行规则
firewall-cmd --zone=[区域名] --add-source=[MAC地址或IP或IP段]
# 在指定区域新增服务放行规则
firewall-cmd --zone=[区域名] --add-service=[服务名]
1
2
3
4
5
6

# 删除

如果需要删除持久化配置则需要加上--permanent参数并在添加后使用--reload重载配置。

# 在指定区域删除端口放行规则
firewall-cmd --zone=[区域名] --remove-port=[端口/协议]
# 在指定区域删除来源放行规则
firewall-cmd --zone=[区域名] --remove-source=[MAC地址或IP或IP段]
# 在指定区域删除服务放行规则
firewall-cmd --zone=[区域名] --add-service=[服务名]
1
2
3
4
5
6

# 例子

# 放行80/8080端口
firewall-cmd --zone=public --add-port={80/tcp,8080/tcp}
1
2

# 转发规则命令

会将请求到本机指定端口的数据包,转发到目标主机的目标端口。

# 启用转发

# 需要现在内核启用ipv4端口转发功能
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
1
2
3

# 新增转发

如果需要持久化到配置则需要加上--permanent参数并在添加后使用--reload重载配置。

# 开启指定区域IP伪装功能,永久开启也需要使用--permanent参数
firewall-cmd --zone=[区域名] --add-masquerade

# 在指定区域新增端口转发规则,如果不指定主机则会转发到本机的目标端口。
firewall-cmd --zone=[区域名] --add-forward-port=port=[源端口号]:proto=[协议]:toport=[目标端口号]:toaddr=[目标IP地址]
1
2
3
4
5

toaddr指定127.0.0.1无效,想转发到本机不指定即可。

# 删除转发

# 在指定区域删除端口转发规则
firewall-cmd --zone=[区域名] --remove-forward-port=port=[源端口号]:proto=[协议]:toport=[目标端口号]:toaddr=[目标IP地址]

# 关闭指定区域IP伪装功能
firewall-cmd --zone=[区域名] --remove-masquerade
1
2
3
4
5

# 例子

# 开启IP转发
firewall-cmd --zone=public --add-masquerade --permanent
# 将8080端口转到发到本机的80端口
firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=80 --permanent
# 重载配置
firewall-cmd --reload
1
2
3
4
5
6

# 直接规则命令

直接规则能够让我们绕过区域或服务,直接与底层iptables或nftables规则交互的功能。直接规则传递的参数和iptables、ip6tables、ebtables的参数基本一致。

一般情况下直接规则会优先于firewalld规则进行解析,除非我们将直接规则显式插入firewalld管理的区域中。

使用任何直接规则相关的命令都需要加上--direct参数,表示要使用直接规则。同样的如果需要持久化生效需要加上--permanent参数并在添加后使用--reload重载配置。

# 查询

# 获取所有自定义链
firewall-cmd --direct --get-all-chains
# 获取指定表中的自定义链
firewall-cmd --direct --get-chain {ipv4|ipv6|eb} [表名]
# 查询自定义链是否存在
firewall-cmd --direct --query-chain {ipv4|ipv6|eb} [表名] [自定义链名]

# 获取所有直接规则
firewalld-cmd --direct --get-all-rules
# 获取指定表中指定链中的规则
firewalld-cmd --direct --get-rules {ipv4|ipv6|eb} [表名] [链名]
# 查询规则是否存在
firewall-cmd --direct --query-rule {ipv4|ipv6|eb} [表名] [链名] [优先级] [规则参数]

# 获取所有直通规则
firewall-cmd --direct --get-all-passthroughs
# 获取指定跟踪通道的直通规则
firewall-cmd --direct --get-passthroughs {ipv4|ipv6|eb}
# 查询直通规则是否存在
firewall-cmd --direct --query-passthrough {ipv4|ipv6|eb} [Iptables参数]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 新增

# 新增自定义链
firewall-cmd --direct --add-chain {ipv4|ipv6|eb} [表名] [自定义链名]

# 新增直接规则,可以指定内置链或自定义链,优先级越小越优先
firewall-cmd --direct --add-rule {ipv4|ipv6|eb} [表名] [链名] [优先级] [规则参数]

# 新增直通规则,可以直接传递iptables参数
firewall-cmd --direct --add-passthrough {ipv4|ipv6|eb} [Iptables参数]
1
2
3
4
5
6
7
8

# 删除

# 删除自定义链
firewall-cmd --direct --remove-chain {ipv4|ipv6|eb} [表名] [自定义链名]

# 删除直接规则,优先级越小越优先
firewall-cmd --direct --remove-rule {ipv4|ipv6|eb} [表名] [链名] [优先级] [规则参数]

# 删除直通规则
firewall-cmd --direct --remove-passthrough {ipv4|ipv6|eb} [Iptables参数]
1
2
3
4
5
6
7
8

# 例子

# 添加直接规则拒绝来自192.168.10.0/24的80端口请求
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 -s 192.168.10.0/24 -p tcp --dport 80 -j REJECT
firewall-cmd --reload

# 创建直通规则
firewall-cmd --direct --passthrough ipv4 -t filter -I INPUT -s 192.168.1.0/24 -j DROP
1
2
3
4
5
6

# 富规则命令

firewalld中的富规则提供更细致、更复杂的防火墙策略配置,富规则的优先级在所有防火墙策略中是最高的,它支持以下几种条件和动作:

  • 地址和端口限制:指定特定的IP地址、网络或端口范围。
  • 协议类型:根据不同的协议(如 TCP、UDP)来过滤流量。
  • 时间条件:支持根据时间来应用规则,能够在特定时间段内启用或禁用某些规则。
  • 日志记录:在匹配规则时记录日志信息。
  • 拒绝或接受动作:明确指定是接受还是拒绝匹配的数据包。
  • 速率限制:对匹配的数据包应用速率限制。
  • 转发和重定向:将流量转发到其他地址或端口。
  • ICMP响应:针对匹配的数据包发送特定类型的 ICMP 响应。

# 富规则语法

# 指定规则应用的地址族
rule [family="ipv4|ipv6"]
# 匹配源地址,invert为true表示反转匹配逻辑,即匹配非指定地址的所有源地址
source address="address[/mask]" [invert="True"]
# 匹配目标地址,invert为true表示反转匹配逻辑,即匹配非指定地址的所有目标地址
destination address="address[/mask]" invert="True"
# 匹配特定的预定义服务
service name="service name"
# 匹配指定端口号和使用的协议,端口可以指定范围例如100-120
port port="port value" protocol="tcp|udp"
# 指定规则生效的时间段
time [day="day-of-week"] [month="month"] [datestart="YYYY-MM-DD"] [datestop="YYYY-MM-DD"] [timestart="HH:MM"] [timestop="HH:MM"]
# 匹配的通信协议,如icmp、tcp、udp等。
protocol value="protocol value"
# 进行端口转发
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
# 记录匹配规则的流量日志,limit用于指定日志记录的速率限制,如每分钟一次就是"1/m"
log [prefix="日志条目的前缀"] [level="日志级别"] [limit value="rate/duration"]
# 匹配成功需要执行的动作,reject还可以指定拒绝的方式,例如reject type="icmp-admin-prohibited"
# 指定规则的优先级,越小越优先,指定优先级的规则比没有指定优先级的规则优先。没有显式指定优先级的规则之间则越先添加越优先。
priority="-32768到32767"
accept | reject [type="reject type"] | drop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

在命令中使用时不需要换行。

# 查询

# 列出指定区域的所有富规则
firewall-cmd --zone=[区域名] --list-rich-rules
# 查询指定区域是否存在指定富规则
firewall-cmd --zone=[区域名] --query-rich-rule='富规则语句'
1
2
3
4

# 新增

# 在指定区域内新增富规则
firewall-cmd --zone=[区域名] --add-rich-rule='富规则语句'
1
2

# 删除

# 在指定区域内删除富规则
firewall-cmd --zone=[区域名] --remove-rich-rule='富规则语句'
1
2

# 例子

# 实现共享上网,将来自局域网192.168.10.0/24网段访问外网的流量映射为网络出口公网IP,即修改源IP地址
firewall-cmd --zone=drop --add-masquerade
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.10.0/24 masquerade"

# 允许192.168.10.253的所有流量
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.10.253" accept"

# 记录来自特定地址的HTTP请求
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" service name="http" log prefix="HTTP_ACCESS" level="info" accept'

# 在特定时间段内允许8080端口的流量
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="8080" protocol="tcp" time day="Mon-Fri" timestart="09:00" timestop="17:00" accept'
1
2
3
4
5
6
7
8
9
10
11
12

# 其他命令

# 临时规则
# 在新增参数时使用,表示添加的是一个临时规则,调试使用的
firewalld-cmd [新增规则的参数] --timeout=[超时时间,单位秒]

# 应急命令
# 拒绝所有流量,远程连接会立即断开,只有本地能登陆
firewall-cmd --panic-on
# 取消应急模式,但需要重启firewalld后才可以远程ssh
firewall-cmd --panic-off
# 查看是否为应急模式
firewall-cmd --query-panic
1
2
3
4
5
6
7
8
9
10
11
#Linux#Firewalld#防火墙
Iptables
OpenVPN代理

← Iptables OpenVPN代理→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式