Linux 系统启动原理

/etc/fstab 引起的系统启动问题

环境准备

# 设置磁盘分区管理方案
[root@server ~ 17:00:31]# parted /dev/sdb mklabel msdos

# 创建分区
[root@server ~ 17:00:57]# parted /dev/sdb unit MiB mkpart primary 1 10241

# 格式化为xfs文件系统
[root@server ~ 17:02:15]# mkfs.xfs /dev/sdb1

# 创建挂载点
[root@server ~ 17:02:25]# mkdir /data01

# 设置持久化挂载
[root@server ~ 17:02:34]# echo '/dev/sdb1 /data01 xfs defaults
 0 0' >> /etc/fstab

# 挂载并验证
[root@server ~ 17:03:10]# mount -a
[root@server ~ 17:03:14]# df -h /data01
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1        10G   33M   10G    1% /data01

故障1:挂载点不存在

环境准备

[root@server ~ 17:05:10]# umount /data01
[root@server ~ 17:05:14]# rmdir /data01

重启系统验证

# 可以正常进入系统,挂载点会被自动创建
[root@server ~ 17:05:53]# df -h /data01
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1        10G   33M   10G    1% /data01

故障2:设备名称写错或者找不到设备

环境准备

[root@server ~ 17:06:03]# vim /etc/fstab
# 将原先的sdb1修改为sdc1
/dev/sdc1 /data01 xfs defaults 0 0

重启系统验证

  1. 启动过程中找不到该设备。
  2. 1分30秒超时后,进入emergency模式,进行修复。

修改为正确的值或者注释该条目,确保系统正常启动。

3.然后输入exit,继续启动。

故障3:破坏文件系统

环境准备

[root@server ~ 17:18:39]# dd if=/dev/zero of=/devsdb1 bs=1M count=1
记录了1+0 的读入
记录了1+0 的写出
1048576字节(1.0 MB)已复制,0.00393286 秒,267 MB/秒

重启系统验证

  1. 系统启动过程中尝试修复文件系统,修复失败后提示进入 emergency 模式修复。

image-20250805105612798

  1. 输入root 密码进入emergency 模式。
# 执行以下命令修复
xfs_repair /dev/sdb1

修复完成后,输入 exit 正常启动系统。

grub2 配置

grub2 配置文件

grub2 的主要配置文件如下:

  • /boot/grub2,grub2的主要配置文件所在目录,例如grub.cfg、grubenv、user.cfg。
  • /etc/grub2.cfg
  • /etc/grub2.cfg 是指向 /boot/grub2/grub.cfg的软连接。
  • 不要直接修改/etc/grub2.cfg文件,该文件由系统自动生成。如果需要自定义这个文件,可以通过修改/etc/grub.d/中脚本和/etc/default/grub文件,然后通过grub2-mkconfig命令生成。

使用efi启动方式的grub2配置文件是/etc/grub2-efi.cfg。

  • /etc/grub.d/,该目录下存放多个数字开头的脚本,按照从小到大的顺序执行。例如00_header会调用/etc/default/grub配置文件来实现最基本的开机界面配置。
  • /etc/default/grub,定义grub启动部分变量信息,例如grub启动菜单选择条目的超时时间,内核参数等。
  • /boot/grub2/grubenv,设定默认启动条目。

grub 菜单超时时间

[root@server ~ 17:20:24]# vim /etc/default/grub
# 修改GRUB_TIMEOUT为10
GRUB_TIMEOUT=10

# 生效grub2.cfg配置文件
[root@server ~ 17:21:14]# grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-e0c792c06984499e89f59900510a5736
Found initrd image: /boot/initramfs-0-rescue-e0c792c06984499e89f59900510a5736.img
done

# 重启
[root@server ~ 17:21:48]# reboot

kernel 启动参数

[root@server ~ 17:22:50]# vim /etc/default/grub
# 修改GRUB_CMDLINE_LINUX,例如在最后添加参数console=ttyS0,导致不显示启动过程
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet console=ttyS0"
# console=ttyS0: 启动过程信息显示到 ttyS0 终端,导致启动过程是tty1上不显示启动消息。
# rhgb:启用图形化启动界面(Red Hat Graphical Boot)。
# quiet:减少启动过程中的日志输出(只显示重要信息), debug 开启调试模式(显示详细启动日志)

