CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 软件包与网络服务管理 —语法详解与实战案例(9)

CentOS Stream 9 软件包与网络服务管理 ---语法详解与实战案例


一、软件包管理概述

1.1 软件包(Package)

在 Linux 中,软件包是预编译的程序+配置+依赖+元数据的集合,便于统一安装、升级、卸载和管理。

CentOS Stream 9 使用 RPM 包格式 (.rpm),并通过高级工具 DNF(取代 YUM)进行依赖解析和自动安装。

✅ RPM 包命名规范:

text 复制代码
name-version-release.architecture.rpm
示例:httpd-2.4.53-1.el9.x86_64.rpm
  - name: httpd
  - version: 2.4.53
  - release: 1.el9
  - arch: x86_64

1.2 软件包安装方式

方式 说明 工具
本地 RPM 包安装 手动下载 .rpm 文件安装 rpm
在线仓库安装 从官方或第三方仓库自动下载并解决依赖 dnf / yum
源码编译安装 下载源码,手动编译(灵活性高,无依赖管理) make install

⚠️ 生产环境推荐使用 dnf,避免手动处理依赖!


二、软件包管理工具


2.1 RPM(Red Hat Package Manager)

功能 :低级包管理器,直接操作 .rpm 文件,不自动解决依赖

➤ 常用命令
命令 说明
rpm -ivh package.rpm 安装软件包
rpm -e package_name 卸载软件包
rpm -q package_name 查询是否安装
rpm -qa 列出所有已安装包
rpm -qi package_name 显示软件包详细信息
rpm -ql package_name 列出软件包安装的文件列表
rpm -qf /path/to/file 查询文件属于哪个包

✅ 案例:安装本地 RPM 包(需自行解决依赖)

bash 复制代码
# 下载 RPM 包(示例)
wget https://example.com/packages/example.rpm

# 安装(-i: install, -v: verbose, -h: progress bar)
sudo rpm -ivh example.rpm

# 若提示依赖错误,需手动安装依赖包
# ❌ 不推荐生产环境使用

✅ 案例:查询已安装的 httpd 包信息

bash 复制代码
rpm -qi httpd
# 输出:Name, Version, Release, Install Date, Size, License 等

rpm -ql httpd | head -5
# 输出:/etc/httpd, /usr/sbin/httpd, /var/www/html 等

✅ 案例:查找某个文件属于哪个包

bash 复制代码
rpm -qf /usr/bin/ls
# 输出:coreutils-8.32-31.el9.x86_64

2.2 YUM(Yellowdog Updater, Modified)------ 已被 DNF 取代

📌 CentOS Stream 9 中 yumdnf 的符号链接,建议直接使用 dnf

bash 复制代码
ls -l $(which yum)
# 输出:/usr/bin/yum -> /etc/alternatives/yum -> /usr/bin/dnf-3

2.3 DNF(Dandified YUM)------ CentOS Stream 9 默认包管理器

功能:高级包管理器,自动解决依赖、支持模块化、性能优于 YUM

➤ 常用命令
命令 说明
dnf install package 安装软件包
dnf remove package 卸载软件包
dnf update 更新所有软件包
dnf search keyword 搜索软件包
dnf info package 查看软件包详细信息
dnf list installed 列出已安装的包
dnf list available 列出可安装的包
dnf clean all 清理缓存
dnf repolist 列出启用的仓库
dnf module list 列出可用模块(如 php、nginx)
dnf module enable name 启用模块

✅ 案例:安装、查询、卸载软件包

bash 复制代码
# 安装 httpd
sudo dnf install -y httpd

# 搜索包含 "ftp" 的包
dnf search ftp

# 查看 httpd 信息
dnf info httpd

# 列出已安装的包(过滤)
dnf list installed | grep httpd

# 卸载
sudo dnf remove -y httpd

✅ 案例:使用模块安装特定版本 PHP

bash 复制代码
# 查看 php 模块
dnf module list php

