文章目录
一、防火墙以及Linux防火墙服务介绍
什么是防火墙,有什么用
防火墙是一种网络安全设备或软件,旨在监控和控制进出网络的流量,以保护内部网络免受外部攻击和不必要的访问。
防火墙的结构
- 策略规则:定义哪些流量被允许或阻止。
- 过滤引擎:分析流量并根据规则进行处理。
- 日志记录系统:记录流量和事件以供审计和分析。
- 用户接口:用于配置和管理防火墙的界面。
硬件组件:
- 网络接口卡、处理器、内存和存储设备。
软件组件:
- 操作系统、防火墙引擎、管理界面和日志处理程序。
规则集:
- 定义允许和阻止的流量类型的具体规则。
管理界面:
- 提供图形用户界面(GUI)或命令行界面(CLI),用于配置和管理防火墙设置。
监控工具:
- 用于实时监控流量和生成报告的附加工具。
防火墙的作用
- 流量控制:管理进出网络的数据包。
- 安全保护:防止未授权访问和恶意攻击。
- 隐私保护:隐藏内部网络结构和信息。
- 监控和报告:提供网络活动的可见性,便于问题排查和合规审计。
流量过滤:
- 允许或拒绝特定类型的数据包。
- 基于源和目的IP地址、端口号和协议进行过滤。
状态监控:
- 跟踪每个连接的状态,确保只有有效的连接能够通过。
日志记录和监控:
- 记录所有进入和出去的数据包,便于日后的审计和分析。
- 实时监控网络活动,及时发现异常行为。
访问控制:
- 定义用户或设备的访问权限,限制不必要的访问。
内容过滤:
- 根据内容类型(如URL、文件类型)阻止某些内容的传输。
带宽管理:
- 限制特定应用或用户的带宽使用,优化网络资源分配。
VPN支持:
- 提供安全的远程访问,通过加密保护数据传输。
攻击防护:
- 识别和阻止常见的攻击方式,如DDoS攻击、网络扫描等。
策略管理:
- 允许管理员根据需要配置和调整防火墙策略。
为什么需要防火墙
- 防护机制:抵御网络攻击、病毒和恶意软件。
- 数据保护:确保敏感信息不被泄露。
- 合规要求:满足行业标准和法律法规的安全要求。
防火墙何时需要开启
- 常规使用:在任何时候都应保持开启状态,以保护网络安全。
- 远程访问时:确保外部连接时仍然受到保护。
防火墙何时可以关闭
- 维护和配置:在进行维护或更新时,可能需要临时关闭,但应尽快重新开启。
- 特定测试:在进行特定网络测试时,需注意风险并在测试后及时开启。
总的来说,防火墙是保障网络安全的重要工具,应根据具体需求合理配置和管理。
防火墙的相关名词、功能和组成部分如下:
名词
- 网络防火墙:用于保护计算机网络的设备,监控和控制进出网络流量。
- 包过滤:根据预定规则检查数据包,并决定是否允许其通过。
- 状态检测:跟踪已建立连接的状态,允许合法流量并阻止非法流量。
- 代理防火墙:通过代理服务器处理流量,隐藏内部网络结构。
- 入侵检测系统(IDS):监控网络活动,识别潜在的安全威胁。
- 入侵防御系统(IPS):在识别威胁后主动阻止或修复攻击。
- 虚拟专用网络(VPN):通过加密通道安全地连接远程用户与内部网络。
- 应用层防火墙:在应用层检查流量,提供更细粒度的安全控制。
什么是入站?出站
在防火墙中,“入站”和“出站”是用来描述网络流量方向的两个基本概念。它们在配置防火墙规则时至关重要,下面是详细说明:
1. 入站流量(Inbound Traffic)
定义:入站流量指的是从外部网络(例如互联网)进入内部网络或计算机的所有数据包。
特点:
- 来源:入站流量的源地址通常是外部IP地址。
- 目的:目的地是防火墙内部的特定设备或服务(如服务器、工作站等)。
管理:- 规则设置:防火墙会根据设定的规则决定是否允许这些入站数据包通过。例如,可以允许某个端口的HTTP流量(如80端口),而阻止其他所有入站流量。
- 安全性:常见的入站流量控制措施包括:
- 限制特定IP的访问权限。
- 过滤特定协议(如只允许TCP或UDP)。
- 配置入侵检测和防御系统来监测异常活动。
2. 出站流量(Outbound Traffic)
定义:出站流量是指从内部网络或计算机发往外部网络的所有数据包。
特点:
- 来源:出站流量的源地址是内部设备的IP地址。
- 目的:目的地是外部IP地址(如访问互联网服务)。
管理:
规则设置:防火墙会根据设定的规则决定是否允许这些出站数据包通过。例如,可以允许所有出站HTTP流量,但禁止出站FTP流量。
安全性:常见的出站流量控制措施包括:
- 限制内网设备访问特定外部网站或服务。
- 监控和记录出站流量,以防止数据泄露或恶意软件通信。
- 通过代理服务器或VPN保护用户的隐私。
入站流量主要关注从外部进入内部网络的数据包,确保只有合法和安全的请求被允许。
出站流量则关注内部网络向外发送的数据,确保不发起不安全或未授权的连接。
设置合理的入站和出站规则是防火墙策略的重要组成部分,有助于增强网络的安全性和可靠性。
Linux防火墙发展历程
Linux的防火墙主要是通过iptables、nftables等工具来实现的,用以控制网络流量,保护系统免受不必要的访问和攻击。以下是Linux防火墙的发展历程及其基本概念。
1. 初期阶段
- IPChains:在Linux 2.2内核中引入,取代了早期的ipfw。IPChains使用链表结构(链)来管理网络流量,允许用户基于来源和目的IP地址、端口号等信息设置规则。
2. iptables的出现
- Iptables:在Linux 2.4内核中引入,成为了Linux防火墙的标准工具。iptables提供了更灵活和强大的功能,支持状态检测(stateful inspection),可以根据连接状态(如NEW, ESTABLISHED等)来匹配数据包。iptables采用表和链的结构,允许用户定义复杂的规则集。
3. 发展与扩展
- Netfilter:与iptables紧密集成,成为底层框架,负责处理网络包的过滤、修改和转发。Netfilter为iptables提供了一个强大的基础,使得开发者能够创建自定义的网络防火墙解决方案。
4. nftables的引入
- Nftables:在Linux 3.13内核中引入,旨在替代iptables。nftables简化了防火墙规则的管理,合并了iptables的多个模块,并且提供了更高效的性能和更现代的API。它使用一个单一的命令行工具
nft
来代替iptables、ip6tables等多个工具。
5. 当前状况
- 现代防火墙配置:目前,nftables已成为推荐的工具,许多新的Linux发行版默认支持它。同时,iptables依然被广泛使用,特别是在一些旧的系统中。两者都能提供强大的网络流量过滤能力。
6. 其他相关工具
- Firewalld:一个动态管理防火墙的工具,基于iptables或nftables,允许用户通过区域和服务来简化规则管理。
- Fail2ban:可以监控日志文件,自动添加iptables规则以阻止恶意IP地址,增强系统安全性。
Linux防火墙经历了从ipchains到iptables,再到nftables的演变过程,逐步提高了网络流量管理的灵活性和安全性。随着云计算和容器技术的发展,Linux防火墙也在不断适应新的网络环境,增强网络安全策略。
firewalld与nftables、iptables的区别
Firewalld、nftables 和 iptables 都是 Linux 系统中用于管理网络防火墙的工具,但它们在设计、功能和使用方式上有所不同:
iptables:
- 历史:iptables 是 Linux 系统中最早使用的防火墙工具之一,从 Linux 2.4 内核开始集成。
- 功能:它提供了一套复杂的规则集,用于控制进出网络接口的数据包。
- 复杂性:iptables 的规则是基于链的,规则的配置相对复杂,需要对网络协议有较深的理解。
- 性能:在处理大量并发连接时,性能可能不如 nftables。
nftables:
- 历史:nftables 是 iptables 的后继者,从 Linux 3.13 内核开始引入。
- 功能:它提供了更现代的框架,支持更复杂的规则表达和更高效的数据包处理。
- 表达性:nftables 使用表达式来定义规则,这使得规则更加灵活和强大。
- 性能:nftables 在处理大量并发连接时通常比 iptables 更高效。
- 兼容性:nftables 旨在与 iptables 兼容,因此许多 iptables 规则可以转换为 nftables 规则。
Firewalld:
- 历史:Firewalld 是一个较新的动态防火墙管理工具,它不直接处理数据包,而是管理 iptables 或 nftables 的规则。
- 功能:它提供了一个高级的配置界面,允许用户通过服务和区域的概念来管理防火墙规则。
- 易用性:Firewalld 使得防火墙规则的管理更加简单和直观,适合非专业用户。
- 动态性:Firewalld 可以动态地重新加载规则,而不需要重启服务。
- 服务和区域:Firewalld 允许定义服务(如 HTTP、SSH)和区域(如公共、工作、家庭),并为这些服务和区域配置规则。
主要区别:
- iptables 是一个低级别的工具,提供了直接控制数据包处理的能力,但配置相对复杂。
- nftables 是 iptables 的现代替代品,提供了更高效的性能和更灵活的规则表达方式。
- Firewalld 是一个高级管理工具,它抽象了 iptables 或 nftables 的复杂性,提供了更易于管理的界面。
使用场景:
- iptables 适合需要精细控制和优化性能的场景。
- nftables 适合需要高性能和复杂规则的场景。
- Firewalld 适合需要易于管理和动态配置的场景。
在选择使用哪个工具时,需要根据具体的网络需求、系统环境和用户的技术背景来决定。
二、CentOS7的firewalld使用
在CentOS7中,
firewalld
是一个动态管理防火墙的服务,提供了更简单、灵活的方式来配置和管理防火墙规则。以下是关于firewalld
的详细说明,包括其基本概念、使用方法以及常见命令。一. 基本概念
- 区域(Zones):
firewalld
使用区域来定义不同网络连接的信任级别。每个区域都有一组规则,可以根据连接的来源IP或网络接口来应用。- 服务(Services):预定义的服务(如HTTP、SSH等)可以方便地添加到区域中。每个服务对应一组端口和协议。
- 规则(Rules):可以手动创建自定义规则,指定允许或拒绝的流量。
二、 2. 安装和启动
默认情况下,
firewalld
在CentOS 7中是预安装的。可以通过以下命令检查其状态并启动:
# 检查firewalld状态
sudo systemctl status firewalld
# 启动firewalld
sudo systemctl start firewalld
# 设置开机自启
sudo systemctl enable firewalld
三. 常见命令
查看当前状态和区域
# 查看firewalld状态
sudo firewall-cmd --state
查看可用区域和服务
# 查看所有可用区域
sudo firewall-cmd --get-zones
# 查看某个区域支持的服务
sudo firewall-cmd --zone=public --list-services
添加和移除服务
# 将服务添加到公共区域
sudo firewall-cmd --zone=public --add-service=http --permanent
# 移除服务
sudo firewall-cmd --zone=public --remove-service=http --permanent
# 重新加载配置以应用更改
sudo firewall-cmd --reload
添加和移除端口
# 开放特定端口(例如TCP 8080)
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 移除特定端口
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
# 重新加载配置
sudo firewall-cmd --reload
临时规则
如果不想在防火墙重启(使用
firewall-cmd --reload
重载)后保留规则,可以省略--permanent
选项:
# 添加临时规则
sudo firewall-cmd --zone=public --add-service=ftp
# 移除临时规则
sudo firewall-cmd --zone=public --remove-service=ftp
查看规则
# 查看当前区域的配置 sudo firewall-cmd --zone=public --list-all
四. 配置文件
firewalld
的配置文件位于/etc/firewalld/
目录下,主要有:
firewalld.conf
:主配置文件,设置全局参数。zones/
:存储每个区域的配置文件。services/
:存储服务定义的 XML 文件。
五. 重要注意事项
- 在添加新的防火墙规则时,要确保不会阻止SSH连接(如果远程管理)。
firewalld
的规则在重启后会保持,常规更改需使用--permanent
选项。
firewalld
为CentOS7提供了一个灵活易用的防火墙管理工具,通过区域和服务的概念,使得管理网络安全变得更加直观和高效。利用其动态特性,可以实时调整规则,而无需重启服务或系统。
系统firewalld服务启停、状态查看
# 状态查看
systemctl status firewalld
# 启停
systemctl start firewalld
systemctl stop firewalld
firewalld区域管理概念
预定义的一些区域:
什么意思,为什么使用区域?
firewalld使用区域来定义不同网络连接的信任级别。每个区域都有一组规则,可以根据连接的来源IP或网络接口来应用。
Firewalld 是一个动态管理防火墙的工具,允许用户通过区域(zones)来组织和管理不同的网络连接。以下是关于 Firewalld 区域管理的详细说明以及使用区域的原因。
1. 区域的定义
- 每个区域代表了一组规则,这些规则定义了允许和拒绝的流量。
- Firewalld 默认提供多个预定义区域,如
public
、internal
、trusted
等。
2. 区域的功能
- 流量控制:每个区域可以设置不同的入站和出站规则,允许或拒绝特定的服务和端口。
- 动态变化:区域可以根据网络环境的变化动态调整,而不需要重新加载防火墙。
3. 常见区域
- trusted:信任所有流量,通常用于内部网络。
- home:适合家庭网络,允许常见的家庭服务。
- work:适合工作网络,限制不必要的外部访问。
- public:默认区域,通常用于公共网络,限制大部分流量。
- dmz:用于隔离特定服务(如Web服务器)以保护内网。
这段内容描述的是网络安全中不同网络区域的配置和用途:
trusted:这个区域配置信任所有流量。这意味着在该区域内的设备可以自由地发送和接收数据,没有限制。这种设置通常用于内部网络,比如公司内部的局域网,因为内部网络中的设备被认为是可信的。
home:这个区域配置适合家庭网络使用。它允许常见的家庭服务,如在线游戏、流媒体服务等。家庭网络通常需要访问这些服务,因此配置较为宽松。
work:这个区域配置适合工作网络。它限制了不必要的外部访问,以保护网络内的资源不被外部未经授权的访问。这种设置适用于办公环境,确保只有必要的服务可以被外部访问。
public:这是默认的网络区域,通常用于公共网络。它限制了大部分流量,只允许最基本的网络服务,如网页浏览和电子邮件。这种设置用于公共场合,如图书馆、咖啡厅等,以保护用户的安全和隐私。
这些设置有助于根据不同的使用场景和安全需求来调整网络的访问控制。
为什么使用区域
1. 简化管理
- 区域提供了一种简洁的方法来管理和组织不同网络接口的访问策略。通过将相似的规则归类到同一区域,管理变得更直观。
2. 灵活性
- Firewalld 允许根据网络环境动态切换区域,用户可以在不同的网络连接间快速切换,从而适应不同的安全需求。
3. 安全性
- 使用不同的区域可以确保更高的安全性。例如,可以将公共Wi-Fi连接设置为
public
区域,仅允许最基本的流量,而将内部网络设置为trusted
区域,允许更多的流量。
4. 细粒度控制
- 可以对每个区域定义不同的服务、端口和协议,从而实现精细的流量控制。这种分层管理能够更有效地减少潜在的攻击面。
5. 适应多样化环境
- 在具有多个网络接口或多种网络环境的设备上(如路由器、网关),区域管理使得配置更容易并且可维护。
Firewalld 的区域管理提供了一种灵活且高效的方式来控制网络流量,通过将不同的网络连接与相应的安全策略关联,可以显著提升系统的安全性和管理的便利性。这种分区方法使得用户能够根据实际需求对防火墙进行优化配置。
firewall-cmd命令
一些选项解释
状态选项:
1、firewall-cmd --state
检查firewalld守护进程是否处于活动状态(即正在运行)。如果活动,则返回退出代码0;如果在启动时发生故障,则返回RUNNING BUT FAILED;否则返回NOT RUNNING。请参阅“退出代码”部分。这也会将状态打印到标准输出(STDOUT)。
2、firewall-cmd --reload
重新加载防火墙规则并保留状态信息。当前的永久配置将成为新的运行时配置,即所有仅在运行时进行的更改在重新加载时会丢失,如果它们没有同时在永久配置中。
注意:通过直接接口应用的运行时更改不受影响,因此在完全重启firewalld守护进程之前,它们将保持不变。
3、firewall-cmd --complete-reload
完全重新加载防火墙,包括netfilter内核模块。这很可能会终止活动连接,因为状态信息会丢失。这个选项应该只在防火墙出现严重问题时使用。例如,如果存在状态信息问题,导致无法用正确的防火墙规则建立连接。
注意:通过直接接口应用的运行时更改不受影响,因此在完全重启firewalld守护进程之前,它们将保持不变。
4、 firewall-cmd --runtime-to-permanent
保存活动运行时配置,并用它覆盖永久配置。这种方式的工作原理是,在配置firewalld时,你只进行运行时更改,一旦你对配置感到满意,并且测试了它按照你想要的方式工作,就将配置保存到磁盘。
注:
在使用 Firewalld 时,--permanent
和--runtime-to-permanent
的作用是将规则保存为永久配置,但这两者的行为和后续步骤的影响如下:1. 使用
--permanent
- 当你使用
--permanent
添加或修改规则时,这些更改会被保存,但不会立即应用到当前运行的防火墙配置中。- 不写
--reload
:这些更改不会生效,直到你执行--reload
。此时,之前添加的规则会在下次防火墙重启时生效。2. 使用
--runtime-to-permanent
- 这个选项用于将当前的临时规则保存为永久规则。
- 不写
--reload
:同样,这些更改会被保存,但不会立即应用到当前的防火墙配置中,直到你再次执行--reload
。影响
- 不写
--reload
的结果:
- 新增的永久规则不会立刻生效,你需要手动执行
--reload
才能使它们生效。- 如果你只希望临时测试某些规则,而不想立即影响现有配置,那么可以选择不执行
--reload
。为了使
--permanent
或--runtime-to-permanent
添加的更改立即生效,最好执行
--reload
。如果不执行,新增的规则将在下次重启 Firewalld 时生效,但在此之前不会对当前的连接或流量产生影响。
永久选项
--permanent
–permanent选项可用于永久设置选项。这些更改不会立即生效,只有在服务重启/重新加载或系统重启后才会生效。如果没有–permanent选项,更改将只作为运行时配置的一部分。
如果你想在运行时和永久配置中进行更改,请使用相同的调用,同时使用和不使用–permanent选项。
区域选项
firewall-cmd --get-default-zone
打印连接和接口的默认区域。
firewall-cmd --set-default-zone=zone名
更改连接或选定的默认区域的区域。设置默认区域。
这是一个运行时和永久性的更改。
会立即生效,无需再写--permanent
--get-active-zones
打印当前激活的区域以及与之绑定的接口。激活的区域是那些绑定到接口或源的区域。输出格式为:
区域1 接口:接口1 接口2…
源:源1
区域2 接口:接口1…
源:源2…
如果没有接口或源绑定到区域,则相应的行将被省略。
firewall-cmd --get-active-zones
没有输出结果的原因
firewall-cmd --get-active-zones
没有输出结果的原因可能有以下几种:
没有激活的接口:
firewalld
是基于网络接口和区域进行管理的。如果没有任何网络接口被分配到活动区域,命令将不会返回任何结果。在你的输出中,interfaces:
字段为空,表明没有接口与public
区域关联。防火墙未启动或未正确配置:
- 如果
firewalld
服务没有运行,或者启动时没有加载任何配置,可能会导致没有活动区域。可以使用systemctl status firewalld
检查服务状态。接口未配置或未连接:
- 如果服务器上的网络接口未连接或没有配置有效的IP地址,
firewalld
可能无法识别该接口并将其分配到区域。区域配置问题:
- 如果在配置文件中没有正确设置区域或接口,也可能导致
--get-active-zones
没有输出。
firewall-cmd --list-all
查看当前默认区域的所有规则
内容解释:
LOCATION?????????????????
icmp-block-inversion——icmp块是否开启?
——当前区域监听的网卡?
——来源的IP/网段?
——允许访问的服务
——允许访问的端口
——允许访问的协议
——IP是否伪装?(内网网卡伪装外网网卡上网)
- 实现内网主机间共享上网
- 增强网络的安全性
- 支持网络地址转换??????
——端口映射?
——来源端口?
——icmp块?
——富规则?
重载防火墙——
firewall-cmd --reload
firewall-cmd --reload
与systemctl restart firewalld
的区别
firewall-cmd --reload
和 systemctl restart firewalld
或 systemctl reload firewalld
是两种管理防火墙服务的方法,但它们的作用和效果有所不同:
firewall-cmd --reload
:- 此命令用于重新加载防火墙配置,而不停止防火墙服务。它会使更改立即生效,尤其是当你已经使用
firewall-cmd
命令修改了规则时。 - 在执行此命令时,活动连接不会中断,现有的规则会保持不变,仅更新配置。
- 此命令用于重新加载防火墙配置,而不停止防火墙服务。它会使更改立即生效,尤其是当你已经使用
systemctl restart firewalld
:- 此命令停止并重新启动
firewalld
服务。这意味着所有活动的连接都会被重置,所有规则会被清空,然后根据配置文件重新应用。 - 这可能会导致短暂的网络中断,因为防火墙会暂时不可用。
- 此命令停止并重新启动
systemctl reload firewalld
:- 此命令也是尝试重新加载
firewalld
的配置,但并不一定会像firewall-cmd --reload
那样涉及到具体的规则更新。实际上,某些系统可能并不支持这一命令。 - 在很多情况下,
systemctl reload
主要用于让服务重新读取其配置文件,而不停止服务。
- 此命令也是尝试重新加载
总结:
- 使用
firewall-cmd --reload
是为了在不影响当前连接的情况下更新防火墙规则。 - 使用
systemctl restart firewalld
会重启服务并导致连接中断。 systemctl reload firewalld
的效果依赖于具体实现,可能并不如前者直观。
为什么谨慎用systemctl restart firewalld
???
前者是在防火墙服务运行的时候重载,而后者需要将整个防火墙服务关闭,再打开,这是非常危险的!!!!
谨慎使用 systemctl restart firewalld
的原因主要包括以下几点:
连接中断:
- 重启防火墙会导致所有当前的网络连接被中断,这可能会影响到正在进行的会话、数据传输或用户体验,特别是在服务器上。
服务依赖性:
- 如果有其他服务依赖于防火墙的规则(如 VPN、Web 服务器等),重启防火墙可能会导致这些服务无法正常工作,甚至造成系统不稳定。
配置错误:
- 如果在重启前没有仔细检查和验证防火墙配置,可能会导致在重启后出现意外的访问问题,比如阻止合法流量或允许不该允许的流量。
可能的安全风险:
- 在重启期间,防火墙可能会暂时不提供保护,导致系统在此期间暴露于潜在的安全风险中。
监控与告警:
- 对于运行在生产环境中的系统,重启防火墙可能会触发监控系统的告警,导致运维人员额外关注和处理。
区域设置相关命令
默认使用public中内容
获取防火墙的默认区域内容——
firewall-cmd --get-default-zone
切换默认区域——
firewall-cmd --set-default-zone=区域名
获取防火墙定义的所有区域——
firewall-cmd --get-zones
新增防火墙的区域——
firewall-cmd --new-zone=新增的区域名 --permanent
+firewall-cmd --reload
必须要运行时重载(热重载),才能生效
删除防火墙的区域——
firewall-cmd --delete-zone=要删除的区域名 --permanent
+firewall-cmd --reload
--permanent
的作用?
如果不想在防火墙重启(使用firewall-cmd --reload
重载)后保留规则,可以省略--permanent
选项,如果使用了--permanent
需要结合firewall-cmd --reload
,使其完全生效
服务入站出站相关命令
什么是防火墙的服务入站出站?
查看防火墙支持的服务——
firewall-cmd --get-services
“支持的“什么意思?????
为默认区域(从防火墙支持的服务中选一个)添加服务——
firewall-cmd --add-service=服务名 --permanent
+firewall-cmd --reload
为默认区域(默认区域中已有此服务)移除服务——
firewall-cmd --remove-service=服务名
端口入站出站相关命令
什么是防火墙的端口的入站出站?
为默认区域添加新端口——
firewall-cmd --add-port=端口号/协议名 --permanent
为默认区域删除端口——
firewall-cmd --remove-port=端口号/协议名 --permanent
端口及fiewalld支持的协议解释
firewall-cmd --add-port=443/tcp
和firewall-cmd--add-port=443/https
是不等价的。
端口和协议:
firewall-cmd --add-port=443/tcp
明确指定了使用 TCP 协议在 443 端口上开放。firewall-cmd --add-port=443/https
是不正确的,因为--add-port
命令中不支持使用服务名称(如 HTTPS)。你必须使用协议类型(如tcp
或udp
)。可以使用的协议名:
- 在
--add-port=端口号/协议名
中,协议名通常是tcp
或udp
。- 具体支持的协议还可能因防火墙配置而异,但常见的包括:
tcp
: 传输控制协议udp
: 用户数据报协议使用服务名称:
- 如果你希望使用服务名称,可以用
--add-service=<service_name>
命令,例如firewall-cmd --add-service=https
。这会自动开放与该服务关联的端口和协议。总结来说,使用
--add-port
时只能指定端口和协议类型,而不能使用服务名称。
端口范围是1-65535的原因主要与TCP/IP协议中的端口分类和数值表示有关:
16位无符号整数:
- 在TCP/IP协议中,端口号是用16位的无符号整数表示。16位的二进制数可以表示的最大值是 (2^{16} - 1 = 65535),因此端口号的有效范围是从0到65535。
端口分类:
- 端口号被分为三类:
- 知名端口(Well-known ports):范围是0-1023,这些端口通常由系统或应用程序使用,如HTTP(80)、HTTPS(443)等。
- 登记端口(Registered ports):范围是1024-49151,这些端口可以由用户或应用程序注册和使用。
- 动态或私有端口(Dynamic/Private ports):范围是49152-65535,通常用于客户端临时使用。
历史原因:
- TCP/IP协议在设计时就规定了这一范围,以便于互联网的标准化与管理。
因此,端口号的范围是1-65535,是由于其数据结构的限制以及网络协议的设计需求。端口0通常不被使用,因为它不是一个有效的服务端口。
firewalld
支持的协议主要包括以下几种:
- tcp:传输控制协议,用于面向连接的通信。
- udp:用户数据报协议,用于无连接的通信。
- icmp:互联网控制消息协议,用于发送控制消息,例如ping命令的响应。
- esp:封装安全载荷协议,通常用于IPSec VPN。
- ah:认证头协议,通常用于IPSec VPN。
- sctp:流控制传输协议,用于支持多流传输。
在使用
firewalld
时,您可以通过指定这些协议来添加规则。例如:
firewall-cmd --add-port=80/tcp
firewall-cmd --add-port=53/udp
这些协议在配置防火墙时提供了灵活性,确保您能够根据不同的网络需求设置合适的规则。
网卡入站出站相关命令
什么是防火墙的网卡的入站出站?
添加网卡到指定区域——
firewall-cmd --add-interface=网卡名 --zone=区域名
删除网卡从指定区域(如果事先已在那个区域的话)
——firewall-cmd --remove-interface=网卡名 --zone=区域名
测试例子:
1、使用firewalld各个区域规则结合配置,调整默认public区域拒绝所有流量,但如果来源IP时10.0.0.0/24网段则允许
# 切换到public区域
firewall-cmd --zone=pulic
# 拒绝所有流量
删除所有服务和端口
--remove-service=xxx1 --remove-service=xxx2
--remove-port=xxx xxx
# 仅允许10.0.0.0/24网段来源
--add-source=10.0.0.0/24
2、查询public区域是否允许请求SSH的流量
firewall-cmd --zone=public --query-service=ssh
自定义配置防火墙支持服务内容
编写自定义服务xxx.xml,添加xxxx.xml到**/usr/lib/firewalld/services**目录中
如:添加sersync服务:
?????
/usr/lib/firewalld/services与/etc/firewalld/services区别
/etc/firewalld/services
和 /usr/lib/firewalld/services
之间的主要区别在于它们的用途和优先级:
路径与用途:
/usr/lib/firewalld/services
:- 这是系统默认的服务定义目录,包含了
firewalld
的所有标准服务配置文件。这些文件由操作系统或firewalld
包提供,通常在安装时创建。 - 这个目录中的服务定义是只读的,用户不应该直接在这里修改文件。
- 这是系统默认的服务定义目录,包含了
/etc/firewalld/services
:- 这是用户自定义的服务定义目录,允许用户根据自己的需求进行修改和扩展。
- 如果您希望添加、修改或删除服务,可以在这个目录中创建或编辑服务文件,这样的更改不会影响系统默认配置。
优先级:
- 当
firewalld
启动时,它会首先读取/etc/firewalld/services
中的服务定义,如果该目录中没有对应的服务定义,才会回退到/usr/lib/firewalld/services
。 - 这意味着
/etc/firewalld/services
中的配置优先于/usr/lib/firewalld/services
中的配置。
- 当
使用场景:
- 如果您需要添加额外的服务或自定义现有服务的行为,应在
/etc/firewalld/services
中进行操作。 - 如果您只是想查看系统提供的服务或使用默认配置,则可以查看
/usr/lib/firewalld/services
。
- 如果您需要添加额外的服务或自定义现有服务的行为,应在
总之,/etc/firewalld/services
是用于用户自定义和扩展的配置目录,而 /usr/lib/firewalld/services
则是系统默认的服务定义库。
配置端口转发策略
firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
# 开启IP伪装
firewall-cmd --add-masquerade
配置富规则
什么是防火墙富规则?
??????????????????
如何配置
选项解释
- reject与drop
翻译:
一个动作可以是接受(accept)、拒绝(reject)、丢弃(drop)或标记(mark)之一。
规则可以包含一个元素,或者只包含一个源地址。如果规则包含一个元素,那么与该元素匹配的新连接将按照动作来处理。如果规则不包含元素,那么来自源地址的所有内容将按照动作来处理。
- 接受 [限制值=“速率/时长”]
- 接受:所有新的连接尝试都将被允许。
- 拒绝 [类型=“拒绝类型”][限制值=“速率/时长”]
- 拒绝:它们将不被接受,它们的源地址将收到一个拒绝 ICMP(v6) 消息。拒绝类型可以设置以指定适当的 ICMP(v6) 错误消息。有效的拒绝类型请参见 iptables-extensions(8) 手册页中的
--reject-with type
。由于
IPv4 和 IPv6 的拒绝类型不同,使用拒绝类型时必须指定规则族。- 丢弃 [限制值=“速率/时长”]
- 丢弃:所有数据包将立即被丢弃,不会向源发送任何信息。
- 标记 设置=“标记[/掩码]”[限制值=“速率/时长”]
- 标记:所有数据包将在 mangle 表的 PREROUTING 链中用标记和掩码组合进行标记。有关限制标签的描述,请参见“限制”部分。
富规则的动作何时使用?如何使用?
在定义firewalld的富规则时,动作(action)是规则的关键部分,它决定了当数据包匹配规则时要执行的操作。以下是何时需要加动作以及何时不需要加动作的情况:
需要加动作的情况:
- 当你想要明确指定如何处理匹配规则的数据包时。例如:
accept
:当你希望允许符合条件的连接时使用。例如,允许特定IP地址的SSH访问 。reject
:当你希望拒绝某个特定的连接,并且通知发送方连接被拒绝时使用。例如,拒绝某个网段通过SSH连接服务器 。drop
:当你希望拒绝连接但不通知发送方时使用,这通常是对于不需要的或者潜在的恶意流量 。mark
:当你需要对匹配的数据包进行标记,以便后续的处理,如网络路由或者QoS(服务质量)时使用。不需要加动作的情况:
- 当规则用于设置端口转发(
forward-port
)或者地址伪装(masquerade
)时,这些规则类型不允许指定动作,因为它们的动作是隐含的
。- 当规则用于日志记录(
log
)或者审计(audit
)时,这些操作本身就是动作的一部分,不需要额外指定接受或拒绝 。例如,如果你想要允许来自特定源地址的所有新连接尝试,你会使用
accept
动作。如果你想要丢弃来自某个源地址的所有包,并且不向源地址发送任何回应信息,你会使用drop
动作。在定义规则时,动作是必需的,因为它指示防火墙在匹配规则时要执行的操作。如果没有指定动作,防火墙将不知道如何处理匹配的数据包。
总结来说,动作是富规则中用于决定数据包命运的关键指令,几乎所有的富规则都需要指定一个动作,除了那些隐含动作的规则类型(如端口转发和地址伪装),以及那些本身就是动作的规则类型(如日志记录和审计)。
例子
# 为默认区域添加:配置允许10.0.0.0/24主机访问HTTP服务
firewall-cmd --add-rich-rule='rule family="ipv4" source address=10.0.0.0/24 service name="http" accept'
# 为默认区域添加:配置允许172.16.1.0/24主机访问22端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address=????????????????????'
# 为默认区域添加:允许所有人能访问http,https服务,但只有10.0.0.1主机可以访问ssh服务
firewall-cmd --add-rich-rule='rule family="ipv4" service name="http https" accept'
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.1" service-name="ssh" accept'
# 为默认区域添加:当用户来源IP是10.0.0.1时,将用户请求的5555端口,转发到后端的172.16.1.7的22端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.1" forward-port port="5555" protocol="tcp" to-port="22" to-addr="172.16.1.7"'
# 为默认区域移除上面一条的规则
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="10.0.0.1" forward-port port="5555" protocol="tcp" to-port="22" to-addr="172.16.1.7"'