CentOS Stream 9 配置网络功能 ---语法详解与实战案例
一、了解 VMware 的网络工作模式
VMware 提供三种网络连接模式,适用于不同场景:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 桥接模式 | 虚拟机直接连接物理网络,获取独立 IP(如同真实主机) | 服务器对外提供服务 |
| NAT 模式 | 虚拟机通过宿主机 NAT 上网,IP 由 VMware 分配,外部不可直接访问 | 开发测试、上网 |
| 仅主机模式 | 虚拟机与宿主机组成私有网络,无法访问外网,仅主机间通信 | 安全隔离、内部集群测试 |
✅ 生产服务器推荐使用 桥接模式 ,开发测试可使用 NAT 模式。
二、配置 VMware 虚拟网络(简要说明)
⚠️ 此部分在宿主机 VMware Workstation / Fusion 中操作:
- 打开 VMware → 编辑 → 虚拟网络编辑器
- 选择模式(如 VMnet0 桥接、VMnet8 NAT)
- 桥接模式:选择正确的物理网卡
- NAT 模式:可自定义子网和 DHCP 范围
- 仅主机模式:设置私有子网
📌 CentOS Stream 9 虚拟机设置 → 网络适配器 → 选择对应模式即可。
三、配置网络功能
3.1 打开有线连接(启用网卡)
CentOS Stream 9 默认使用 NetworkManager 管理网络,可通过 nmcli 或图形界面操作。
➤ 使用 nmcli 启用连接
bash
# 查看所有连接
nmcli connection show
# 启用名为 "Wired connection 1" 的连接
sudo nmcli connection up "Wired connection 1"
# 禁用连接
sudo nmcli connection down "Wired connection 1"
✅ 案例:自动启用第一个有线连接
bash
# 获取第一个有线连接名
CONN_NAME=$(nmcli -t -f NAME,TYPE connection show | grep ethernet | head -1 | cut -d: -f1)
if [ -n "$CONN_NAME" ]; then
echo "🔌 启用连接:$CONN_NAME"
sudo nmcli connection up "$CONN_NAME"
else
echo "❌ 未找到有线连接"
fi
3.2 编辑网卡配置文件(静态 IP 配置)
配置文件路径:/etc/NetworkManager/system-connections/
⚠️ 不再使用
/etc/sysconfig/network-scripts/ifcfg-*(RHEL8+ 已废弃)
➤ 查看当前连接配置文件名
bash
sudo ls /etc/NetworkManager/system-connections/
# 输出:Wired\ connection\ 1.nmconnection
➤ 手动编辑配置文件(推荐使用 nmcli)
✅ 推荐方式:使用
nmcli配置静态 IP(无需手动编辑文件)
bash
# 设置静态 IP(替换为你的连接名、IP、网关、DNS)
CONN_NAME="Wired connection 1"
IP_ADDR="192.168.1.100/24"
GATEWAY="192.168.1.1"
DNS="8.8.8.8,8.8.4.4"
sudo nmcli connection modify "$CONN_NAME" \
ipv4.addresses "$IP_ADDR" \
ipv4.gateway "$GATEWAY" \
ipv4.dns "$DNS" \
ipv4.method manual
# 重启连接使配置生效
sudo nmcli connection down "$CONN_NAME" && sudo nmcli connection up "$CONN_NAME"
# 验证
ip addr show
nmcli device show
✅ 案例:完整静态 IP 配置脚本(带注释)
bash
#!/bin/bash
# 文件名:set_static_ip.sh
# 功能:为指定连接设置静态 IP
CONN_NAME="Wired connection 1" # 替换为你的连接名
STATIC_IP="192.168.1.100/24"
GATEWAY="192.168.1.1"
DNS_SERVERS="8.8.8.8,8.8.4.4"
echo "⚙️ 正在配置静态 IP..."
echo "连接名:$CONN_NAME"
echo "IP地址:$STATIC_IP"
echo "网关:$GATEWAY"
echo "DNS:$DNS_SERVERS"
# 修改连接配置
sudo nmcli connection modify "$CONN_NAME" \
ipv4.addresses "$STATIC_IP" \
ipv4.gateway "$GATEWAY" \
ipv4.dns "$DNS_SERVERS" \
ipv4.method manual \
ipv4.ignore-auto-dns yes
# 重启网络连接
echo "🔄 重启网络连接..."
sudo nmcli connection down "$CONN_NAME" 2>/dev/null
sudo nmcli connection up "$CONN_NAME"
# 验证配置
echo "🔍 验证 IP 配置..."
ip addr show | grep -A 2 "$(nmcli device status | grep ethernet | awk '{print $1}')"
echo "🎉 静态 IP 配置完成!"
💡 使用方法:
bash
chmod +x set_static_ip.sh
sudo ./set_static_ip.sh
3.3 修改主机 IP 地址与域名快速解析文件
➤ 设置主机名
bash
# 临时设置(重启失效)
sudo hostnamectl set-hostname webserver01
# 永久设置(写入 /etc/hostname)
sudo hostnamectl set-hostname webserver01 --static
# 查看当前主机名
hostnamectl
➤ 配置本地域名解析(/etc/hosts)
用于快速解析主机名到 IP,无需 DNS。
bash
# 编辑 hosts 文件
sudo vi /etc/hosts
# 添加如下内容(示例):
192.168.1.100 webserver01.local
192.168.1.101 dbserver01.local
192.168.1.102 appserver01.local
✅ 案例:批量添加 hosts 记录脚本
bash
#!/bin/bash
# 文件名:add_hosts.sh
# 功能:向 /etc/hosts 添加多条记录
HOSTS=(
"192.168.1.100 webserver01.local"
"192.168.1.101 dbserver01.local"
"192.168.1.102 appserver01.local"
)
echo "📝 正在更新 /etc/hosts..."
for entry in "${HOSTS[@]}"; do
IP=$(echo $entry | awk '{print $1}')
HOST=$(echo $entry | awk '{print $2}')
# 检查是否已存在
if ! grep -q "$HOST" /etc/hosts; then
echo "$entry" | sudo tee -a /etc/hosts > /dev/null
echo "✅ 添加:$entry"
else
echo "⚠️ 已存在:$HOST"
fi
done
echo "🎉 /etc/hosts 更新完成!"
💡 验证:
bash
ping -c 1 webserver01.local
# 应解析为 192.168.1.100
四、常用网络命令
4.1 ip 命令(取代 ifconfig)
| 功能 | 命令 |
|---|---|
| 查看 IP | ip a 或 ip addr show |
| 查看路由 | ip r 或 ip route show |
| 启用网卡 | sudo ip link set eth0 up |
| 禁用网卡 | sudo ip link set eth0 down |
✅ 案例:一键查看本机 IP(排除 lo)
bash
ip -4 addr show scope global | grep inet | awk '{print $2}' | cut -d/ -f1
4.2 ping 测试连通性
bash
ping -c 4 8.8.8.8
ping -c 1 google.com
4.3 ss 查看连接(取代 netstat)
bash
ss -tuln # 查看监听端口
ss -tulnp # 显示进程
ss -o state established # 查看已建立连接
4.4 nmcli 网络管理(推荐)
bash
nmcli device status # 查看设备状态
nmcli connection show # 查看连接
nmcli general status # 查看网络管理器状态
五、使用 systemctl 管理服务
5.1 常用命令
| 命令 | 说明 |
|---|---|
systemctl start service |
启动服务 |
systemctl stop service |
停止服务 |
systemctl restart service |
重启服务 |
systemctl enable service |
开机自启 |
systemctl disable service |
禁用开机自启 |
systemctl status service |
查看服务状态 |
systemctl is-active service |
检查服务是否运行 |
systemctl list-unit-files |
列出所有服务(含状态) |
✅ 案例:管理 sshd 服务
bash
# 启动并设置开机自启
sudo systemctl start sshd
sudo systemctl enable sshd
# 查看状态
sudo systemctl status sshd --no-pager
# 重启
sudo systemctl restart sshd
# 检查是否运行
if systemctl is-active --quiet sshd; then
echo "✅ SSH 服务正在运行"
else
echo "❌ SSH 服务未运行"
fi
✅ 案例:一键检查并启动多个服务
bash
#!/bin/bash
# 文件名:check_services.sh
SERVICES=("sshd" "firewalld" "NetworkManager")
for svc in "${SERVICES[@]}"; do
if systemctl is-active --quiet "$svc"; then
echo "✅ $svc 正在运行"
else
echo "⚠️ $svc 未运行,正在启动..."
sudo systemctl start "$svc" && sudo systemctl enable "$svc"
echo " → 启动成功"
fi
done
六、配置和使用 SSH 服务
6.1 安装与启动 SSH 服务
bash
# 安装(通常默认已安装)
sudo dnf install -y openssh-server openssh-clients
# 启动并开机自启
sudo systemctl start sshd
sudo systemctl enable sshd
# 防火墙放行
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
6.2 SSH 配置文件(/etc/ssh/sshd_config)
⚠️ 修改前备份!
bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
常用安全配置项:
bash
# 禁用 root 登录(推荐)
PermitRootLogin no
# 修改默认端口(如 2222)
Port 2222
# 仅允许特定用户
AllowUsers alice bob
# 禁用密码登录(仅允许密钥)
PasswordAuthentication no
# 启用密钥登录
PubkeyAuthentication yes
# 限制最大认证尝试
MaxAuthTries 3
✅ 案例:一键加固 SSH 配置脚本
bash
#!/bin/bash
# 文件名:harden_ssh.sh
# 功能:加固 SSH 服务配置
CONFIG="/etc/ssh/sshd_config"
BACKUP="$CONFIG.bak.$(date +%Y%m%d)"
echo "🔐 备份原始配置:$BACKUP"
sudo cp "$CONFIG" "$BACKUP"
# 设置安全参数
sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' "$CONFIG"
sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' "$CONFIG"
sudo sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' "$CONFIG"
sudo sed -i 's/^#*Port .*/Port 2222/' "$CONFIG" # 取消注释并修改端口
# 添加允许用户(如存在)
if ! grep -q "^AllowUsers" "$CONFIG"; then
echo "AllowUsers alice bob" | sudo tee -a "$CONFIG"
fi
# 重启服务
echo "🔄 重启 sshd 服务..."
sudo systemctl restart sshd
# 防火墙放行新端口
echo "🔥 防火墙放行端口 2222..."
sudo firewall-cmd --permanent --remove-service=ssh 2>/dev/null
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
echo "🎉 SSH 加固完成!请使用密钥登录,端口:2222"
💡 登录命令:
bash
ssh -p 2222 alice@your-server-ip
七、远程连接 Linux 服务器
7.1 密钥验证方式实现免密登录
➤ 步骤 1:在客户端生成密钥对
bash
# 在客户端(你的电脑)执行
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 默认保存在 ~/.ssh/id_rsa (私钥) 和 ~/.ssh/id_rsa.pub (公钥)
➤ 步骤 2:将公钥复制到服务器
bash
# 方法一:使用 ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2222 alice@your-server-ip
# 方法二:手动复制
cat ~/.ssh/id_rsa.pub | ssh -p 2222 alice@your-server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
➤ 步骤 3:设置权限(服务器端)
bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
➤ 步骤 4:测试免密登录
bash
ssh -p 2222 alice@your-server-ip
# 应直接登录,无需密码
✅ 案例:一键配置免密登录脚本(客户端执行)
bash
#!/bin/bash
# 文件名:setup_ssh_key.sh
# 功能:生成密钥并配置免密登录到远程服务器
SERVER_IP="192.168.1.100"
SERVER_PORT="2222"
USERNAME="alice"
echo "🔑 生成 SSH 密钥对..."
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "$USERNAME@$SERVER_IP"
echo "📤 复制公钥到服务器..."
ssh-copy-id -i ~/.ssh/id_rsa.pub -p "$SERVER_PORT" "$USERNAME@$SERVER_IP"
echo "✅ 测试免密登录..."
ssh -p "$SERVER_PORT" "$USERNAME@$SERVER_IP" "echo '🎉 免密登录成功!主机名:$(hostname)'"
echo "🎉 SSH 免密登录配置完成!"
八、远程复制操作
8.1 scp ------ 安全复制文件
语法:
bash
scp [选项] 源 目标
常用选项:
-P port:指定端口(注意是大写 P)-r:递归复制目录-C:压缩传输
✅ 案例:上传文件到服务器
bash
scp -P 2222 myfile.txt alice@192.168.1.100:/home/alice/
✅ 案例:下载目录
bash
scp -P 2222 -r alice@192.168.1.100:/var/log/ ./logs/
✅ 案例:带进度显示的复制脚本
bash
#!/bin/bash
# 文件名:copy_with_progress.sh
SOURCE="$1"
DEST="$2"
PORT="${3:-22}"
echo "📤 正在复制:$SOURCE → $DEST"
scp -P "$PORT" -C -r "$SOURCE" "$DEST"
if [ $? -eq 0 ]; then
echo "✅ 复制完成!"
else
echo "❌ 复制失败!"
fi
8.2 rsync ------ 高效同步(推荐用于大文件/目录)
语法:
bash
rsync [选项] 源 目标
常用选项:
-a:归档模式(保留权限、时间等)-v:详细输出-z:压缩--progress:显示进度-e "ssh -p 2222":指定 SSH 端口
✅ 案例:同步本地目录到服务器
bash
rsync -avz --progress -e "ssh -p 2222" ./myapp/ alice@192.168.1.100:/var/www/html/
✅ 案例:从服务器拉取日志
bash
rsync -avz --progress -e "ssh -p 2222" alice@192.168.1.100:/var/log/nginx/ ./nginx_logs/
九、常用 SSH 服务的客户端工具
| 平台 | 工具名称 | 说明 |
|---|---|---|
| Windows | PuTTY / MobaXterm | 图形化 SSH 客户端 |
| Windows | Windows Terminal + OpenSSH | 内置支持(Win10+) |
| macOS | Terminal + ssh | 原生命令行 |
| Linux | Terminal + ssh | 原生命令行 |
| 跨平台 | VS Code + Remote SSH | 开发神器,远程编辑文件 |
| 跨平台 | Tabby / Termius | 现代化终端,支持多标签 |
✅ Windows 10/11 启用 OpenSSH 客户端:
powershell
# 以管理员身份运行 PowerShell
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
✅ VS Code 远程开发:
- 安装 Remote - SSH 插件
- 按
F1→Remote-SSH: Connect to Host... - 输入
alice@192.168.1.100:2222 - 输入密码或自动使用密钥登录
- 开始远程编辑文件!
十、综合性实战案例
🎯 综合案例 1:一键初始化新服务器网络与 SSH
功能:设置静态 IP、主机名、hosts、SSH 免密、防火墙、服务自启
bash
#!/bin/bash
# 文件名:init_server.sh
# 功能:一键初始化 CentOS Stream 9 服务器
# ===== 配置参数 =====
STATIC_IP="192.168.1.100/24"
GATEWAY="192.168.1.1"
DNS="8.8.8.8,8.8.4.4"
HOSTNAME="web01.example.com"
SSH_PORT="2222"
ALLOWED_USER="admin"
echo "🚀 开始初始化服务器..."
echo "=================================="
# === 1. 设置主机名 ===
echo "📝 设置主机名:$HOSTNAME"
sudo hostnamectl set-hostname "$HOSTNAME"
# === 2. 配置静态 IP ===
CONN_NAME=$(nmcli -t -f NAME,TYPE connection show | grep ethernet | head -1 | cut -d: -f1)
if [ -z "$CONN_NAME" ]; then
echo "❌ 未找到有线连接"
exit 1
fi
echo "⚙️ 配置静态 IP:$STATIC_IP"
sudo nmcli connection modify "$CONN_NAME" \
ipv4.addresses "$STATIC_IP" \
ipv4.gateway "$GATEWAY" \
ipv4.dns "$DNS" \
ipv4.method manual
sudo nmcli connection down "$CONN_NAME" && sudo nmcli connection up "$CONN_NAME"
# === 3. 更新 hosts ===
echo "📝 更新 /etc/hosts"
echo "127.0.0.1 localhost localhost.localdomain" | sudo tee /etc/hosts
echo "::1 localhost localhost.localdomain" | sudo tee -a /etc/hosts
echo "$STATIC_IP%/*" | cut -d/ -f1 | xargs -I {} echo "{} $HOSTNAME" | sudo tee -a /etc/hosts
# === 4. 安装并配置 SSH ===
echo "🔐 安装并加固 SSH..."
sudo dnf install -y openssh-server
# 修改 SSH 配置
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo sed -i 's/^#*Port .*/Port '"$SSH_PORT"'/' /etc/ssh/sshd_config
sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
# 创建允许用户
if ! id "$ALLOWED_USER" >/dev/null 2>&1; then
sudo useradd -m "$ALLOWED_USER"
echo "设置临时密码(请尽快更换)"
echo "$ALLOWED_USER:TempPass123!" | sudo chpasswd
fi
echo "AllowUsers $ALLOWED_USER" | sudo tee -a /etc/ssh/sshd_config
# === 5. 防火墙配置 ===
echo "🔥 配置防火墙..."
sudo firewall-cmd --permanent --add-port="$SSH_PORT"/tcp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# === 6. 启动服务 ===
echo "🔄 启动服务..."
sudo systemctl enable --now sshd
sudo systemctl enable --now firewalld
# === 7. 输出完成信息 ===
echo
echo "🎉 服务器初始化完成!"
echo "📌 主机名:$HOSTNAME"
echo "📌 IP地址:$(echo $STATIC_IP | cut -d/ -f1)"
echo "📌 SSH端口:$SSH_PORT"
echo "📌 用户名:$ALLOWED_USER"
echo "📌 请将你的公钥添加到 /home/$ALLOWED_USER/.ssh/authorized_keys"
echo "📌 登录命令:ssh -p $SSH_PORT $ALLOWED_USER@$HOSTNAME"
echo "=================================="
🎯 综合案例 2:多服务器免密登录批量配置脚本
功能:为多个服务器配置同一客户端的免密登录
bash
#!/bin/bash
# 文件名:batch_ssh_key.sh
# 功能:为多个服务器配置免密登录
# 服务器列表(IP 用户名 端口)
SERVERS=(
"192.168.1.100 admin 2222"
"192.168.1.101 admin 2222"
"192.168.1.102 admin 2222"
)
# 生成密钥(如不存在)
if [ ! -f ~/.ssh/id_rsa ]; then
echo "🔑 生成 SSH 密钥..."
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "batch-deploy@$(hostname)"
fi
# 遍历服务器
for server in "${SERVERS[@]}"; do
IP=$(echo $server | awk '{print $1}')
USER=$(echo $server | awk '{print $2}')
PORT=$(echo $server | awk '{print $3}')
echo "📤 配置 $USER@$IP:$PORT..."
# 复制公钥
ssh-copy-id -i ~/.ssh/id_rsa.pub -p "$PORT" "$USER@$IP"
# 测试登录
if ssh -p "$PORT" -o ConnectTimeout=5 "$USER@$IP" "echo '✅ 连接成功'" 2>/dev/null; then
echo "🎉 $IP 配置成功"
else
echo "❌ $IP 配置失败"
fi
done
echo "✅ 所有服务器免密登录配置完成!"
🎯 综合案例 3:自动化部署脚本(本地 → 服务器)
功能:打包本地项目,通过 rsync 同步到服务器,重启服务
bash
#!/bin/bash
# 文件名:deploy_app.sh
# 功能:自动化部署 Web 应用
PROJECT_DIR="./myapp"
SERVER="admin@192.168.1.100"
SERVER_PORT="2222"
DEPLOY_DIR="/var/www/html/myapp"
SERVICE="nginx"
echo "📦 开始部署应用..."
echo "=================================="
# === 1. 打包项目(可选)===
echo "📦 打包项目..."
tar -czf myapp.tar.gz -C "$PROJECT_DIR" .
# === 2. 同步到服务器 ===
echo "📤 同步文件到服务器..."
rsync -avz --progress -e "ssh -p $SERVER_PORT" \
"$PROJECT_DIR/" "$SERVER:$DEPLOY_DIR/"
# === 3. 服务器上执行部署后操作 ===
echo "⚙️ 在服务器上执行部署后操作..."
ssh -p "$SERVER_PORT" "$SERVER" << 'EOF'
cd /var/www/html/myapp
# 安装依赖(如 Node.js 项目)
# npm install --production
# 设置权限
sudo chown -R nginx:nginx /var/www/html/myapp
sudo chmod -R 755 /var/www/html/myapp
EOF
# === 4. 重启服务 ===
echo "🔄 重启 $SERVICE 服务..."
ssh -p "$SERVER_PORT" "$SERVER" "sudo systemctl reload $SERVICE"
# === 5. 验证部署 ===
echo "🔍 验证部署..."
ssh -p "$SERVER_PORT" "$SERVER" "curl -s http://localhost/ | head -5"
echo "🎉 部署完成!访问:http://$SERVER"
✅ 学习建议与最佳实践
- 网络配置 :优先使用
nmcli,避免手动编辑文件。 - SSH 安全:禁用 root 登录、改端口、用密钥、禁密码。
- 免密登录:是自动化运维的基础,务必掌握。
- rsync > scp:大文件/目录同步首选 rsync。
- 防火墙:最小权限原则,只开放必需端口。
- 脚本化:所有操作尽量脚本化,便于重复和审计。
📚 附录:命令速查表
| 功能 | 命令示例 |
|---|---|
| 查看 IP | ip a |
| 设置静态 IP | sudo nmcli con mod "Wired" ipv4.addresses "192.168.1.100/24" |
| 设置主机名 | sudo hostnamectl set-hostname web01 |
| 编辑 hosts | sudo vi /etc/hosts |
| 启动 SSH | sudo systemctl start sshd |
| 生成密钥 | ssh-keygen -t rsa -b 4096 |
| 复制公钥 | ssh-copy-id -i ~/.ssh/id_rsa.pub user@host |
| 远程复制文件 | scp -P 2222 file user@host:/path/ |
| 同步目录 | rsync -avz -e "ssh -p 2222" src/ user@host:dest/ |
| 查看防火墙 | sudo firewall-cmd --list-all |
这份文档覆盖了 CentOS Stream 9 网络配置与 SSH 管理的全部核心知识点 + 语法细节 + 实用案例 + 综合项目,所有代码均含详细注释,可直接用于教学、自学或生产环境参考。