跳过正文
  1. 博客文章/

企业级 CentOS 7 系统初始化与优化完整指南

·2893 字·14 分钟·
Linux Centos Centos7 Linux System-Optimization Server-Hardening Production-Deployment
Zayn
作者
Zayn
专注 Kubernetes、CI/CD、可观测性等云原生技术栈,记录生产环境中的实战经验与踩坑复盘。
目录

CentOS 7 系统初始化简介
#

概述
#

CentOS 7 作为企业级 Linux 发行版,在生产环境中广泛应用。新安装的系统需要进行全面的初始化配置和优化,以确保系统的安全性、稳定性和高性能。本指南提供了一套经过生产环境验证的完整初始化方案。

适用场景
#

  • 生产服务器部署:Web 服务器、数据库服务器、应用服务器
  • 容器化环境:Docker 宿主机、Kubernetes 节点
  • 云原生基础设施:微服务架构、DevOps 平台
  • 高可用集群:负载均衡、分布式系统节点

优化目标
#

  • 安全性:系统安全加固、访问控制、审计配置
  • 性能:内核参数调优、网络优化、存储优化
  • 稳定性:服务配置、监控告警、故障恢复
  • 可维护性:标准化配置、自动化脚本、文档规范

系统要求
#

硬件要求
#

环境类型CPU内存存储网络
开发环境2 核4GB50GB100Mbps
测试环境4 核8GB100GB1Gbps
生产环境8 核+16GB+500GB+1Gbps+

软件版本
#

组件版本要求说明
CentOS7.6+推荐 7.9 最新版本
内核3.10+推荐升级到 5.x LTS
Docker19.03+容器化环境
Kubernetes1.18+容器编排平台

⚠️ 重要提示: 本指南中的配置已在 CentOS 7.9 环境中验证,其他版本请根据实际情况调整

系统初始化配置
#

环境检查脚本
#

在开始配置之前,先运行环境检查脚本:

cat > system-check.sh << 'EOF'
#!/bin/bash

echo "=== CentOS 7 系统环境检查 ==="
echo "检查时间: $(date)"
echo

# 检查系统版本
echo "=== 系统信息 ==="
cat /etc/redhat-release
uname -a
echo

# 检查硬件资源
echo "=== 硬件资源 ==="
echo "CPU 信息:"
lscpu | grep -E "(Architecture|CPU|Thread|Core|Socket)"
echo
echo "内存信息:"
free -h
echo
echo "磁盘信息:"
df -h
echo

# 检查网络配置
echo "=== 网络配置 ==="
ip addr show
echo

# 检查服务状态
echo "=== 关键服务状态 ==="
systemctl status firewalld --no-pager -l
systemctl status NetworkManager --no-pager -l
echo

echo "=== 环境检查完成 ==="
EOF

chmod +x system-check.sh
./system-check.sh

系统性能优化
#

内核参数调优
#

创建企业级内核参数配置:

cat > /etc/sysctl.d/99-production.conf << 'EOF'
# ===== 网络性能优化 =====
# 启用桥接网络的 iptables 处理(Kubernetes 必需)
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1

# 启用 IP 转发(容器网络必需)
net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1

# 反向路径过滤(安全优化)
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0

# ARP 配置优化
net.ipv4.conf.default.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2

# 邻居表优化(提高网络性能)
net.ipv4.neigh.default.gc_thresh1=4096
net.ipv4.neigh.default.gc_thresh2=6144
net.ipv4.neigh.default.gc_thresh3=8192
net.ipv4.neigh.default.gc_interval=60
net.ipv4.neigh.default.gc_stale_time=120

# TCP 性能优化
net.ipv4.tcp_slow_start_after_idle=0
net.ipv4.tcp_max_syn_backlog=8096
net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_wmem=4096 12582912 16777216
net.ipv4.tcp_rmem=4096 12582912 16777216

# 网络缓冲区优化
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.netdev_max_backlog=16384
net.core.somaxconn=32768

# ===== 文件系统优化 =====
# 文件监控优化(适用于大量文件监控的应用)
fs.inotify.max_user_watches=524288
fs.inotify.max_user_instances=8192
fs.inotify.max_queued_events=16384

# 文件句柄限制
fs.file-max=2097152

# 内存映射区域限制(Elasticsearch 等应用需要)
vm.max_map_count=262144

# 允许分离挂载点(容器环境需要)
fs.may_detach_mounts=1

# ===== 安全配置 =====
# 硬链接和软链接保护
fs.protected_hardlinks=1
fs.protected_symlinks=1