# 启用 php 8.0 模块
sudo dnf module enable php:8.0 -y

# 安装 php
sudo dnf install -y php php-cli php-fpm

# 验证版本
php -v

✅ 案例:清理缓存 & 刷新仓库

bash 复制代码
sudo dnf clean all      # 清理下载的包和元数据
sudo dnf makecache      # 重新生成缓存

✅ 案例:查看启用的仓库

bash 复制代码
dnf repolist
# 输出:appstream, baseos, epel, extras 等

三、网络服务管理基础


3.1 显示或配置网卡:ifconfig(已过时,推荐 ip

⚠️ CentOS Stream 9 默认不安装 net-tools(含 ifconfig),推荐使用 ip 命令

➤ 安装 ifconfig(如需)
bash 复制代码
sudo dnf install -y net-tools
➤ 使用 ip 命令(推荐)
功能 命令
查看 IP 地址 ip addr showip a
查看路由 ip route showip r
启用网卡 sudo ip link set eth0 up
禁用网卡 sudo ip link set eth0 down
设置 IP(临时) sudo ip addr add 192.168.1.100/24 dev eth0

✅ 案例:查看网络接口

bash 复制代码
ip a
# 或
ip addr show

# 输出示例:
# 2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500...
#     inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic ens192

✅ 案例:启用/禁用网卡(需 root)

bash 复制代码
sudo ip link set ens192 down   # 禁用
sudo ip link set ens192 up     # 启用

✅ 案例:临时设置 IP(重启失效)

bash 复制代码
sudo ip addr add 192.168.1.100/24 dev ens192
sudo ip route add default via 192.168.1.1

📌 永久配置请编辑:/etc/NetworkManager/system-connections/ 或使用 nmcli


3.2 因特网包探索器:ping

功能:测试网络连通性

语法

bash 复制代码
ping [选项] 目标IP或域名

常用选项

选项 说明
-c N 发送 N 个包后停止
-i N 间隔 N 秒(默认1秒)
-W N 超时等待 N 秒
-q 静默模式(只显示汇总)

✅ 案例:测试到 Google 的连通性

bash 复制代码
ping -c 4 google.com
# 输出:4 packets transmitted, 4 received, 0% packet loss

ping -c 1 -W 3 8.8.8.8
# 快速测试,3秒超时

✅ 案例:静默测试(用于脚本)

bash 复制代码
if ping -c 1 -W 2 8.8.8.8 > /dev/null 2>&1; then
    echo "✅ 网络正常"
else
    echo "❌ 网络故障"
fi

3.3 查看网络连接:lsofnetstat(推荐 ss

lsof ------ 查看进程打开的网络连接

✅ 案例:查看监听 22 端口的进程

bash 复制代码
sudo lsof -i :22
# 输出:sshd  1234  root  3u  IPv4 0x... TCP *:ssh (LISTEN)

✅ 案例:查看所有 TCP 连接

bash 复制代码
sudo lsof -i TCP
netstat ------ 已过时,推荐 ss

⚠️ 安装 netstat:

bash 复制代码
sudo dnf install -y net-tools

✅ 案例:查看监听端口

bash 复制代码
netstat -tuln
# -t: tcp, -u: udp, -l: listening, -n: numeric
ss ------ Socket Statistics(推荐替代 netstat)
命令 说明
ss -tuln 查看监听的 TCP/UDP 端口
ss -tulnp 显示进程名和 PID
ss -o state established 查看已建立的连接

✅ 案例:查看所有监听端口及对应进程

bash 复制代码
sudo ss -tulnp
# 输出:
# tcp  0  0 0.0.0.0:22  0.0.0.0:*  LISTEN  1234/sshd
# tcp  0  0 0.0.0.0:80  0.0.0.0:*  LISTEN  4567/httpd

✅ 案例:查看 HTTP 连接

bash 复制代码
sudo ss -t state established '( dport = :80 or sport = :80 )'

四、综合案例:FTP服务器的安装和配置


🎯 案例概述

目标

安装 vsftpd(Very Secure FTP Daemon),配置匿名和本地用户访问,设置防火墙,实现安全文件传输。


🧩 案例详解(带详细注释)

bash 复制代码
#!/bin/bash
# 文件名:install_vsftpd.sh
# 功能:安装并配置 vsftpd FTP 服务器

echo "🚀 开始安装和配置 vsftpd..."
echo "=================================="

# === 1. 安装 vsftpd ===
echo "📥 正在安装 vsftpd..."
sudo dnf install -y vsftpd
sudo systemctl enable vsftpd --now
echo "✅ vsftpd 安装并启动完成"

# === 2. 备份原始配置 ===
echo "💾 备份原始配置文件..."
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

# === 3. 配置 vsftpd ===
echo "⚙️  正在配置 vsftpd..."

# 创建配置文件(覆盖原文件)
cat << 'EOF' | sudo tee /etc/vsftpd/vsftpd.conf > /dev/null
# 基础设置
anonymous_enable=YES        # 允许匿名访问
local_enable=YES            # 允许本地用户登录
write_enable=YES            # 允许写入
local_umask=022             # 本地用户文件权限掩码
dirmessage_enable=YES       # 显示目录欢迎信息
xferlog_enable=YES          # 启用上传/下载日志
connect_from_port_20=YES    # 使用端口20进行数据连接
xferlog_std_format=YES      # 使用标准日志格式
listen=YES                  # 独立模式运行
listen_ipv6=NO              # 禁用 IPv6(根据需要调整)

# 匿名用户设置
anon_upload_enable=YES      # 允许匿名上传(需目录权限配合)
anon_mkdir_write_enable=YES # 允许匿名创建目录
anon_other_write_enable=YES # 允许匿名重命名/删除

# 安全设置
chroot_local_user=YES       # 限制本地用户在家目录
allow_writeable_chroot=YES  # 允许家目录可写(vsftpd 3.0+ 需要)
pam_service_name=vsftpd     # PAM 认证服务名
userlist_enable=YES         # 启用用户列表
tcp_wrappers=YES            # 启用 tcp_wrappers

# 日志
xferlog_file=/var/log/vsftpd.log
dual_log_enable=YES
EOF

echo "✅ 配置文件已更新"

# === 4. 创建匿名上传目录并设置权限 ===
echo "📁 创建匿名上传目录..."
sudo mkdir -p /var/ftp/upload
sudo chmod 777 /var/ftp/upload
sudo chown ftp:ftp /var/ftp/upload
echo "✅ 匿名上传目录 /var/ftp/upload 已创建"

# === 5. 创建测试用户 ===
echo "👤 创建测试用户 ftpuser..."
echo "设置密码为 'password123'"
sudo useradd -m ftpuser
echo "password123" | sudo passwd --stdin ftpuser 2>/dev/null || \
echo "ftpuser:password123" | sudo chpasswd

# === 6. 配置防火墙 ===
echo "🔥 配置防火墙允许 FTP..."
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --reload
echo "✅ 防火墙配置完成"

# === 7. 重启服务 ===
echo "🔄 重启 vsftpd 服务..."
sudo systemctl restart vsftpd

# === 8. 验证服务状态 ===
echo "🔍 验证服务状态..."
sudo systemctl status vsftpd --no-pager | grep "active (running)"
if [ $? -eq 0 ]; then
    echo "✅ vsftpd 服务运行正常"
else
    echo "❌ vsftpd 服务启动失败,请检查日志:journalctl -u vsftpd"
    exit 1
fi

# === 9. 测试连接(本地)===
echo "🧪 本地测试连接..."
if nc -zv localhost 21 2>/dev/null; then
    echo "✅ FTP 端口 21 监听正常"
else
    echo "❌ FTP 端口 21 未监听"
fi

echo
echo "🎉 vsftpd 安装配置完成!"
echo "📌 访问方式:"
echo "   - 匿名访问:ftp://your-server-ip/ (用户名:anonymous,密码任意)"
echo "   - 本地用户:ftp://your-server-ip/ (用户名:ftpuser,密码:password123)"
echo "   - 匿名上传目录:/var/ftp/upload"
echo "📌 注意:生产环境请加强安全配置(如禁用匿名、使用 SSL/TLS)"
echo "=================================="

💡 使用方法:

bash 复制代码
chmod +x install_vsftpd.sh
sudo ./install_vsftpd.sh

📝 安全建议(生产环境):

  • 禁用匿名访问:anonymous_enable=NO
  • 启用 SSL/TLS:配置 ssl_enable=YES
  • 使用 fail2ban 防止暴力破解
  • 限制用户权限

五、综合案例:Samba服务器的安装和配置


🎯 案例概述

目标

安装 Samba,配置共享目录,允许 Windows/Linux 客户端通过 SMB 协议访问,支持匿名和密码访问。


🧩 案例详解(带详细注释)

bash 复制代码
#!/bin/bash
# 文件名:install_samba.sh
# 功能:安装并配置 Samba 服务器

echo "🚀 开始安装和配置 Samba..."
echo "=================================="

# === 1. 安装 Samba ===
echo "📥 正在安装 Samba..."
sudo dnf install -y samba samba-client samba-common
sudo systemctl enable smb nmb --now
echo "✅ Samba 安装并启动完成"

# === 2. 备份原始配置 ===
echo "💾 备份原始配置文件..."
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

# === 3. 配置共享目录 ===
echo "📁 创建共享目录..."
sudo mkdir -p /srv/samba/public
sudo mkdir -p /srv/samba/secure
sudo chmod 777 /srv/samba/public
sudo chmod 755 /srv/samba/secure
echo "✅ 共享目录已创建"

# === 4. 创建 Samba 用户 ===
echo "👤 创建 Samba 用户 alice..."
sudo useradd -m alice
echo "password123" | sudo passwd --stdin alice 2>/dev/null || \
echo "alice:password123" | sudo chpasswd

# 设置 Samba 密码(交互式,脚本中预设)
(echo "password123"; echo "password123") | sudo smbpasswd -a alice
echo "✅ Samba 用户 alice 创建完成"

# === 5. 配置 smb.conf ===
echo "⚙️  正在配置 Samba..."

cat << 'EOF' | sudo tee /etc/samba/smb.conf > /dev/null
[global]
   workgroup = WORKGROUP
   server string = Samba Server %v
   netbios name = centos-samba
   security = user
   map to guest = bad user
   dns proxy = no
   log file = /var/log/samba/%m.log
   max log size = 1000
   guest account = nobody

# 匿名共享(只读)
[Public]
   path = /srv/samba/public
   browsable = yes
   writable = yes
   guest ok = yes
   read only = no
   create mask = 0777
   directory mask = 0777

# 密码保护共享
[Secure]
   path = /srv/samba/secure
   browsable = yes
   writable = yes
   guest ok = no
   valid users = alice
   create mask = 0644
   directory mask = 0755
EOF

echo "✅ Samba 配置文件已更新"

# === 6. 配置 SELinux(如启用)===
echo "🔐 配置 SELinux 上下文..."
sudo setsebool -P samba_export_all_rw on 2>/dev/null && echo "✅ SELinux bool 设置完成"
sudo semanage fcontext -a -t samba_share_t "/srv/samba(/.*)?" 2>/dev/null && \
sudo restorecon -R /srv/samba && echo "✅ SELinux 上下文设置完成"

# === 7. 配置防火墙 ===
echo "🔥 配置防火墙允许 Samba..."
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
echo "✅ 防火墙配置完成"

# === 8. 重启服务 ===
echo "🔄 重启 Samba 服务..."
sudo systemctl restart smb nmb

# === 9. 验证服务状态 ===
echo "🔍 验证服务状态..."
sudo systemctl status smb --no-pager | grep "active (running)"
if [ $? -eq 0 ]; then
    echo "✅ Samba 服务运行正常"
else
    echo "❌ Samba 服务启动失败,请检查日志:journalctl -u smb"
    exit 1
fi

# === 10. 测试本地连接 ===
echo "🧪 本地测试 Samba 共享..."
smbclient -L localhost -U%
if [ $? -eq 0 ]; then
    echo "✅ 本地共享列表获取成功"
else
    echo "❌ 本地连接失败"
fi

echo
echo "🎉 Samba 安装配置完成!"
echo "📌 访问方式:"
echo "   - Windows: \\\\your-server-ip\\Public (匿名访问)"
echo "   - Windows: \\\\your-server-ip\\Secure (用户:alice,密码:password123)"
echo "   - Linux: smbclient //your-server-ip/Public -U%"
echo "📌 注意:生产环境请使用强密码,限制访问 IP"
echo "=================================="

💡 使用方法:

bash 复制代码
chmod +x install_samba.sh
sudo ./install_samba.sh

📝 说明:

  • smbclient -L localhost -U%:匿名列出共享
  • valid users = alice:仅允许 alice 访问 Secure 共享
  • SELinux 配置确保共享可访问

六、综合案例:Linux防火墙配置(firewalld)


🎯 案例概述

目标

配置 firewalld 防火墙,实现:

  • 允许 SSH、HTTP、HTTPS
  • 开放自定义端口(如 8080)
  • 限制特定 IP 访问
  • 配置富规则(Rich Rules)
  • 永久生效

🧩 案例详解(带详细注释)

bash 复制代码
#!/bin/bash
# 文件名:configure_firewalld.sh
# 功能:配置 CentOS Stream 9 firewalld 防火墙

echo "🚀 开始配置 firewalld 防火墙..."
echo "=================================="

# === 1. 检查 firewalld 状态 ===
echo "🔍 检查 firewalld 状态..."
if ! sudo systemctl is-active firewalld > /dev/null; then
    echo "⚠️  firewalld 未运行,正在启动..."
    sudo systemctl start firewalld
    sudo systemctl enable firewalld
fi

# === 2. 查看默认区域 ===
DEFAULT_ZONE=$(sudo firewall-cmd --get-default-zone)
echo "🌐 默认区域:$DEFAULT_ZONE"

# === 3. 添加常用服务 ===
echo "✅ 允许 SSH、HTTP、HTTPS..."
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# === 4. 开放自定义端口 ===
echo "✅ 开放 TCP 8080 端口..."
sudo firewall-cmd --permanent --add-port=8080/tcp

# === 5. 限制特定 IP 访问(示例:仅允许 192.168.1.0/24 访问 3306)===
echo "✅ 限制 MySQL 端口 3306 仅允许内网访问..."
sudo firewall-cmd --permanent --remove-service=mysql 2>/dev/null
sudo firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4"
  source address="192.168.1.0/24"
  port protocol="tcp" port="3306" accept
'

# === 6. 拒绝特定 IP ===
echo "✅ 拒绝 IP 10.0.0.100 访问所有服务..."
sudo firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4"
  source address="10.0.0.100"
  reject
'

# === 7. 配置端口转发(示例:8080 → 80)===
echo "✅ 配置端口转发:外部访问 8080 转发到本地 80..."
sudo firewall-cmd --permanent --add-rich-rule='
  rule family="ipv4"
  forward-port port="8080" protocol="tcp" to-port="80"
'

# === 8. 重新加载防火墙 ===
echo "🔄 重新加载防火墙配置..."
sudo firewall-cmd --reload

# === 9. 验证配置 ===
echo "🔍 验证当前配置..."
echo "→ 已启用服务:"
sudo firewall-cmd --list-services

echo "→ 已开放端口:"
sudo firewall-cmd --list-ports

echo "→ 富规则:"
sudo firewall-cmd --list-rich-rules

# === 10. 保存运行时配置(冗余,--permanent 已保存)===
echo "💾 保存运行时配置到永久配置(冗余操作)..."
sudo firewall-cmd --runtime-to-permanent

echo
echo "🎉 firewalld 配置完成!"
echo "📌 常用命令:"
echo "   - 查看状态:sudo firewall-cmd --state"
echo "   - 查看区域:sudo firewall-cmd --get-active-zones"
echo "   - 查看所有配置:sudo firewall-cmd --list-all"
echo "   - 删除规则:sudo firewall-cmd --permanent --remove-rich-rule='rule...'"
echo "📌 注意:修改后务必执行 --reload 使配置生效"
echo "=================================="

💡 使用方法:

bash 复制代码
chmod +x configure_firewalld.sh
sudo ./configure_firewalld.sh

✅ 常用 firewalld 命令速查:

bash 复制代码
# 查看所有配置
sudo firewall-cmd --list-all

# 查看开放端口
sudo firewall-cmd --list-ports

# 临时开放端口(重启失效)
sudo firewall-cmd --add-port=8081/tcp

# 永久开放
sudo firewall-cmd --permanent --add-port=8081/tcp
sudo firewall-cmd --reload

# 删除规则
sudo firewall-cmd --permanent --remove-port=8081/tcp
sudo firewall-cmd --reload

✅ 学习建议与最佳实践

  • 优先使用 DNF:避免手动 RPM 安装,让系统自动解决依赖。
  • 配置前备份 :修改配置文件前务必备份(.bak)。
  • 防火墙最小权限:只开放必需端口,拒绝所有其他连接。
  • SELinux 不要禁用 :学会配置上下文和布尔值,而非 setenforce 0
  • 服务启用开机自启systemctl enable servicename
  • 日志监控journalctl -u servicename 查看服务日志。
  • 测试连接 :使用 nc, telnet, curl 等工具验证端口连通性。

📚 附录:命令速查表

功能 命令示例
安装软件包 sudo dnf install -y package
卸载软件包 sudo dnf remove -y package
更新系统 sudo dnf update -y
查看 IP ip a
测试连通性 ping -c 4 google.com
查看监听端口 sudo ss -tulnp
安装 vsftpd sudo dnf install -y vsftpd
安装 Samba sudo dnf install -y samba
开放防火墙端口 sudo firewall-cmd --permanent --add-port=8080/tcp
重载防火墙 sudo firewall-cmd --reload
查看防火墙配置 sudo firewall-cmd --list-all

这份文档覆盖了 CentOS Stream 9 软件包与网络服务管理的全部核心知识点 + 语法细节 + 实用案例 + 综合项目,所有代码均含详细注释,可直接用于教学、自学或生产环境参考。

相关推荐
Joren的学习记录2 小时前
【Linux运维进阶知识】Nginx负载均衡
linux·运维·nginx
用户2190326527352 小时前
Java后端必须的Docker 部署 Redis 集群完整指南
linux·后端
瑶光守护者2 小时前
【学习笔记】5G RedCap:智能回落5G NR驻留的接入策略
笔记·学习·5g
你想知道什么?2 小时前
Python基础篇(上) 学习笔记
笔记·python·学习
胡先生不姓胡2 小时前
如何获取跨系统调用的函数调用栈
linux
SHOJYS2 小时前
学习离线处理 [CSP-J 2022 山东] 部署
数据结构·c++·学习·算法
weixin_409383123 小时前
简单四方向a*学习记录4 能初步实现从角色到目的地寻路
学习·a星
xian_wwq3 小时前
【学习笔记】可信数据空间的工程实现
笔记·学习
Li.CQ3 小时前
SQL学习笔记
笔记·sql·学习
jtymyxmz4 小时前
《Maya 2024 超级学习手册》3.4.8 实例:制作垃圾桶模型
学习·maya