# 生成grub2.cfg配置文件,重启验证
[root@server ~ 17:23:45]# grub2-mkconfig -o /etc/grub2.cfg
[root@server ~ 17:24:17]# reboot

效果如下:

image-20221227080119071

grub 菜单加密

# 查看/etc/grub.d/01_users脚本
[root@server ~ 17:25:20]# cat /etc/grub.d/01_users
#!/bin/sh -e
cat << EOF
if [ -f \${prefix}/user.cfg ]; then
  source \${prefix}/user.cfg
  if [ -n "\${GRUB2_PASSWORD}" ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root \${GRUB2_PASSWORD}
  fi
fi
EOF

# 生成grub2密码
[root@server ~ 18:38:53]# grub2-mkpasswd-pbkdf2
输入口令:
Reenter password: 
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.FB9ABE818ED88D20D700D30465F26C55821478C9BFFA2CD9951B47F73A8C42C59D5CEA53AF4FDB39B48D5633E631CED0CC01704058010D0C42207331F6E78C13.425FED118441D1D950561285EA4A54DC59FB0DD2943241AC7981CEE8DDB8F4F3224E5731B3DF86E92C1C6E2866F033C00E415EDFC3E4B3E364DEEF6E9A7CDA1B

# 创建文件
[root@centos7 ~]# vim /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.FB9ABE818ED88D20D700D30465F26C55821478C9BFFA2CD9951B47F73A8C42C59D5CEA53AF4FDB39B48D5633E631CED0CC01704058010D0C42207331F6E78C13.425FED118441D1D950561285EA4A54DC59FB0DD2943241AC7981CEE8DDB8F4F3224E5731B3DF86E92C1C6E2866F033C00E415EDFC3E4B3E364DEEF6E9A7CDA1B

# 生成grub2.cfg配置文件,重启验证
[root@server ~ 18:41:20]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-e0c792c06984499e89f59900510a5736
Found initrd image: /boot/initramfs-0-rescue-e0c792c06984499e89f59900510a5736.img
done
[root@server ~ 18:42:25]# reboot

效果如下:

  1. 启动菜单界面,按e编辑。

  2. 输入用户名root,密码redhat。

​ 3.弹出如下菜单,可以编辑了。

思考:如何解除 grub 菜单加密?

grub2 故障处理

MBR 组成回顾

主引导扇区由三个部分组成:

image-20221225080625691

  • 引导程序(占446个字节),硬盘启动时将系统控制权转给分区表中的某个操作系统。
  • 磁盘分区表项(DPT,Disk Partition Table),由四个分区表项构成(每个16个字节)。
  • 结束标志(占2个字节),其值为AA55(十六进制)。

grub 引导程序故障思路

1.通过光盘启动的目的是将硬盘上的系统挂载到内存中,并进行修复。

2.我们也可以通过U盘启动盘启动或者将故障磁盘拔下来挂载到其他系统。

思考

1. 如何避免别人获得磁盘后,读取磁盘中数据?

在 CentOS 7 中,通常使用 LUKS(Linux Unified Unified Key Setup,Linux 统一密钥设置) 对磁盘或分区进行加密(你提到的 “lunks” 应为 “LUKS” 的拼写误差)。LUKS 是 Linux 下主流的磁盘加密标准,通过加密整个分区或逻辑卷,保护数据安全。

在操作系统安装配置安装位置的时候,可以使用LUKS加密磁盘。

image-20250804210103538

效果:

  1. 系统启动的时候,必须输入密码才能读取,硬盘中数据。

QQ_1722936672737

  1. 修复磁盘的时候,同样需要输入密码。

QQ_1722936900646

**==提示:==**该加密操作不会加密grub2系统选择菜单,也就是/boot目录中数据。

2. 为什么将vmlinuz(kernel)和initramfs(user)分开?

  1. 职责分离,降低维护复杂度

vmlinuz 是压缩后的 Linux 内核镜像,核心作用是提供系统运行的基础内核功能,比如进程管理、内存管理、基础调度等核心能力,它是系统运行的核心骨架,**需保持通用性和稳定性,不能频繁改动。**而 **initramfs 是临时内存文件系统,核心职责是补充启动所需的 “辅助工具”,比如特定磁盘驱动、LVM 逻辑卷模块、LUKS 加密解密工具等。**二者分离后,内核升级无需同步修改驱动等辅助组件,驱动更新也不用重新编译内核,大幅降低了系统维护难度。

  1. 精简内核体积,提升启动效率

**若将所有硬件驱动、特殊存储所需模块都集成进 vmlinuz,会让内核体积急剧增大。**vmlinuz 作为需被引导加载器加载到内存的文件,体积过大会延长加载时间和内核解压耗时。而 initramfs 仅包含当前硬件和存储环境必需的模块,是按需定制的轻量化组件。这种拆分让 vmlinuz 保持小巧,加载和解压更快,同时 initramfs 的轻量化设计也能快速完成临时系统初始化。

  1. 适配多硬件与场景,增强通用性

不同设备的硬件配置差异极大,比如有的用 SATA 硬盘、有的用 NVMe 硬盘,还有的依赖 RAID 阵列或加密存储。若内核集成所有硬件的驱动,既不现实也会造成冗余。initramfs 可针对不同硬件环境定制生成,包含对应驱动和工具。同一版本的 vmlinuz 搭配不同的 initramfs,就能适配台式机、服务器、嵌入式设备等多种硬件场景,让 Linux 系统的硬件兼容性大幅提升。

3. Linux为什么不直接使用真正的根启动?

  1. 缺少驱动,无法识别真正的根设备

真正的根文件系统通常存储在硬盘、SSD 等存储设备上,而这些设备需要对应的驱动程序才能被内核识别。但 vmlinuz 作为通用内核,仅集成少量通用驱动,无法覆盖所有特殊存储硬件(如 NVMe 硬盘、RAID 控制器等)。此时 initramfs 可先加载这些缺失的驱动模块,让内核能识别到存储设备,后续才能挂载真正的根文件系统。若直接启动真正的根,内核会因无法识别存储设备而启动失败。

  1. 无法处理复杂的根目录配置

现代 Linux 系统中,根文件系统常涉及复杂配置:比如采用 LVM 逻辑卷管理磁盘分区、通过 LUKS 实现全盘加密、根目录存储在网络设备上等。这些场景都需要在挂载根目录前执行额外操作,如激活 LVM 卷、解密加密分区、连接网络等。而真正的根文件系统未挂载时,这些操作无法执行。initramfs 作为临时系统,可提前运行对应的工具和脚本完成这些操作,为真正根目录的挂载铺路。

  1. 保障启动流程的稳定性与安全性

真正的根文件系统可能存在损坏、挂载异常等问题。若直接启动真正的根,一旦出现问题,系统会直接卡死且难以排查。而 initramfs 作为过渡层,可在挂载真正根之前做基础检查,若发现问题还能提供应急修复环境。此外,对于加密存储的根目录,initramfs 可在临时环境中完成解密流程,避免解密逻辑直接暴露在核心内核中,也提升了系统启动的安全性。

Linux 防火墙管理

防火墙介绍

防火墙( FireWall ),工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略,将希望外网访问的主机放在 DMZ(demilitarized zone)网络中。

防火墙类型

按保护范围划分:

  • 主机防火墙:服务范围为当前一台主机。
  • 网络防火墙:服务范围为防火墙一侧的局域网。

按实现方式划分:

  • 硬件防火墙:在专用硬件级别实现防火墙功能,例如华为、华三、天融信等产品。
  • 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,例如iptables,firewalld。

按网络协议划分:

  • 网络层防火墙:工作在OSI 模型下四层,又称为包过滤防火墙。
  • 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过。
  • 优点:对用户来说透明,处理速度快且易于维护。
  • 缺点:无法检查应用层数据,如病毒等。

img

  • 应用层防火墙/代理服务器:工作在OSI 模型七层或者承担proxy 代理网关。
  1. 异常检测协议:Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。
  2. 增强的输入验证:可以有效防止网页篡改、信息泄露、木冯植入等恶意网络入侵行为。从而减小Web服务器被攻击的可能性。
  3. 及时补丁:修补Web安全漏洞,是Web应用开发者最头痛的问题,没人会知道下一秒有什么样的漏洞出现,会为Web应用带来什么样的危害。现在WAF(Web Application Firewall)可以为我们做这项工作了:只要有全面的漏洞信息WAF能在不到一个小时的时间内屏蔽掉这个漏洞。当然,这种屏蔽掉漏洞的方式不是非常完美的,没有安装对应的补丁本身就是一 种安全威胁,但我们在没有选择的情况下,任何保护措施都比没有保护措施更好。
  4. 基于规则的保护和基于异常的保护:基于规则的保护可以提供各种Web应用的安全规则,WAF(Web Application Firewall) 生产商会维护这个规则库,并时时为其更新。用户可以按照这些规测对应用进行全方面检测。
  5. **状态管理。**WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登陆失败),并組在达到极限值时进行处理。这对暴力攻击的识别和响应是十分有利的。
  6. **其他防护技术。**WAF还有一安全增强的功能,可以用来解决WEB程序员过分信任输入数据带来的问题。比如:隐藏表单域保护、抗入侵规避技术、 响应监视和信息泄露保护。
  • 优点:提供应用层保护。
  • 缺点:处理速度慢等