# 禁用源路由(安全考虑)
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0

# 地址提升配置
net.ipv4.conf.default.promote_secondaries=1
net.ipv4.conf.all.promote_secondaries=1

# ===== 内存管理优化 =====
# 禁用 swap(Kubernetes 推荐)
vm.swappiness=0

# 内存回收优化
vm.dirty_ratio=15
vm.dirty_background_ratio=5
vm.dirty_expire_centisecs=3000
vm.dirty_writeback_centisecs=500

# OOM 配置
vm.panic_on_oom=0
vm.oom_kill_allocating_task=1

# ===== 内核监控配置 =====
kernel.softlockup_all_cpu_backtrace=1
kernel.softlockup_panic=0
kernel.watchdog_thresh=30
kernel.sysrq=1

# 性能监控配置(Prometheus Node Exporter 需要)
kernel.perf_event_paranoid=-1

# 调试配置
kernel.yama.ptrace_scope=0
kernel.core_uses_pid=1
kernel.core_pattern=core.%e.%p.%t

# ===== IPv6 配置 =====
# 禁用 IPv6(如果不需要的话)
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
EOF

# 应用配置
sysctl -p /etc/sysctl.d/99-production.conf

# 验证配置
echo "内核参数配置完成,验证关键参数:"
sysctl net.ipv4.ip_forward
sysctl vm.swappiness
sysctl fs.file-max

系统文件句柄优化
#

# 创建文件句柄优化脚本
cat > optimize-limits.sh << 'EOF'
#!/bin/bash

echo "=== 优化系统文件句柄限制 ==="

# 备份原始配置
cp /etc/security/limits.conf /etc/security/limits.conf.bak

# 配置全局文件句柄限制
cat >> /etc/security/limits.conf << 'LIMITS'
# 全局文件句柄限制
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536

# 特定用户限制(示例)
root soft nofile 65536
root hard nofile 65536
LIMITS

# 配置进程数限制
sed -i 's/4096/65536/g' /etc/security/limits.d/20-nproc.conf

# 验证配置
echo "当前配置:"
grep -v "^#\|^$" /etc/security/limits.conf
echo
echo "进程限制配置:"
cat /etc/security/limits.d/20-nproc.conf

echo "✓ 文件句柄优化完成"
EOF

chmod +x optimize-limits.sh
./optimize-limits.sh

内核升级
#

企业级内核升级脚本
#

cat > update-kernel.sh << 'EOF'
#!/bin/bash

##########################################################
# 企业级内核升级脚本
# 支持 LTS 长期支持版本和最新稳定版本
##########################################################

# 配置变量
KERNEL_TYPE="lt"  # lt: 长期支持版本, ml: 最新稳定版本
BACKUP_DIR="/root/kernel-backup"
LOG_FILE="/var/log/kernel-upgrade.log"

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 环境检查
check_environment() {
    log "=== 环境检查 ==="

    # 检查系统版本
    if ! grep -q "CentOS Linux release 7" /etc/redhat-release; then
        log "错误: 此脚本仅支持 CentOS 7"
        exit 1
    fi

    # 检查网络连接
    if ! ping -c 1 8.8.8.8 >/dev/null 2>&1; then
        log "警告: 网络连接异常,可能影响下载"
    fi

    # 检查磁盘空间
    AVAILABLE_SPACE=$(df /boot | awk 'NR==2 {print $4}')
    if [ "$AVAILABLE_SPACE" -lt 500000 ]; then
        log "错误: /boot 分区空间不足 500MB"
        exit 1
    fi

    log "✓ 环境检查通过"
}

# 备份当前内核信息
backup_kernel_info() {
    log "=== 备份当前内核信息 ==="

    mkdir -p "$BACKUP_DIR"

    # 备份当前内核信息
    uname -a > "$BACKUP_DIR/current-kernel-$(date +%Y%m%d).txt"
    grub2-editenv list > "$BACKUP_DIR/grub-config-$(date +%Y%m%d).txt"

    log "当前内核版本: $(uname -r)"
    log "✓ 内核信息备份完成"
}

# 配置 ELRepo 仓库
setup_elrepo() {
    log "=== 配置 ELRepo 仓库 ==="

    # 导入 GPG 密钥
    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

    # 安装 ELRepo 仓库
    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

    log "✓ ELRepo 仓库配置完成"
}

