尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

服务器接管后的可运维性加固:从SSH到DNS的完整清单

发布时间:2026/9/8 14:02:54

资讯中心
01
ARTICLE

服务器接管后的可运维性加固:从SSH到DNS的完整清单

服务器接管后的可运维性加固:从SSH到DNS的完整清单
接手这类“只剩一台跑着业务的旧服务器文档缺失、官方资料等于没有”的运维任务时很多人会把“服务器被修好了”当作终点。但真正的问题往往从“修好”这一刻才开始服务起来了密码还是老一套数据能读了时间却彻底错乱防火墙要么全开要么全关谁改过也不知道。等到了复盘时才发现真正一次性的不是服务器修复动作而是让这台机器重新进入可运维、可监控、可回滚状态的整套机制。这就是“盗梦空间扶贫77”这个项目给我最强烈的感受既然是扶贫就不能只是扶起点而要把一套基本功扶起来。这篇文章不对论项目层面的对错只谈在类似场景里怎么把服务器从“能被骗着跑起来”推进到“修复后不再出问题”。如果你也经历过没有欧、没有架构图、没有应急预案的服务器接管这篇可以将给你一个可复制的服务器运维标准流程从访问验证开始到时间同步、DNS 检查、防火墙策略、磁盘清理、监控修复每一步都有可落地的命令和验证手段。1. 这篇文章真正要解决的问题先回答一个问题拥有一台“能启动、服务能访问”的服务器和拥有一台“可运维”的服务器差别在哪差别在于“未知”的多少。能启动只说明进程活着可运维说明我们可以预见问题、发现问题、验证修复结果。真正常见的故障不是当场宕机而是安全隐患、时间不同步、磁盘缓慢膨胀、DNS 被修改导致域名解析异常、SSH 密钥遗失后只能靠密码登录。这些都不会让服务立刻挂掉但会在未来某个时间点时爆发并且令当时的人抱着屏幕找不出入口。1.1 适用于什么场景这篇文章适合以下情况接手一套历史遗留系统服务器已经运行很长时间“官方文档”基本不覆盖到具体机器。原运维人员已经离开只有账号密码没有交接文档。服务器运行在云厂商、虚拟化平台或者自建机房中需要我们对底层的连通性、时间、DNS、密钥访问做一次系统梳理。刚完成一次应急抢修重启后服务恢复但大家不知道还有多少网关的问题埋在里面。换句话说本文不解决业务代码怎么改解决的是服务器本身的基础可运维性。1.2 读完你可以获得什么你将得到一套按顺序执行的服务器修复与加固清单安全、受控地访问服务器。验证时间服务器配置解决日志时间错乱问题。确认 DNS 与主机名解析状态。收敛防火墙策略避免服务“裸奔”。处理磁盘日志膨胀释放被 garbage 占用的空间。用一个最小脚本把这些动作固化下来便于下次接管。这套流程适合 Linux 服务器本文以 systemd 管理的发行版为主使用的命令在 Ubuntu、Rocky Linux、CentOS 上都可以迁移。2. 基础概念服务器修复不等于“开机”在动手之前先厘清几个概念否则后面很容易走进误区。2.1 时间服务与日志“时间错乱”Linux 服务器有一个常被忽略但影响极大的基础服务时间同步。业务系统之间协作、日志分析、数据库主从同步全都依赖统一的时间线。如果服务器和真实时间相差几分钟即使业务看起来正常查询日志时也会发现报错序列完全对不上。实现时间同步的常见服务有 ntp、chrony。现代 CentOS/Rocky 系统默认安装 chronyUbuntu 现在也支持两种方式。timedatectl是系统时间状态的关键入口它可以查看是否有 NTP 服务在运行同时查看系统时分是否与硬件时钟同步。2.2 SSH 密钥与密码登录很多线上故障并非来自外部攻击而是来自管理访问不受控。管理员用密码登录密码在多个环境之间复用。一旦一台机器被攻破攻击者可以拿着同一个密码去碰撞内网其他服务器。正确的做法是使用密钥登录管理员生成一对密钥公钥放在服务器上私钥留在本地。服务器上仅保留受控账号的密钥禁用密码登录这样至少把常见的暴力猜解路径切断了。2.3 DNS 解析是排查第一对象域名解析出错表现很诡异业务进程没有异常但对外调用时超时。常见原因包括/etc/resolv.conf 被运维工具或桌面进程覆盖成错误的 nameserver。系统开启了 systemd-resolved直接修改 /etc/resolv.conf 后重启又被还原。服务器本身是 DNS server比如热门词里的“windows架构dns服务器”但仍存在上游解析失败问题。排查时要分清是本地解析失败还是上游 DNS 失败是到域名的 TCP 连接失败还是查询本身无响应。只有逐层定位才不至于被表面现象带偏。2.4 防火墙与安全组是两道门服务器可能同时有操作系统层防火墙和云平台安全组。前者是 iptables/nftables/firewalld后者是云控制台上的安全组规则。修复时最怕只改一处另一处仍然不通然后陷入“我明明放了端口怎么还是连不上”的循环。判断思路很简单先确认服务监听在哪个端口上再用本机 telnet/nc 验证再用外部机器验证然后逐层检查云安全组、主机防火墙不要跳顺序。3. 环境准备与前置条件开始实操前先准备好环境和工具。本文假设你有一台已经能 SSH 连接的服务器现场可能没有控制台也可能还能进入系统但很勉强。需要准备的东西如下3.1 本地环境要求Linux 系统或者 macOS 上的终端Windows 用户可以安装 WSL 或在 PowerShell 中使用 OpenSSH 客户端。准备一个 SSH 密钥对。执行ssh-keygen -t ed25519 -C ops-lead laptop生成的公钥保存在~/.ssh/id_ed25519.pub。准备终端远程管理工具例如 MobaXterm、FinalShell但命令本身不依赖这些工具。3.2 查看服务器发行版信息在动手修改前先确认发行版和 systemd 版本cat /etc/os-release systemctl --version | head -n 1 uname -a如果系统启动方式比较老没有 systemd需要改用 init.d 风格的服务管理但本文所有命令以 systemd 为主。3.3 备份当前关键配置服务器上最怕“直接覆盖原配置文件”因为新版本语法可能不兼容。修复前先备份以下文件mkdir -p /root/ops_backup_$(date %Y%m%d) cp /etc/ssh/sshd_config /root/ops_backup_$(date %Y%m%d)/ cp /etc/chrony/chrony.conf /root/ops_backup_$(date %Y%m%d)/ 2/dev/null || true cp /etc/resolv.conf /root/ops_backup_$(date %Y%m%d)/ 2/dev/null || true cp -r /etc/nginx /root/ops_backup_$(date %Y%m%d)/ 2/dev/null || true cp /etc/fstab /root/ops_backup_$(date %Y%m%d)/ 2/dev/null || true备份的意义在于复现“修复前状态”一旦遇到底层信息不一致可以从备份还原。生产环境变更前一定要做备份这是不可跳过的步骤。4. 核心流程拆解从访问到加固下面按步骤执行每步都给出“做什么、为什么、怎么做、做错了会怎样”。4.1 第一步收敛 SSH 登录入口进入服务器后第一步不是装监控而是先确认当前有哪些人能登录以及通过什么方式登录。检查当前 SSH 服务状态和监听地址systemctl status sshd ss -lntp | grep 22若 SSH 服务监听在0.0.0.0:22代表所有网卡都可以访问。如果这台机器只需要内网运维建议将监听地址改为内网 IP比如10.0.0.8。生成并放置密钥在本地生成密钥后将公钥写入服务器的授权文件mkdir -p /home/ops/.ssh echo ssh-ed25519 AAAA... ops-lead laptop /home/ops/.ssh/authorized_keys chown -R ops:ops /home/ops/.ssh chmod 700 /home/ops/.ssh chmod 600 /home/ops/.ssh/authorized_keys这里注意账号选择建议专门建立运维账号 ops而不是直接用 root。像 AllowUsers 这样的配置可以限制只有白名单账号能 SSH 登录避免曾经使用过这台机器的人继续爆破 root 密码。修改 sshd 配置编辑/etc/ssh/sshd_config加入以下关键配置PermitRootLogin prohibit-password PasswordAuthentication no PubkeyAuthentication yes AllowUsers ops ClientAliveInterval 120 ClientAliveCountMax 3配置说明PermitRootLogin prohibit-password禁止 root 使用密码登录但允许密钥登录。这样即使 root 密码被尝试也无法远程突破。PasswordAuthentication no关闭密码认证只允许公钥。AllowUsers ops仅允许 ops 用户通过 SSH 登录其他账号即使存在也不能登录。ClientAliveInterval 120与ClientAliveCountMax 3保证断连心跳防止死连接长期占用资源。修改后先执行配置语法检查sshd -t如果输出没有任何错误再执行热重载systemctl reload sshd这里有一个关键提醒不要修改配置后立刻关闭当前连接。应该先开一个新窗口尝试新的登录方式确认密钥能够登录后再关闭旧窗口。如果密钥登录失败还可以用旧连接回滚配置。4.2 第二步检查时间服务器同步服务器时间错乱会导致日志时间跳跃、证书验证失败、数据库主从异常。检查当前时间状态timedatectl status date hwclock --show如果NTP synchronized: no说明服务器没有和外部时间源同步。使用 chrony 配置时间同步在 Ubuntu 或 Rocky 上安装 chronyapt install chrony -y # 或者 yum install chrony -y编辑/etc/chrony/chrony.conf这里要根据实际网络环境选择时间源。国内环境可以使用阿里云 NTP也可以使用系统自带默认池但需要确认服务器出口网络能够访问对应域名pool ntp.aliyun.com iburst pool cn.pool.ntp.org iburst local stratum 10iburst表示初始同步时快速发出多个请求缩短校准时间。local stratum 10表示如果外部时间源不可达允许本机作为时间服务器但只有在离线环境才建议保留这行否则会影响优先级判断。启动并验证systemctl enable --now chrony chronyc sources -v chronyc tracking如果chronyc sources中^*符号出现说明已经锁定了一个有效时间源^?代表不可达。如果是^?先检查防火墙 UDP 123 端口是否被阻断。手动校准一次如果服务器时间偏差很大可以先手动校准一次再交给 chrony 持续同步timedatectl set-ntp false chronyc makestep systemctl restart chrony timedatectl set-ntp truemakestep允许 chrony 在启动时大跨度调整时间。注意大跨度调整时间对运行中的数据库事务可能产生影响生产环境操作前一定要评估业务容忍度必要时申请变更窗口。4.3 第三步确认 DNS 与网络连通性时间同步完成后检查 DNS。DNS 典型故障是能 ping 通 IP 但访问域名超时或者服务器依赖某个内部域名解析服务结果解析被指向错误地址。先看一下当前配置cat /etc/resolv.conf systemd-resolve --status 2/dev/null || resolvectl status 2/dev/null在 Ubuntu 18.04 之后的系统上如果启用了 systemd-resolved手动修改/etc/resolv.conf很可能会在重启后失效因为/etc/resolv.conf是指向 systemd 管理文件的链接。此时有两种做法如果服务器是作为一个普通客户端使用系统默认 DNS可以配置 netplan 或 NetworkManager 的 DNS。如果服务器是 DNS server需要检查上游 forwarder 配置和监听端口。下面是常见的网络验证命令# 解析本机主机名 hostname -f # 测试域名解析 getent hosts github.com # 使用指定 DNS 服务器解析 dig 223.5.5.5 github.com short # 使用系统配置解析 nslookup github.com如果 getent 返回结果很快继续检查网络层ip addr ip route ss -lntup需要确认默认网关、网卡 IP、路由是否正确。服务器修复后业务访问依赖这些基础网络信息假若某个网卡没有生效服务即使监听正常也无法向外提供响应。4.4 第四步检查磁盘Swap 与日志占用这是服务器运维中最常见的一类问题服务没挂但磁盘写满、日志堆积、Swap 耗尽。热门关键词中的“服务器磁盘阵列”“磁盘阵列怎么做”也说明这类问题普遍存在。先看整体使用率df -h df -i free -h关注两个数值df -h中/使用率是否超过 80%。df -i中 inode 使用率是否接近 100%即使磁盘还有空间也可能因为大量小文件耗尽 inode。再检查目录占用du -sh /var/log/* 2/dev/null | sort -rh | head -20 du -sh /var/lib/docker 2/dev/null || true du -sh /tmp 2/dev/null || true如果是 systemd 管理的日志系统限制日志体积的方法如下journalctl --verify journalctl --disk-usage journalctl --vacuum-size200M这会把历史日志裁到 200M 左右。为了避免再积累可以直接限制 journal 最大占用。编辑/etc/systemd/journald.confSystemMaxUse200M RuntimeMaxUse100M MaxRetentionSec7day修改后重启日志服务systemctl restart systemd-journald注意重启 systemd-journald 会导致日志暂时写入中断但不会影响业务进程。除了日志还要看是否有旧内核包、无用软件包、Docker 悬空镜像占空间。以 Ubuntu 为例apt autoremove -y apt autoclean如果使用 Dockerdocker system df docker image prune -a -f --filter until168h docker container prune -f --filter until168h这里要小心docker image prune -a会删除所有没有被容器使用的镜像如果有回滚需求请先确认为镜像已经推送到镜像仓库或者当前运行的镜像版本不再需要否则不要随意执行prune -a。4.5 第五步收敛防火墙策略服务器修复完成后防火墙壁往往被忽略。查看当前防火墙状态firewall-cmd --state 2/dev/null ufw status verbose 2/dev/null iptables -L -n -v --line-numbers 2/dev/null nft list ruleset 2/dev/null如果是 firewalld常见的修改方式firewall-cmd --permanent --zonepublic --add-rich-rulerule familyipv4 source address10.20.30.0/24 port port22 protocoltcp accept firewall-cmd --reload如果是 ufwufw allow from 10.20.30.0/24 to any port 22 proto tcp ufw enable如果之前防火墙处于 disabled 状态开启前一定要先确认安全组是否放行了 22 端口。否则极有可能出现“防火墙一开自己都进不去”的被动情况。更稳妥的方式是先加入一条默认拒绝之外允许自己 IP 的规则再开启防火墙。在企业环境里更推荐把防火墙规则用 infra 即代码管理起来而不是靠手工一条一条加。这里不讨论工具具体选型只是强调一个原则所有允许规则必须是显式、最小化、可审计的。5. 完整示例一个最小的服务器修复脚本下面这个脚本整合了前面几步作为二次接管时的参考。脚本不会包含过度复杂的业务细节只做基础加固和状态采集。#!/usr/bin/env bash # 文件路径/usr/local/sbin/server-baseline.sh # 用途服务器接管后执行的最小基线检查和修复 set -euo pipefail BACKUP_DIR/root/ops_backup_$(date %Y%m%d) LOG_FILE/var/log/server-baseline.log exec (tee -a $LOG_FILE) 21 echo 开始执行服务器基线检查 mkdir -p $BACKUP_DIR # 收集系统基本信息 echo --- 系统信息 --- cat /etc/os-release uname -a uptime # 备份关键配置 echo --- 备份关键配置 --- cp /etc/ssh/sshd_config $BACKUP_DIR/ 2/dev/null || true cp /etc/chrony/chrony.conf $BACKUP_DIR/ 2/dev/null || true cp /etc/systemd/journald.conf $BACKUP_DIR/ 2/dev/null || true cp /etc/resolv.conf $BACKUP_DIR/ 2/dev/null || true # 时间同步检查 echo --- 时间同步检查 --- timedatectl set-ntp true || true systemctl enable --now chrony || systemctl enable --now systemd-timesyncd || true chronyc sources -v 2/dev/null || true # 磁盘与Inode检查 echo --- 磁盘检查 --- df -h df -i # Journal日志限制 echo --- 裁剪journal日志 --- journalctl --disk-usage 2/dev/null || true journalctl --vacuum-size200M 2/dev/null || true # SSH配置安全检查 echo --- SSH安全确认 --- if grep -q ^PasswordAuthentication no /etc/ssh/sshd_config 2/dev/null; then echo SSH密码登录已关闭 else echo 警告SSH密码登录未关闭 fi # 开放端口查看 echo --- 当前监听端口 --- ss -lntp echo 基线检查完成 脚本说明脚本用set -euo pipefail保证链条中任何一步失败都会显式报错。备份目录按日期递增防止覆盖上次备份。每段检查都输出到日志文件便于事后查看。脚本不会自动关闭 SSH 密码登录因为这需要管理员确认密钥已经放置完毕自动化误操作会导致自己无法登录。执行脚本chmod x /usr/local/sbin/server-baseline.sh sudo /usr/local/sbin/server-baseline.sh6. 运行结果与效果验证脚本执行后应该能看到类似下面的输出片段--- 时间同步检查 --- chronyc sources -v 210 Number of sources 2 .-- Source mode^ .-- Number of sources 2 ^* ntp1.aliyun.com ...这说明时间源已经连接成功。继续验证 SSH 配置。重新打开一个新终端使用密钥登录ssh -i ~/.ssh/id_ed25519 ops服务器IP如果能够直接登录且没有提示输入密码说明密钥登录生效。接下来验证防火墙。从另一台机器测试 22 端口nc -vz 服务器IP 22如果输出succeeded说明连通正常。再检查业务端口比如 80 或 443curl -I http://服务器IP/ curl -I https://服务器IP/如果业务服务监听正常但 curl 超时说明防火墙或安全组仍然没有放行。验证 journal 日志已经限制journalctl --disk-usage预期输出接近 200M 或更小。7. 常见问题与排查思路问题现象可能原因排查方式解决方案修改 sshd 配置后新终端无法登录公钥没有正确放置或配置语法错误SSH 服务没有重载在原终端执行sshd -t检查/var/log/auth.log或/var/log/secure恢复原配置文件重新放置公钥确认 authorized_keys 权限为 600chrony 显示^?时间无法同步防火墙阻断 UDP 123 端口时间源域名不可达执行chronyc sources -vss -ulpngrep 123修改/etc/resolv.conf重启后恢复原样系统使用 systemd-resolved 或 netplan 生成该文件查看/etc/resolv.conf是否软链接检查 systemd-resolved 状态通过 netplan 或 NetworkManager 配置 DNS而不是直接改配置磁盘没满但提示 no space left on deviceinode 耗尽或 /tmp 被挂载了 noexec 且写入大量小文件执行df -ifind / -xdev -type fwc -l 查看文件总数开启防火墙后 SSH 立刻断开防火墙未加入自己的管理 IP 白名单使用云控制台 VNC 登录检查 firewalld/ufw 规则添加管理 IP 放行规则后再重载防火墙时间同步后日志里出现大量时间跳变服务器之前时间偏差超过阈值业务系统依赖有序时间戳查看日志时间序列确认数据库主从无复制异常设置变更窗口逐步校准避免一次性大步跳变Docker 容器无法访问外网但宿主机可以Docker 网络、iptables 规则被已知防火墙规则覆盖执行iptables -t nat -L POSTROUTING -n -v查看 docker0 网桥调整防火墙规则顺序重启 docker 服务前确认勿掩盖 nat 规则每个问题的核心排查顺序都是先看日志再看配置再看网络状态最后做小范围变更验证。不要跳过第一步直接改配置否则可能把原本可用的状态改得更坏。8. 最佳实践与工程建议8.1 管理账号的收敛服务器接管之后第一件事是建立独立的运维账号而不是继续用 root 登录。即使服务器目前只有一个人用也要养成这个习惯。因为 root 是系统最高权限一旦密钥泄露或者误操作破坏放大倍数远大于普通账号。实际项目中更推荐使用 sudo 控制命令执行权限。比如 ops 用户可以执行所有权限但需要输入自己的密码而某个只读运维账号只能执行 systemctl status、journalctl、ss 等查询命令。最小权限原则会大幅降低事故半径。8.2 时间服务应该成为基础监控项很多团队把 CPU、内存、磁盘作为监控主力却忘了监控时间偏移。时间不同步是主从复制异常、证书校验失败的高频原因之一。建议在监控系统里加上ntp_offset或system_uptime指标当偏移超过 100ms 或者 500ms 时告警。另外坚决避免在同一台服务器上同时启用 chrony 和 systemd-timesyncd 两个服务这会导致时间源打架。一台机器只需要一个 NTP 客户端服务。8.3 DNS 配置必须关联服务依赖如果服务器上跑的业务依赖内部域名解析比如注册中心域名、对象存储域名、数据库连接串DNS 配置一旦出错会影响整个集群。因此建议将 DNS 配置纳入配置管理工具而不是让运维人员在每台机器上手动编辑。每次变更要验证getent hosts与dig的结果。8.4 日志与磁盘空间治理生产环境建议提前设置系统日志和中间件日志的轮转策略。常见的做法是使用 logrotate 管理/var/log下的日志。systemd journal 限制为 200M 或 500M。Docker 容器的 json-file 日志 driver 设置 max-size 和 max-file。每周执行一次du -sh检查关键目录增长趋势。你不需要等到磁盘告警再处理日志轮转本身就是投的运维成本。8.5 变更必须有回滚路径修复过程中的任何一步都要清楚知道“改坏了怎么回到原状”。所以备份目录和备份时间非常重要。安全稳妥的方法是把备份压缩后上传到对象存储或另一台服务器而不仅仅是保存在本机/root。如果这台机器本身磁盘损坏备份就失去了意义。8.6 自动化和文档化并重修复完成后建议把这次操作过程中发现的重点问题记录到团队 Wiki 中。格式不需要复杂至少要包含机器 IP、系统版本、部署角色。SSH 管理入口和密钥归属。时间源、DNS 配置、防火墙规则。已知问题与规避方案。不要以为“服务器修好了就够了”真实可贵的是下次有人再遇到类似问题时能以十分钟为单位定位而不是重新开始猜。9. 总结与后续方向把视角放宽一点“服务器被修好”从来都不是目的本质上我们追求的是让这台服务器重新成为可被理解的系统。在这次经历中真正有价值的动作是系统性的盘点SSH 是否受控、时间是否统一、DNS 是否可靠、磁盘和日志是否受限、防火墙是否收敛。这五个基础项完成后“修复”才从一次应急动作变成了一个可在其他机器上复用的基线。如果你是刚开始做运维建议你先不要挑战复杂的高可用架构而是找一台最普通的机器把本文的检查清单全部跑一遍看看每个命令输出到底长什么样遇到异常时学会看日志。运维能力的成长本质上是把更多“未知”变成“已知”。下一步你可以继续深入学习这几个方向配置管理工具用 Ansible 把本文中的基线检查固化成 playbook实现批量服务器接管。监控与告警接入 node_exporter 暴露基础指标配合 Prometheus 做趋势预警。日志采集把 journald 与业务日志统一送入日志平台。备份容灾设计操作系统备份、数据库备份、目录级备份三层策略。记住一个原则在生产环境里做任何变更都要先备份、再小范围验证、最后再推广。服务器修复成功只是开始真正值得信任的服务器是让团队“敢于变更、变更有记录、失败能回滚”。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。