img

Netfilter 子系统

Netfilter子系统是Linux内核中一个强大的网络过滤子系统,对进入系统的每个数据包,在到达用户空间组件或应用之前进行检查,通过编程方式来修改、丟弃或路由数据包。

Netfilter子系统工作在内核态,用户使用以下命令配置防火墙规则,告诉Netfilter子系统如何处理数据包:

  • iptables,用于过滤 IPv4 协议的数据包。

如果 Linux 系统连接到LAN或因特网, 则iptables可用于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

  • ip6tables,用于过滤 IPv6 协议的数据包,效果等同iptables工具。
  • arptables,用于过滤 arp 协议的数据包。

arptables既能防止别的机器对自己进行arp欺骗,又能防止本机病毒或错误程序向其他机器发起arp攻击。如果善于运用的话,不失为一个优秀的arp防火墙。

  • ebtables,用于过滤数据链路层数据包。

ebtables 过滤数据包比 iptables 更靠前,获得的数据更“原始”,ebtables 多用于桥模式,比如控制 VLAN ID 等。

[root@server ~ 18:51:33]# ls -l /sbin/*tables
-rwxr-xr-x. 1 root root 7016 411 2018 /sbin/ebtables
lrwxrwxrwx. 1 root root   13 513 16:55 /sbin/ip6tables -> xtables-multi
lrwxrwxrwx. 1 root root   13 513 16:55 /sbin/iptables -> xtables-multi