# 升级内核
upgrade_kernel() {
    log "=== 升级内核 ==="

    # 查看可用内核版本
    yum --disablerepo="*" --enablerepo="elrepo-kernel" list available | grep kernel-${KERNEL_TYPE}

    # 获取最新版本
    LATEST_VERSION=$(yum --disablerepo="*" --enablerepo="elrepo-kernel" list available | grep "kernel-${KERNEL_TYPE}\." | tail -1 | awk '{print $2}')

    if [ -z "$LATEST_VERSION" ]; then
        log "错误: 无法获取内核版本信息"
        exit 1
    fi

    log "准备安装内核版本: $LATEST_VERSION"

    # 安装新内核
    yum -y --enablerepo=elrepo-kernel install kernel-${KERNEL_TYPE} kernel-${KERNEL_TYPE}-devel

    if [ $? -eq 0 ]; then
        log "✓ 内核安装成功"
    else
        log "✗ 内核安装失败"
        exit 1
    fi
}

# 配置启动项
configure_grub() {
    log "=== 配置 GRUB 启动项 ==="

    # 获取新内核的启动项
    NEW_KERNEL=$(awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg | grep -E "kernel-${KERNEL_TYPE}" | head -1 | cut -d: -f2 | sed 's/^ *//')

    if [ -n "$NEW_KERNEL" ]; then
        grub2-set-default "$NEW_KERNEL"
        log "设置默认启动内核: $NEW_KERNEL"
    else
        log "警告: 无法自动设置启动项,请手动配置"
    fi

    # 重新生成 GRUB 配置
    grub2-mkconfig -o /boot/grub2/grub.cfg

    log "✓ GRUB 配置完成"
}

# 内核版本锁定
lock_kernel_version() {
    log "=== 锁定内核版本 ==="

    # 安装版本锁定工具
    yum -y install yum-versionlock

    # 锁定内核版本
    yum versionlock add kernel-${KERNEL_TYPE}*

    # 显示锁定的包
    yum versionlock list

    log "✓ 内核版本锁定完成"
}

# 清理旧内核
cleanup_old_kernels() {
    log "=== 清理旧内核 ==="

    # 保留最新的 2 个内核版本
    package-cleanup --oldkernels --count=2 -y

    log "✓ 旧内核清理完成"
}

# 主函数
main() {
    log "=== 开始内核升级 ==="

    check_environment
    backup_kernel_info
    setup_elrepo
    upgrade_kernel
    configure_grub
    lock_kernel_version

    log "=== 内核升级完成 ==="
    log "当前内核: $(uname -r)"
    log "新内核将在重启后生效"

    read -p "是否现在重启系统以使用新内核?[y/N]: " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        log "系统重启中..."
        reboot
    else
        log "请稍后手动重启系统"
    fi
}

# 执行主函数
main "$@"
EOF

chmod +x update-kernel.sh

# 执行内核升级(可选)
echo "内核升级脚本已创建,如需升级请执行:"
echo "./update-kernel.sh"

内核升级后验证
#

cat > verify-kernel.sh << 'EOF'
#!/bin/bash

echo "=== 内核升级验证 ==="

# 检查当前内核版本
echo "当前内核版本:"
uname -r

# 检查内核模块
echo -e "\n检查关键内核模块:"
lsmod | grep -E "(bridge|overlay|ip_tables|iptable_filter|iptable_nat)"

# 检查网络功能
echo -e "\n检查网络功能:"
if ip link show docker0 >/dev/null 2>&1; then
    echo "✓ Docker 网络正常"
else
    echo "ℹ Docker 未安装或未启动"
fi

# 检查容器功能(如果安装了 Docker)
if command -v docker >/dev/null 2>&1; then
    echo -e "\n检查容器功能:"
    docker run --rm hello-world >/dev/null 2>&1 && echo "✓ Docker 容器功能正常" || echo "⚠ Docker 容器功能异常"
fi

echo -e "\n=== 验证完成 ==="
EOF

chmod +x verify-kernel.sh

系统安全配置
#

网络接口配置
#

统一网卡名称为 ethx
#

cat > configure-network-interface.sh << 'EOF'
#!/bin/bash

echo "=== 配置网络接口名称 ==="

# 备份 GRUB 配置
cp /etc/default/grub /etc/default/grub.bak

# 修改 GRUB 配置,统一网卡名称
sed -i 's/GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 cgroup_enable=memory swapaccount=1 \1"/g' /etc/default/grub

# 重新生成 GRUB 配置
grub2-mkconfig -o /boot/grub2/grub.cfg

echo "✓ 网络接口配置完成"
echo "重启后网卡将使用 eth0, eth1... 命名方式"
EOF

