1 Red Hat Enterprise Linux 9 新特性及技术展示
1.1 国产操作系统的现状
国产信创操作系统包括:麒麟系,UOS系,中科系三大类别
麒麟系
2019年底中国电子宣布合并中标麒麟和银河麒麟,2023年中国电子与华为又决定合并鲲鹏生态和PKS生态,前者基于鲲鹏生态,后者是基于中国电子的飞腾生态,其实均是ARM架构的CPU,鲲鹏和飞腾都是信创事业中最底层CPU的ARM代表者,生态合并后后续鲲鹏生态软件可以在PKS生态(飞腾)大发异彩
目前麒麟软件服务器版V10基于OpenEuler,桌面版基于Debian
UOS系
UOS的前身是武汉深之度公司,2023年国庆查看UOS官网截图,最新版本为V20(1060)
可以看出最新的V20版本,支持4种CPU架构(AMD64、ARM64、MIPS64、SW64),6大CPU平台(鲲鹏、龙芯、申威、海光、兆芯、飞腾)
申威服务器本身硬件的原因,对于UOS是否很好的运行在申威服务器,保留意见
其中X86架构和ARM架构,分别有基于龙蜥 OpenAnolis,以及基于欧拉 OpenEuler 的,分别用后缀a和e进行区分
中科系
中科系包括:中科方德、中科龙芯、中科红旗,其中由于龙芯CPU的占有率比较低,所以中科龙芯的操作系统市场占有率比较低,中科海光的海光服务器会大概率使用中科方德操作系统
所以可以看出目前国产操作系统底层基本都是基于欧拉和龙蜥开源操作系统了
龙蜥和欧拉分别背靠阿里巴巴和华为两家大靠山是国内软硬件技术实力最好的企业,就个人而言,阿里巴巴的研发和技术实力更胜一筹,特别是神龙4架构是飞天云操作系统新一代虚拟化技术,并首次搭载了全球唯一的大规模弹性RDMA加速网络,将云计算带进了5微秒时延时代
从官网也可以看出很多商业版本(包括统信、麒麟、中科方德)也都是基于龙蜥OS
特别是当下AI算力需求下,龙蜥更是加大对算力进一步研发,对AI基础支持都有更好的提升
包括内置rpm格式的AI组件、主流的框架 tensorflow2、pytorch ,支持一键安装 nvidia GPU 驱动、CUDA 库等
龙蜥社区将基于 Anolis OS 23 构建 AI 容器镜像生态,提供主流的 AI 训练/推理镜像,并发布开箱即用的 modelscope / huggingface AI 大模型实践镜像
龙蜥是号称100%兼容Centos的,OpenEuler虽然没有官方宣传,但某些版本还都是bug级别兼容的,这也是很多论坛提及所谓龙蜥和欧拉是Centos的套壳
CentOS与RHEL是出自相同的源代码,CentOS是RHEL的下游分支,不管2021年12月31日,CentOSLinux8停止更新和维护,RHEL业界老大哥位置依然是无法撼动的
龙蜥还是欧拉,在对于包管理(DNF)、服务管理(systemd)等很多方面都是高度一致的(甚至100%),因此学习RHEL,包括红帽认证都是非常有必要的
Red Hat Enterprise Linux 9(RHEL 9)是红帽公司于2022年5月发布的最新正式版操作系统,除了内核升级到5.1.4以外,还着重加强了安全性,以及容器应用等各方面的增强,本文将对RHEL9新特性进行了技术展示
2 软件仓库
早在RHEL8中,除了单独的RPM软件包外,AppStream软件仓库还包含模块
模块(module)是一组代表组件且通常一起安装的RPM软件包
典型的模块包含
1、应用的软件包
2、应用特定依赖项库的软件包
3、应用文档的软件包
4、帮助程序实用程序的软件包
模块化能够解决一个软件仓库中并存多个不同版本的应用及其依赖软件,解决了管理多个软件仓库的复杂度
RHEL8发行版本中的模块(module)是有的,输入dnf module list
显示如下
1 | [root@RHEL8 ~]# dnf module list |
实际上一个模块可以有多个流,而一条流可以看作某个特定版本软件包,及对应依赖库等等的集合
如果单独显示nginx这个模组对应的多个流,其中[d][e]表示当前1.14版为默认流和已启用流
一个模组只能启用一个流
1 | [root@RHEL8 ~]# dnf module list nginx |
实际上生产环境下,RHEL8能够使用的模组还是比较少的
到了RHEL9版本,RHEL9的早期版本并没有Package module,能在后期版本迭代中可能会不断增加
1 | [root@RHEL9 ~]# dnf module list |
实际上伴随着云原生架构的迭代和发展趋势,容器化的部署方式已成为主流,所以操作系统中的软件仓库已经不是那么重要,可以通过容器去解决版本依赖问题
3 网络配置
RHEL7可使用network.service
与NetworkManager.service
两个服务用于网络管理
RHEL8默认使用NetworkManager.service
,而不再默认安装network.service
RHEL8仍可以使用配置文件的方式管理网络,RHEL8的网卡配置文件具体位置如下
1 | [root@RHEL8 ~]# ll /etc/sysconfig/network-scripts/ifcfg-* |
network.service
网络管理工具需要人为的指定配置文件和网卡名字的关系
NetworkManager.service
则提供了更加方便的nmcli命令行和nmtui图形化工具
RHEL9则不再提供network-scripts
软件包,只能使用NetworkManager.service
去做相应的网络配置
网卡配置文件从原来的/etc/sysconfig/network-scripts/
调整至/etc/NetworkManager/system-connections/
目录下
可以验证
1 | [root@localhost ~]# ll /etc/NetworkManager/system-connections/ |
在RHEL9下,建议使用
/etc/NetworkManager/system-connections/
目录下配置文件
与此同时RHEL9的网络配置文件格式也发生了变化,即从多年的ifcfg格式调整为ini格式
例如RHEL9下ens33.nmconnection
配置文件具体如下:
1 | [root@localhost ~]# cat /etc/NetworkManager/system-connections/ens33.nmconnection |
在RHEL9下,NetworkManager.service
仍然提供nmcli命令行和图形化工具(包括nmtui、nmtui-connect、nmtui-edit)
4 安全
RHEL9对安全性提供了各项增强,这里罗列了重点几个部分
4.1 OpenSSH
4.1.1 禁止root登录
RHEL9默认禁止root账户进行SSH登录,例如我们使用远程SSH登录到RHEL9系统时,会提示Permission denied
1 | root@172.18.3.16's password: |
查看OpenSSH的配置文件
1 | [root@localhost ~]# grep -i permitroot /etc/ssh/sshd_config |
可以看到配置文件已经禁用了root账户的SSH登录权限
另外RHEL9自带的OpenSSH版本是8.7p1
1 | [root@localhost /]# rpm -qa | grep openssh |
RHEL8自带的OpenSSH版本为8.0p1
1 | [root@RHEL8 ~]# rpm -qa | grep openssh |
当然在RHEL9安装过程中,可以选择Allow root SSH login with password
当勾上Allow root SSH login with password
,细心的朋友可能发现/etc/ssh/sshd_config
配置文件仍然是#PermitRootLogin prohibit-password
系统怎么能够允许root访问?实际上在/etc/ssh/sshd_config.d/
创建了01-permitrootlogin.conf
新配置文件,优先级更高,进行了部分参数覆盖
1 | [root@RHEL9 ~]# cat /etc/ssh/sshd_config.d/01-permitrootlogin.conf |
关于禁止root登录的重要性
实际上用户登陆最佳实践是通过普通用户登陆,然后使用sudo
或者sudo su -
进行root角色的切换
这样攻击者起码要猜到可远程登录的用户名及其密码,以及root账户的密码,这样系统的安全的级别相对提高了
实际上要习惯不使用root进行登录,以及抛弃使用root账户登录的坏习惯
4.2 防火墙
实际上在RHEL Linux中我们一直听到iptable
以及firewall
,或者更新的nftable
,这三者的关系和区别如下
1、首先这三者都是与系统防火墙有关系
2、iptables与firewalld、包括nftables都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已
3、在RHEL7之前,我们一般使用iptables防火墙管理工具
4、从RHEL7开始,我们开始使用firewall来进行防火墙管理工具
相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念
区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换
4、RHEL7使用firewalld来管理netfilter,不过底层调用的命令仍然是iptables
4、RHEL8也使用firewalld服务作为用户配置防火墙规则的工具,只不过后端默认使用了nftable
去实现了防火墙规则
通过配置查看,发现FirewallBackend=nftables
1 | [root@RHEL8 ~]# grep -C 5 backend /etc/firewalld/firewalld.conf |
4.2.1 firewalld
除了firewall-cmd
命令行方式,还可以使用firewall-config
图形化界面进行防火墙配置
关于预定义区域
预定义区域存储在 /usr/lib/firewalld/zones/
目录中,并可立即应用于任何可用的网络接口。只有在修改后,这些文件才会复制到 /etc/firewalld/zones/
目录中
1 | [root@RHEL8 zones]# ll /usr/lib/firewalld/zones/ |
firewalld
是一个防火墙服务守护进程,通过 D-Bus
接口提供动态可定制的主机防火墙。如果是动态的,它可在每次修改规则时启用、修改和删除规则,而不需要在每次修改规则时重启防火墙守护进程。
firewalld
使用区域和服务的概念来简化流量管理。区域是预定义的规则集。服务是预定义的规则,覆盖了允许特定服务进入流量的所有必要设置
RHEL7的firewall和iptables关系
4.2.2 iptables和netfilter关系
iptables包含命令行工具和内核模块两部分
iptables用户态命令行是防火墙的配置工具,工作在用户态
用户可以通过iptables命令作用于内核态的netfilter,由后者触发相应的回调函数(hook 机制)执行相应的防护动作
iptables的过滤转发流程包括经典的四表五链,这里不详细展开
4.2.3 iptables和nftables关系
iptables是一个整体框架,但是存在一定诸多弊端,包括在内核态存在冗余代码,比如对于TCP和UDP而言,取sport,dport没有什么不同,但是iptables却使用了两套代码
nftables用于替代iptables,诸如iptables替代ipchains
nftables
框架对数据包进行分类,它是 iptables
、ip6tables
、arptables
、ebtables
和 ipset
实用程序的后续者。与之前的数据包过滤工具相比,它在方便、特性和性能方面提供了大量改进,最重要的是:
- 内置查找表而不是线性处理
IPv4
和IPv6
协议的单一框架- 规则会以一个整体被应用,而不是分为抓取、更新和存储完整的规则集的步骤
- 支持在规则集(
nftrace
)和监控追踪事件(nft
)中调试和追踪 - 更加一致和压缩的语法,没有特定协议的扩展
- 用于第三方应用程序的 Netlink API
nftables
主要由三个组件组成:内核实现、libnl netlink 通信和 nftables 用户空间。 其中内核提供了一个 netlink
配置接口以及运行时规则集评估,libnl
包含了与内核通信的基本函数,用户空间可以通过 nft
和用户进行交互
RHEL9提供了iptables-translate
规则转换工具用于将iptable命令行转换成nft命令行
1 | [root@RHEL9 yum]# iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT |
4.2.4 firewall和nftables关系
在RHEL9下,firewall命令行配置的会转换为nftables下的规则,例如
使用firewall-cmd命令firewall-cmd --add-port=80/tcp
针对public区域添加对80/tcp端口的放行
对应的nftables规则会添加以下配置信息
1 | chain filter_IN_public_allow { |
4.3 WireGuard VPN技术
WireGuard轻量级服务提供了VPN功能,具有新的加密技术和更快的响应时间,从2020年1月开始在Linux Kernel5.6版本中已经集成WireGuard
WireGuard是由Jason A. Donenfeld开发的开放源代码VPN,基于Linux内核实现,利用Curve25519进行密钥交换,ChaCha20用于加密,Poly1305用于数据认证,BLAKE2用于散列函数运算,支持IPv4和IPv6的第3层。WireGuard旨在获得比IPsec和OpenVPN更好的性能
RHEL9中Linux kernel为5.14.0, kernel已支持WireGuard功能,目前还处于技术预览阶段,但不推荐在生产环境中使用
wg命令由wireguard-tools
软件包提供
1 | [root@RHEL9 ~]# yum provides wg |
首先生成私钥和公钥,保存在/etc/wireguard
目录下
1 | [root@RHEL9 ~]# wg genkey > /etc/wireguard/server.key |
在RHEL9中,可以直接使用nmtui图形化界面直接创建类型为WireGuard的配置文件
新建的connection类型已经内置了wireguard类型
这里列出基本的配置方法,具体会单独另起一篇文章进行专题讲解
4.4 SELinux
RHEL9现在无法通过/etc/selinux/config
禁用 SELinux 的支持
SELinux启用后,SELinux有两个模式,分别是enforcing
和 permissive
sestatus
命令返回 SELinux 状态以及正在使用的 SELinux 策略
1 | [root@RHEL9 ~]# sestatus |
当您只通过 /etc/selinux/config
禁用SELinux 时,系统会在启用SELinux 的情况下启动,但不会载入策略
如果您需要禁用SELinux,请在内核命令行中添加 selinux=0
参数
可以使用grubby
更改RHEL8和RHEL9的默认内核
1 | [root@RHEL9 ~]# rpm -q grubby |
重新引导后,确认 getenforce
命令返回 Disabled
4.5 rsync命令替代SCP协议
文件传输协议SCP(Secure Copy Protocol)是基于SSH的文件传输协议
但实际上SCP存在的多个漏洞,RHEL9推荐采用rsync
命令去进行替代原来的scp
命令
rsync
命令可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)
RHEL8和RHEL9最小安装均未安装rsync
,注意:本地和远程传输方必须都安装rsync软件
RHEL9自带仓库源中rsync版本为3.2.3
RHEL9自带仓库源中rsync版本为3.1.3
1 | [root@RHEL9]# yum provides rsync |
注意
rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
意味着传输的双方都必须安装
rsync
否则会报错
1
2
3 bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.3]
4.5.1 常用参数使用
基本参数使用为-a
、-v
、-P
-a,–archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
-v,–verbose 详细模式输出
-P,注意这里是大写的P,表示保留传输失败的文件,用于下一次传输过程中继续传输之前失败的文件,意味着传输中如果被打断了,已经传输的文件继续保留在目标文件
而配合参数--append
或--append-verify
,则本次传输会从中断的点开始
一般而言使用-avP
是最佳参数,例如
1 | rsync -avP source/ root@172.18.3.15:/root |
还有一个经常使用的参数是--delete
当目标文件夹存在,而源文件夹不存在时候,则会删除目标文件夹,可以理解为总是确保目标是源目标的完全镜像,不会多内容
4.5.2 其他使用技巧
另外注意的就是源目标参数中的源文件夹后是否带/
例如rsync -avP /root/dir root@172.18.3.15:/root
则会在远程机器的/root目录下创建/dir文件夹,同时将/dir文件夹下文件全部复制到该目录下
而rsync -avP /root/dir/ root@172.18.3.15:/root
则会在将本地的/root/dir下的所有文件全部复制到远程机器的/root下,而不会去创建/root/dir文件夹
需要特别对上述区别进行注意
4.5 安全增强
SHA-1 生成的摘要不被视为是安全的,因为已发现多个基于哈希进行的安全攻击。RHEL核心加密组件不再默认使用SHA-1创建签名
在RHEL9中已经启用了SHA-1的签名算法
意味着使用RHEL9在使用SSH登录Centos4/5的时候会报错
当然可以使用update-crypto-policies
去启用它
1 | # update-crypto-policies --set DEFAULT:SHA1 |
5 存储相关
RHEL9现在支持exFAT,可通过安装 exfatprogs
软件包,使用 mkfs.exfat
创建exFAT文件系统
1 | [root@RHEL9 ~]# yum provides mkfs.exfat |
RHEL9下XFS文件系统现在支持bigtime
和innobtcount
功能
注意
1、由于默认参数使用了
bigtime
和innobtcount
2、使用默认参数创建的XFS文件系统将无法在RHEL7中挂载
例如使用mkfs.xfs
命令,提示bigtime=1 inobtcount=1
1 | [root@RHEL9 /]# mkfs.xfs -f /dev/sdb1 |
如果此时在RHEL7挂载,会报错
1 | [root@rhel7 /]# mount /dev/sdb1 /sdb1 |
经笔者测试在RHEL8中挂载,可正常使用
另外VDO管理软件己被删除,但是RHEL9新增了LVM-VDO
功能
6 容器
在RHEL8中就已经使用podman替代docker作为新一代容器管理工具
在RHEL9中还提供了另外两个强大的容器管理镜像,分别是Skopeo
和Bulidah
Podman在RHEL9中版本升级为4.0,Podman包括DNS名称解析、改进的IPv6支持和双栈支持,Podman 4.0.x 在兼容 CNI的基础上又新增原生的网络模式 Netavark 与 Aardvark-DNS 以更好的支持
RHEL9的CGroup升级到CGroup2,容器现在原生集成到cgroup2中,通过进程定义提高资源利用率
具体会单独另起一篇文章进行新版Podman讲解,以及Skopeo和Bulidah工具的讲解
7 其他
7.1 内核升级
RHEL9内核的版本从RHEL8的4.18
升级为5.14
1 | [root@RHEL8 ~]# uname -r |
7.2 移除info命令
GNU info命令被移除
RHEL8中保留GNU info命令
1 | [root@RHEL8 ~]# info --version |
RHEL9中则移除了GUN info命令