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 中
yum是dnf的符号链接,建议直接使用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 show 或 ip a |
| 查看路由 | ip route show 或 ip 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 查看网络连接:lsof 和 netstat(推荐 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 软件包与网络服务管理的全部核心知识点 + 语法细节 + 实用案例 + 综合项目,所有代码均含详细注释,可直接用于教学、自学或生产环境参考。