chmod +x configure-network-interface.sh
./configure-network-interface.sh

SELinux 配置
#

安全策略配置
#

cat > configure-selinux.sh << 'EOF'
#!/bin/bash

echo "=== 配置 SELinux 安全策略 ==="

# 备份原始配置
cp /etc/selinux/config /etc/selinux/config.bak

# 检查当前状态
echo "当前 SELinux 状态:"
getenforce
sestatus

# 根据环境选择配置
read -p "选择 SELinux 模式 [1=Disabled, 2=Permissive, 3=Enforcing]: " choice

case $choice in
    1)
        echo "配置为 Disabled 模式(生产环境推荐)"
        sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
        setenforce 0 2>/dev/null || true
        ;;
    2)
        echo "配置为 Permissive 模式(调试环境)"
        sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
        setenforce 0
        ;;
    3)
        echo "保持 Enforcing 模式(高安全环境)"
        sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
        # 配置容器相关策略
        setsebool -P container_manage_cgroup on
        ;;
    *)
        echo "无效选择,保持默认配置"
        ;;
esac

echo "当前配置:"
grep "^SELINUX=" /etc/selinux/config
echo "✓ SELinux 配置完成"
EOF

chmod +x configure-selinux.sh
./configure-selinux.sh

防火墙配置
#

企业级防火墙配置
#

cat > configure-firewall.sh << 'EOF'
#!/bin/bash

echo "=== 配置企业级防火墙 ==="

# 检查防火墙状态
systemctl status firewalld --no-pager

read -p "选择防火墙配置 [1=关闭, 2=基础配置, 3=严格配置]: " fw_choice

case $fw_choice in
    1)
        echo "关闭防火墙(内网环境)"
        systemctl stop firewalld
        systemctl disable firewalld
        echo "✓ 防火墙已关闭"
        ;;
    2)
        echo "配置基础防火墙规则"
        systemctl enable firewalld
        systemctl start firewalld

        # 基础服务端口
        firewall-cmd --permanent --add-service=ssh
        firewall-cmd --permanent --add-service=http
        firewall-cmd --permanent --add-service=https

        # 常用端口
        firewall-cmd --permanent --add-port=8080/tcp
        firewall-cmd --permanent --add-port=9090/tcp

        firewall-cmd --reload
        echo "✓ 基础防火墙配置完成"
        ;;
    3)
        echo "配置严格防火墙规则"
        systemctl enable firewalld
        systemctl start firewalld

        # 设置默认区域
        firewall-cmd --set-default-zone=public

        # 仅允许必要服务
        firewall-cmd --permanent --add-service=ssh

        # 限制 SSH 访问(示例:仅允许特定网段)
        firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/16" service name="ssh" accept'
        firewall-cmd --permanent --remove-service=ssh

        firewall-cmd --reload
        echo "✓ 严格防火墙配置完成"
        ;;
    *)
        echo "保持默认防火墙配置"
        ;;
esac

# 显示当前规则
echo "当前防火墙规则:"
firewall-cmd --list-all 2>/dev/null || echo "防火墙未启用"
EOF

chmod +x configure-firewall.sh
./configure-firewall.sh

SSH 安全加固
#

SSH 服务优化配置
#

cat > harden-ssh.sh << 'EOF'
#!/bin/bash

echo "=== SSH 安全加固 ==="

# 备份原始配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 创建安全配置
cat > /etc/ssh/sshd_config.secure << 'SSHCONFIG'
# SSH 安全配置
Port 22
Protocol 2

# 认证配置
PermitRootLogin no
PasswordAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 安全选项
UseDNS no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
X11Forwarding no
AllowTcpForwarding no
PermitTunnel no

# 连接限制
MaxAuthTries 3
MaxSessions 10
MaxStartups 10:30:100
LoginGraceTime 60

# 会话配置
ClientAliveInterval 300
ClientAliveCountMax 2
TCPKeepAlive yes

# 日志配置
SyslogFacility AUTHPRIV
LogLevel INFO

# 允许的用户和组(根据需要修改)
# AllowUsers user1 user2
# AllowGroups wheel

# 禁用空密码
PermitEmptyPasswords no

# 严格模式
StrictModes yes

# 主机密钥
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SSHCONFIG

# 应用配置
read -p "是否应用 SSH 安全配置?[y/N]: " apply_ssh
if [[ $apply_ssh =~ ^[Yy]$ ]]; then
    cp /etc/ssh/sshd_config.secure /etc/ssh/sshd_config

    # 测试配置
    sshd -t
    if [ $? -eq 0 ]; then
        systemctl restart sshd
        echo "✓ SSH 安全配置已应用"
    else
        echo "✗ SSH 配置有误,已恢复原始配置"
        cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
    fi