Nftables 子系统

Nftables子系统是netfilter的增强版,其仍保留了netfilter的架构。

nftables优点:

  • 更快的数据包处理
  • 更快的规则集更新
  • 使用单个 nft 用户空间实用程序,通过一个接口来管理所有协议,消除了以往不同前端和多个netfilter接口引起的争用问题。

静态防火墙和动态防火墙

静态防火墙

用户管理防火墙规则时,为了让规则永久保存,防火墙服务会重新加载所有防火墙规则,哪怕只修改一条规则也要重新读取所有规则,这种载入模式称为静态模式。静态模式加载规则时,会导致网络连接丢失。

我们称使用静态模式载入规则的防火墙为静态防火墙。例如iptables,用户执行 service iptables reload 命令将变更的规则保存到配置文件里,并重新加载所有防火墙规则。

动态防火墙

用户管理防火墙规则时,为了让规则永久保存,防火墙只需要将变更部分保存并更新到运行中的 iptables 即可,而不需要对整个防火墙规则列表进行重新加载,这种载入模式称为动态模式。

我们称使用动态模式载入规则的防火墙为动态防火墙,例如 firewalld。

Firewalld 防火墙

Firewalld 介绍

Firewalld 是 Red Hat 公司开发的防火墙软件,默认后端为 nftables。

  • 在 CentOS 7 之前的发行版中,默认使用 iptables 命令来管理防火墙。
  • 在 CentOS 7 之后的发行版中, firewalld 取代 iptables 成为了默认防火墙软件。
  • 用户可以同时使用 iptables 和 firewalld 两个防火墙软件,但容易搞混规则。建议将一个防火墙关闭或默认允许所有流量,只使用另一个防火墙。
  • Firewalld 防火墙的另外一个特点就是动态加载防火墙规则。