else
    echo "SSH 配置已保存到 /etc/ssh/sshd_config.secure"
fi

echo "✓ SSH 安全加固完成"
EOF

chmod +x harden-ssh.sh
./harden-ssh.sh

软件包管理与优化
#

YUM 源配置
#

配置国内镜像源
#

cat > configure-yum-repos.sh << 'EOF'
#!/bin/bash

echo "=== 配置 YUM 镜像源 ==="

# 备份原始仓库配置
if [ -d /etc/yum.repos.d ]; then
    mv /etc/yum.repos.d /etc/yum.repos.d.backup.$(date +%Y%m%d)
fi

mkdir -p /etc/yum.repos.d

# 配置阿里云镜像源
echo "配置阿里云镜像源..."
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 配置 Docker CE 仓库
echo "配置 Docker CE 仓库..."
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 配置 Kubernetes 仓库
echo "配置 Kubernetes 仓库..."
cat > /etc/yum.repos.d/kubernetes.repo << 'K8SREPO'
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
K8SREPO

# 清理并重建缓存
yum clean all
yum makecache fast

echo "✓ YUM 源配置完成"
yum repolist
EOF

chmod +x configure-yum-repos.sh
./configure-yum-repos.sh

基础软件安装
#

系统工具安装
#

cat > install-base-tools.sh << 'EOF'
#!/bin/bash

echo "=== 安装基础系统工具 ==="

# 基础工具包
BASE_TOOLS=(
    "vim"
    "wget"
    "curl"
    "git"
    "tree"
    "htop"
    "iotop"
    "iftop"
    "lsof"
    "strace"
    "tcpdump"
    "telnet"
    "nc"
    "rsync"
    "screen"
    "tmux"
    "bash-completion"
    "yum-utils"
    "device-mapper-persistent-data"
    "lvm2"
)

# 开发工具包
DEV_TOOLS=(
    "gcc"
    "gcc-c++"
    "make"
    "cmake"
    "autoconf"
    "automake"
    "libtool"
    "pkgconfig"
)

# 网络工具包
NET_TOOLS=(
    "net-tools"
    "bind-utils"
    "traceroute"
    "mtr"
    "nmap"
    "wireshark"
)

# 系统监控工具
MONITOR_TOOLS=(
    "sysstat"
    "dstat"
    "atop"
    "nethogs"
    "iperf3"
)

# 安装函数
install_packages() {
    local packages=("$@")
    echo "安装软件包: ${packages[*]}"

    yum install -y "${packages[@]}"

    if [ $? -eq 0 ]; then
        echo "✓ 软件包安装成功"
    else
        echo "✗ 软件包安装失败"
        return 1
    fi
}

# 主安装流程
main() {
    echo "开始安装基础工具..."

    # 更新系统
    yum update -y

    # 安装各类工具
    install_packages "${BASE_TOOLS[@]}"
    install_packages "${DEV_TOOLS[@]}"
    install_packages "${NET_TOOLS[@]}"
    install_packages "${MONITOR_TOOLS[@]}"

    # 安装 EPEL 仓库
    yum install -y epel-release

    echo "✓ 基础工具安装完成"
}

main "$@"
EOF

chmod +x install-base-tools.sh
./install-base-tools.sh

时间同步配置
#

NTP/Chrony 时间同步
#

cat > configure-time-sync.sh << 'EOF'
#!/bin/bash

echo "=== 配置时间同步服务 ==="

# 选择时间同步服务
read -p "选择时间同步服务 [1=Chrony(推荐), 2=NTP]: " time_service

case $time_service in
    1)
        echo "配置 Chrony 时间同步..."

        # 安装 Chrony
        yum install -y chrony

        # 配置 Chrony
        cat > /etc/chrony.conf << 'CHRONYCONF'
# 使用阿里云 NTP 服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst

# 备用 NTP 服务器
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst

# 记录系统时钟获得/丢失时间的速率
driftfile /var/lib/chrony/drift

# 允许系统时钟在前三次更新中步进
makestep 1.0 3

# 启用内核同步 RTC
rtcsync

# 日志目录
logdir /var/log/chrony
CHRONYCONF

        # 启动服务
        systemctl enable chronyd
        systemctl start chronyd

        # 验证同步状态
        chrony sources -v
        ;;
    2)
        echo "配置 NTP 时间同步..."

        # 安装 NTP
        yum install -y ntp ntpdate

        # 配置 NTP
        cat > /etc/ntp.conf << 'NTPCONF'
# 使用阿里云 NTP 服务器
server ntp.aliyun.com prefer
server ntp1.aliyun.com
server ntp2.aliyun.com
server ntp3.aliyun.com

# 备用 NTP 服务器
server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org

# 限制访问
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1

# 日志文件
logfile /var/log/ntp.log

# 漂移文件
driftfile /var/lib/ntp/drift
NTPCONF

        # 启动服务
        systemctl enable ntpd
        systemctl start ntpd

        # 验证同步状态
        ntpq -p
        ;;
    *)
        echo "保持默认时间配置"
        ;;
esac

# 设置时区
timedatectl set-timezone Asia/Shanghai

# 显示时间状态
timedatectl status

echo "✓ 时间同步配置完成"
EOF

chmod +x configure-time-sync.sh
./configure-time-sync.sh

用户安全配置
#

终端安全设置
#

cat > configure-user-security.sh << 'EOF'
#!/bin/bash

echo "=== 配置用户安全设置 ==="

# 配置终端超时
echo "配置终端自动超时..."
cat >> /etc/profile << 'PROFILE'

# 终端超时设置(30分钟)
export TMOUT=1800
readonly TMOUT

# 历史命令配置
export HISTSIZE=1000
export HISTFILESIZE=2000
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
export HISTCONTROL=ignoredups:erasedups

# 安全提示
echo "欢迎使用 $(hostname) 系统"
echo "当前时间: $(date)"
echo "系统负载: $(uptime | awk -F'load average:' '{print $2}')"
PROFILE

# 配置密码策略
echo "配置密码策略..."
cat >> /etc/login.defs << 'LOGINDEFS'

# 密码策略配置
PASS_MAX_DAYS   90
PASS_MIN_DAYS   1
PASS_MIN_LEN    8
PASS_WARN_AGE   7
LOGINDEFS

# 配置 PAM 密码复杂度
if [ -f /etc/pam.d/system-auth ]; then
    # 备份原始文件
    cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak

    # 添加密码复杂度要求
    sed -i '/pam_pwquality.so/c\password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1' /etc/pam.d/system-auth
fi

# 配置登录失败锁定
cat >> /etc/pam.d/sshd << 'PAMLOCKOUT'
# 登录失败锁定配置
auth required pam_tally2.so deny=5 unlock_time=300 even_deny_root root_unlock_time=300
PAMLOCKOUT

echo "✓ 用户安全配置完成"
source /etc/profile
EOF

chmod +x configure-user-security.sh
./configure-user-security.sh

容器化环境配置
#

Docker 安装与优化
#

企业级 Docker 安装脚本
#

cat > install-docker.sh << 'EOF'
#!/bin/bash

echo "=== 企业级 Docker 安装脚本 ==="

DOCKER_VERSION="20.10.21"
DOCKER_COMPOSE_VERSION="2.12.2"

# 环境检查
check_environment() {
    echo "检查系统环境..."

    # 检查内核版本
    KERNEL_VERSION=$(uname -r | cut -d. -f1-2)
    if [ "$(echo "$KERNEL_VERSION >= 3.10" | bc)" -eq 0 ]; then
        echo "错误: 内核版本过低,需要 3.10 或更高版本"
        exit 1
    fi

    # 检查存储驱动支持
    if ! grep -q overlay /proc/filesystems; then
        echo "警告: 系统不支持 overlay2 存储驱动"
    fi

    echo "✓ 环境检查通过"
}

# 安装 Docker
install_docker() {
    echo "安装 Docker CE..."

    # 卸载旧版本
    yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

    # 安装依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2

    # 添加 Docker 仓库
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    # 更新缓存
    yum makecache fast

    # 安装指定版本的 Docker
    if [ -n "$DOCKER_VERSION" ]; then
        yum install -y docker-ce-${DOCKER_VERSION} docker-ce-cli-${DOCKER_VERSION} containerd.io
    else
        yum install -y docker-ce docker-ce-cli containerd.io
    fi

    echo "✓ Docker 安装完成"
}