Firewalld 和 iptables 之间的关系

  • firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。
  • firewalld 和 iptables 一样,他们的作用都是用于维护规则,自身并不具备防火墙的功能,而真正使用规则干活的是内核的 netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。

Firewalld 区域

firewalld 防火墙为了简化管理,将所有网络流量分为多个区域(zone),每个 zone 就是一套过滤规则集。

Firewalld 提供的区域

firewalld 防火墙提供了如下zone:

  • trusted(信任区域):允许所有的传入流量。
  • public(公共区域):允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
  • external(外部区域):允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。
  • home(家庭区域):允许与ssh、mdn3、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
  • internal(内部区域):默认值时与homel区域相同。
  • work(工作区域):允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
  • dmz(隔离区域也称为非军事区域):允许与ssh 预定义服务匹配的传入流量,其余均拒绝。
  • block(限制区域):拒绝所有传入流量。
  • drop(丢弃区域):丢弃所有传入流量,并且不产生包含ICMP的错误响应。
数据包与区域匹配规则

数据包与zone匹配规则如下:

  1. 源地址被分配给特定区域, 则应用该区域的规则。
  2. 如果数据包未匹配源地址,则分配给与传入网络接口关联的区域,并应用该区域的规则。
  3. 如果以上都未匹配,firewalld将数据包分配给默认区域

注意事项:

  • firewalld默认指定public区域为默认区域,并将lo 回环接口映射至 trusted 区域
  • 如果流量不与允许的端口或协议或服务匹配,则通常会被拒绝

Firewalld 规则

对于所有区域,区域内规则的优先级是相同的。

区域内规则匹配优先级如下:

  1. 首先匹配为该区域设置的任何端口转发伪装原则。
  2. 其次匹配该区域设置的任何允许规则。
  3. 最后匹配该区域设置的任何拒绝规则。
  4. 还可以同时为以上3个规则设置记录和审计规则,可以同时生效。
  5. 富规则中的规则优先级高于区域中其他规则。
  6. 如果区域中所有规则都不匹配,那么通常会拒绝该包,trusted 例外。

Firewalld 配置

Firewalld 配置方法

  1. 直接编辑 /etc/firewalld/ 中的配置文件
  2. firewall-cmd 命令行工具
  3. firewall-config 图形工具

Firewalld 配置文件

Firewalld 配置配置文件存放在:

  • /usr/lib/firewalld/目录,Firewalld软件包自带配置位置。
  • /etc/firewalld/目录,目录结构与 /usr/lib/firewalld/ 一致,管理员自定义配置保存在该位置。

提示: 我们不建议大家通过修改 /etc/firewalld/ 目录配置防火墙。

查看zone配置
[root@server ~ 18:51:41]# cd /usr/lib/firewalld/
[root@server firewalld 18:55:54]# ls
helpers  icmptypes  ipsets  services  zones


# 查看zone配置
[root@server firewalld 18:55:56]# ls zones
block.xml  drop.xml      home.xml      public.xml   work.xml
dmz.xml    external.xml  internal.xml  trusted.xml

[root@server firewalld 18:56:26]# cat zones/trusted.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="ACCEPT">
  <short>Trusted</short>
  <description>All network connections are accepted.</description>
</zone>