# 配置 Docker
configure_docker() {
    echo "配置 Docker..."

    # 创建配置目录
    mkdir -p /etc/docker

    # 创建 Docker 配置文件
    cat > /etc/docker/daemon.json << 'DOCKERCONFIG'
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m",
        "max-file": "3"
    },
    "storage-driver": "overlay2",
    "storage-opts": [
        "overlay2.override_kernel_check=true"
    ],
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": [
        "https://mirror.ccs.tencentyun.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com"
    ],
    "insecure-registries": [
        "harbor.company.com",
        "registry.company.com"
    ],
    "max-concurrent-downloads": 10,
    "max-concurrent-uploads": 5,
    "default-address-pools": [
        {
            "base": "172.30.0.0/16",
            "size": 24
        }
    ],
    "oom-score-adjust": -1000,
    "live-restore": true,
    "userland-proxy": false,
    "experimental": false,
    "metrics-addr": "0.0.0.0:9323",
    "iptables": true,
    "ip-forward": true,
    "ip-masq": true,
    "ipv6": false,
    "fixed-cidr-v6": "",
    "default-gateway": "",
    "default-gateway-v6": "",
    "bridge": "",
    "bip": "",
    "mtu": 0,
    "default-ulimits": {
        "nofile": {
            "Name": "nofile",
            "Hard": 64000,
            "Soft": 64000
        }
    }
}
DOCKERCONFIG

    echo "✓ Docker 配置完成"
}

# 优化 Docker 服务
optimize_docker_service() {
    echo "优化 Docker 服务..."

    # 创建 systemd 覆盖目录
    mkdir -p /etc/systemd/system/docker.service.d

    # 创建服务优化配置
    cat > /etc/systemd/system/docker.service.d/override.conf << 'SERVICECONFIG'
[Service]
# 防止 OOM 杀死 Docker 守护进程
OOMScoreAdjust=-1000

# 设置文件描述符限制
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity

# 设置启动后执行的命令
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT

# 重启策略
Restart=always
RestartSec=5
SERVICECONFIG

    echo "✓ Docker 服务优化完成"
}

# 安装 Docker Compose
install_docker_compose() {
    echo "安装 Docker Compose..."

    # 下载 Docker Compose
    curl -L "https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    # 设置执行权限
    chmod +x /usr/local/bin/docker-compose

    # 创建软链接
    ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose

    # 验证安装
    docker-compose --version

    echo "✓ Docker Compose 安装完成"
}

# 启动和验证
start_and_verify() {
    echo "启动 Docker 服务..."

    # 重新加载 systemd 配置
    systemctl daemon-reload

    # 启动 Docker
    systemctl start docker
    systemctl enable docker

    # 验证安装
    echo "验证 Docker 安装..."
    docker --version
    docker info

    # 运行测试容器
    echo "运行测试容器..."
    docker run --rm hello-world

    if [ $? -eq 0 ]; then
        echo "✓ Docker 安装验证成功"
    else
        echo "✗ Docker 安装验证失败"
        exit 1
    fi
}

# 主函数
main() {
    check_environment
    install_docker
    configure_docker
    optimize_docker_service
    install_docker_compose
    start_and_verify

    echo "=== Docker 安装完成 ==="
    echo "Docker 版本: $(docker --version)"
    echo "Docker Compose 版本: $(docker-compose --version)"
    echo "配置文件: /etc/docker/daemon.json"
    echo "服务配置: /etc/systemd/system/docker.service.d/override.conf"
}

main "$@"
EOF

chmod +x install-docker.sh
./install-docker.sh

系统监控配置
#

基础监控脚本
#

cat > system-monitor.sh << 'EOF'
#!/bin/bash

echo "=== 系统监控信息 ==="
echo "检查时间: $(date)"
echo

# 系统负载
echo "=== 系统负载 ==="
uptime
echo

# CPU 使用率
echo "=== CPU 使用率 ==="
top -bn1 | grep "Cpu(s)" | awk '{print $2 $4}'
echo

# 内存使用情况
echo "=== 内存使用情况 ==="
free -h
echo

# 磁盘使用情况
echo "=== 磁盘使用情况 ==="
df -h | grep -vE '^Filesystem|tmpfs|cdrom'
echo

# 网络连接
echo "=== 网络连接统计 ==="
ss -tuln | wc -l
echo "总连接数: $(ss -tuln | wc -l)"
echo

# 进程统计
echo "=== 进程统计 ==="
echo "总进程数: $(ps aux | wc -l)"
echo "运行中进程: $(ps aux | awk '$8 ~ /^R/ {count++} END {print count+0}')"
echo

# Docker 状态(如果安装了)
if command -v docker >/dev/null 2>&1; then
    echo "=== Docker 状态 ==="
    echo "Docker 版本: $(docker --version)"
    echo "运行中容器: $(docker ps -q | wc -l)"
    echo "总容器数: $(docker ps -aq | wc -l)"
    echo "镜像数量: $(docker images -q | wc -l)"
    echo
fi

echo "=== 监控信息收集完成 ==="
EOF

chmod +x system-monitor.sh

总结
#

配置验证脚本
#

cat > verify-configuration.sh << 'EOF'
#!/bin/bash

echo "=== CentOS 7 配置验证脚本 ==="
echo "验证时间: $(date)"
echo

PASS=0
FAIL=0

# 验证函数
verify() {
    local test_name="$1"
    local command="$2"

    echo -n "检查 $test_name: "

    if eval "$command" >/dev/null 2>&1; then
        echo "✓ 通过"
        ((PASS++))
    else
        echo "✗ 失败"
        ((FAIL++))
    fi
}

# 系统配置验证
echo "=== 系统配置验证 ==="
verify "内核参数" "sysctl net.ipv4.ip_forward | grep -q 1"
verify "文件句柄限制" "ulimit -n | grep -q 65536"
verify "SELinux 状态" "getenforce | grep -qE 'Disabled|Permissive'"
verify "时间同步" "systemctl is-active chronyd || systemctl is-active ntpd"

# 网络配置验证
echo -e "\n=== 网络配置验证 ==="
verify "网络连通性" "ping -c 1 8.8.8.8"
verify "DNS 解析" "nslookup google.com"

# 服务状态验证
echo -e "\n=== 服务状态验证 ==="
verify "SSH 服务" "systemctl is-active sshd"

# Docker 验证(如果安装了)
if command -v docker >/dev/null 2>&1; then
    echo -e "\n=== Docker 验证 ==="
    verify "Docker 服务" "systemctl is-active docker"
    verify "Docker 功能" "docker run --rm hello-world"
fi

# 安全配置验证
echo -e "\n=== 安全配置验证 ==="
verify "防火墙状态" "systemctl is-active firewalld || systemctl is-failed firewalld"
verify "SSH 配置" "grep -q 'UseDNS no' /etc/ssh/sshd_config"

# 总结
echo -e "\n=== 验证结果 ==="
echo "通过: $PASS 项"
echo "失败: $FAIL 项"

if [ $FAIL -eq 0 ]; then
    echo "✓ 所有配置验证通过"
    exit 0
else
    echo "⚠ 有 $FAIL 项配置需要检查"
    exit 1
fi
EOF

chmod +x verify-configuration.sh
./verify-configuration.sh

部署优势
#

通过本指南的配置,您的 CentOS 7 系统将具备以下优势:

性能优势
#

  • 内核优化:针对容器化和高并发场景的内核参数调优
  • 网络优化:TCP/IP 栈优化,提升网络性能
  • 存储优化:文件系统和 I/O 性能优化
  • 资源管理:合理的资源限制和调度策略

安全优势
#

  • 系统加固:SELinux、防火墙、SSH 安全配置
  • 访问控制:用户权限管理和登录安全
  • 审计日志:完整的系统操作审计
  • 漏洞防护:及时的安全更新和补丁管理

运维优势
#

  • 标准化配置:统一的系统配置标准
  • 自动化脚本:完整的自动化部署脚本
  • 监控集成:系统监控和告警机制
  • 故障排除:完善的诊断和恢复工具

最佳实践
#

生产环境建议
#

  1. 定期更新:保持系统和软件包的及时更新
  2. 备份策略:建立完善的系统和数据备份机制
  3. 监控告警:部署全面的系统监控和告警
  4. 文档维护:保持配置文档的及时更新
  5. 安全审计:定期进行安全检查和漏洞扫描

扩展建议
#

  • 集群部署:配置高可用和负载均衡
  • 容器编排:集成 Kubernetes 或 Docker Swarm
  • CI/CD 集成:与 Jenkins、GitLab CI 等工具集成
  • 监控平台:部署 Prometheus、Grafana 等监控方案

通过本指南的配置和最佳实践,您可以构建一个安全、稳定、高性能的企业级 CentOS 7 系统,为各种应用场景提供可靠的基础平台支撑。

相关文章

Docker 部署多网口 openWrt 软路由
·281 字·2 分钟
Openwrt Linux Centos7
使用 Docker 快速部署 Redis 服务器
·259 字·2 分钟
Docker Redis Centos7 Docker
Kind 部署本地k8s集群的使用记录
·238 字·2 分钟
Kubernetes Docker DevOps Centos7 Kind