[root@server firewalld 18:56:49]# cat zones/block.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="%%REJECT%%">
  <short>Block</short>
  <description>Unsolicited incoming network packets are rejected. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
</zone>

[root@server firewalld 18:57:07]# cat zones/drop.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="DROP">
  <short>Drop</short>
  <description>Unsolicited incoming network packets are dropped. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
</zone>
查看服务配置
[root@server firewalld 18:57:25]# ls -l services
总用量 616
-rw-r--r--. 1 root root  412 428 2021 amanda-client.xml
-rw-r--r--. 1 root root  447 428 2021 amanda-k5-client.xml
-rw-r--r--. 1 root root  283 428 2021 amqps.xml
-rw-r--r--. 1 root root  273 428 2021 amqp.xml
-rw-r--r--. 1 root root  285 428 2021 apcupsd.xml
......

[root@server firewalld 18:58:18]# cat services/http.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>WWW (HTTP)</short>
  <description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
  <port protocol="tcp" port="80"/>
</service>

[root@server firewalld 18:58:24]# cat services/http.xml 
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>WWW (HTTP)</short>
  <description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
  <port protocol="tcp" port="80"/>
</service>

firewall-cmd 命令行工具

两个基本概念

配置防火墙必须知道两个基本概念:

  • 防火墙的配置有两个状态:
  • runtime(运行时),命令行执行是的默认状态,该状态下的配置立刻生效
  • permanent(永久),通过选项 --permanent 指定,该状态下的配置不会立刻生效,而是写入配置文件,需要通过选项 --reload 重新reload才会生效,重新reload将导致运行时状态下未保存的配置丢失,但会保留当前连接状态。如果使用选项 --complete-reload 重新reload永久配置,将导致当前连接状态也丢失。

建议配置防火墙一次性写两条规则:

第一条使用选项 --permanent永久生效;

第二条不使用选项 --permanent 立刻生效。

  • 配置防火墙的规则必须一个区域内(直接规则除外),如果不使用选项 --zone 明确指明区域,则使用默认区域。默认区域是public
zone 管理
# 查看zone清单
[root@server firewalld 19:05:48]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

# 查看激活的zone清单,也就是分配了interface和source的zone
[root@server firewalld 19:05:50]# firewall-cmd --get-active-zones
public
  interfaces: ens33

# 查看默认zone
[root@server firewalld 19:06:16]# firewall-cmd --get-default-zone 
public

# 设置默认zone,例如设置为trusted,该操作同时设置永久态默认zone
[root@server firewalld 19:06:40]# firewall-cmd --set-default-zone=trusted 
success
[root@server firewalld 19:07:05]# firewall-cmd --get-default-zone 
4trusted

# 再次设置回来
[root@server firewalld 19:07:19]# firewall-cmd --set-default-zone=public 
success

# 查看所有zone中的规则
[root@server firewalld 19:08:58]# firewall-cmd --list-all-zones 
block
  target: %%REJECT%%
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	

dmz
  target: default
  icmp-block-inversion: no
  interfaces: 
......


# 查看默认zone中的规则
[root@server firewalld 19:09:20]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

# 查看特定zone中的规则
[root@server firewalld 19:09:49]# firewall-cmd --list-all --zone=home 
home
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client mdns samba-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
source 管理
# 来源于特定source的数据包交给特定zone处理
[root@server firewalld 19:10:11]# firewall-cmd --add-source=10.1.1.0/24 --zone=home 
success

# 查看source清单
[root@server firewalld 19:11:10]# firewall-cmd --list-sources --zone=home 
10.1.1.0/24

# 查看source属于哪个zone
[root@server firewalld 19:11:23]# firewall-cmd --get-zone-of-source=10.1.1.0/24
home

# 查看source是否添加
[root@server firewalld 19:12:25]# firewall-cmd --query-source=10.1.1.0/24 --zone=home 
yes

# 变更source到其他zone
[root@server firewalld 19:12:39]# firewall-cmd --change-source=10.1.1.0/24 --zone=public 
success

# 删除zone中source
[root@server firewalld 19:13:17]# firewall-cmd --remove-source=10.1.1.0/24 --zone=public 
success
service 管理

准备nginx服务

#安装nginx服务,启动nginx服务
yum install -y nginx 
systemctl start nginx
# 查看系统中预定义了哪些服务
[root@server firewalld 19:14:50]# firewall-cmd --get-services 

# 添加放行服务
[root@server firewalld 19:24:12]# firewall-cmd --add-service=http
success

# 查看放行服务列表
[root@server firewalld 19:24:21]# firewall-cmd --list-services 
dhcpv6-client http ssh

# 查看服务是否放行
[root@server firewalld 19:24:39]# firewall-cmd --query-service=http
yes

# 删除服务
[root@server firewalld 19:24:58]# firewall-cmd --remove-service=http
success

firewall-cmd 命令行还可以定义新的服务。

常用选项如下:

```bash --permanent --new-service=service Add a new permanent and empty service.

–permanent --delete-service=service Delete an existing permanent service.

–permanent --service=service --set-description=description Set new description to service

–permanent --service=service --get-description Print description for service

–permanent --service=service --set-short=description Set short description to service

–permanent --service=service --get-short Print short description for service

–permanent --service=service --add-port=portid[-portid]/protocol Add a new port to the permanent service.

–permanent --service=service --remove-port=portid[-portid]/protocol Remove a port from the permanent service.

–permanent --service=service --get-ports List ports added to the permanent service.

–permanent --service=service --add-protocol=protocol Add a new protocol to the permanent service.

–permanent --service=service --remove-protocol=protocol Remove a protocol from the permanent service.

–permanent --service=service --get-protocols List protocols added to the permanent service.

–permanent --service=service --add-source-port=portid[-portid]/protocol Add a new source port to the permanent service.

–permanent --service=service --remove-source-port=portid[-portid]/protocol Remove a source port from the permanent service.

–permanent --service=service --get-source-ports List source ports added to the permanent service. ```

port 管理
# 添加放行端口
[root@server firewalld 19:25:16]# firewall-cmd --add-port=5900/tcp
success

# 查看端口放行列表
[root@server firewalld 19:25:50]# firewall-cmd --list-ports 
5900/tcp

# 查看端口是否放行
[root@server firewalld 19:26:06]# firewall-cmd --query-port=5900/tcp
yes

# 删除端口
[root@server firewalld 19:27:11]# firewall-cmd --remove-port=5900/tcp
success
masquerade 管理

准备网络模型:

  • client:10.1.1.11 网关 10.1.1.10
  • server: 10.1.1.10、10.1.8.10(可以访问公网)
# 查看masquerade是否启动
[root@server firewalld 19:27:34]# firewall-cmd --query-masquerade 
no

# 启动 masquerade
[root@server firewalld 19:27:53]# firewall-cmd --add-masquerade 
success
[root@server firewalld 19:28:09]# firewall-cmd --query-masquerade 
yes

# 禁用 masquerade
[root@server firewalld 19:28:20]# firewall-cmd --remove-masquerade 
success
forward-port 管理

使用 port forward前,确保对应zone启用masquerade功能。

# 启动 masquerade
[root@server firewalld 19:28:40]# firewall-cmd --add-masquerade 

# 添加端口转发语法:
--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
# 访问本机端口8000转发到本机80
[root@server firewalld 19:31:46]# firewall-cmd --query-forward-port=port=8000:proto=tcp:toport=80

# 查看是否具有特定端口转发规则
[root@server firewalld 19:32:26]# firewall-cmd --query-forward-port=port=8000:proto=tcp:toport=80
yes

# 访问本机端口1022转发到10.1.1.11:22
[root@server firewalld 19:32:44]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11
success

# 查询端口转发清单
[root@server firewalld 19:33:53]# firewall-cmd --list-forward-ports 
port=1022:proto=tcp:toport=22:toaddr=10.1.1.11
# 删除端口转发
[root@server firewalld 19:34:27]# firewall-cmd --remove-forward-port=port=8000:proto=tcp:toport=80:toaddr=
[root@server firewalld 19:34:52]#  firewall-cmd --remove-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.8.80
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