
1. 写在前面为什么把这三件事打包讲在Linux服务器运维这件事上我常年跟团队里的新人强调一个观点先把基础打牢再谈花活。所谓基础绕不开三件事——SSH密钥登录、时间同步、网络管理。它们看起来各自独立实际上是一条链路。登录都搞不定后面全是空中楼阁时间不对日志排查和集群协作全乱套网络不通其他一切免谈。这篇博文就围绕这三个主题把从原理到实操的完整链路拆开揉碎讲清楚配齐可以直接上手复现的步骤和参数。这篇文章适合的人刚接手Linux服务器的运维工程师、自己折腾VPS或NAS的个人开发者、准备部署集群或K8s环境的技术同学。就算你现在还没有生产环境照着文中的命令在虚拟机或云服务器上过一遍也能把底层逻辑彻底搞懂。先说一个大原则这三件事不是配置完就忘的一次性任务而是一套需要持续维护的基础设施。后面每一章我会把为什么要这么做和怎么做一起讲因为只抄命令不理解原理出了问题你还是两眼一抹黑。2. SSH密钥登录把密码登录这条路彻底堵死2.1 为什么非要用密钥登录密码登录最要命的问题不是弱口令而是你根本不知道它什么时候会被人撞库。公网上的服务器如果开放22端口且允许密码登录我实测过最长不超过48小时就会收到来自各类扫描脚本的暴力破解日志。这不是危言耸听而是每一台公网机器都会经历的事情。密钥登录的本质是非对称加密。服务器上存放公钥客户端本地存放私钥。登录时客户端用私钥签名服务器用公钥验证匹配则放行。由于私钥不出本地公钥无法反推私钥安全性比密码高一个量级。对比维度密码登录密钥登录认证凭据可记忆但可猜测不可猜测的大整数暴力破解风险极高几乎为零是否易受键盘记录攻击是否支持自动化场景弱强我说的自动化场景很关键。你写脚本做服务器巡检、用Ansible批量下发配置、或者用rsync同步数据这些场景都需要非交互式认证。如果靠密码你得用sshpass这类工具把密码硬编码在命令里密码一泄露全盘皆输。用密钥则完全没有这个顾虑。2.2 从零配置一套安全的密钥登录第一步在客户端生成密钥对。用ed25519算法安全性比传统的RSA更高而且密钥长度更短、认证速度更快。ssh-keygen -t ed25519 -C your_email_or_comment -f ~/.ssh/id_ed25519这里有个小细节-C参数是添加注释方便你日后区分多把密钥是给哪台机器用的。-f指定生成路径如果不指定会默认生成~/.ssh/id_ed25519。生成过程中会提示你设置passphrase口令我的建议是公网环境一定要设哪怕是一个简短的短语也能在私钥文件被盗时多一层保护。第二步把公钥传到服务器上。ssh-copy-id -i ~/.ssh/id_ed25519.pub userserver_ipssh-copy-id会自动把公钥追加到服务器上对应用户的~/.ssh/authorized_keys文件里。如果没有这个命令macOS自带了就手动操作cat ~/.ssh/id_ed25519.pub | ssh userserver_ip mkdir -p ~/.ssh chmod 700 ~/.ssh cat ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys注意权限~/.ssh目录必须是700authorized_keys文件必须是600。权限过宽会导致SSH服务端直接拒绝加载你的公钥。第三步验证密钥登录成功后再彻底禁用密码登录。这一步的操作顺序有讲究先验证再禁用防止把退路断了。修改服务器上的/etc/ssh/sshd_configPubkeyAuthentication yes PasswordAuthentication no PermitRootLogin prohibit-password第四步重启SSH服务。不同发行版命令稍有区别但核心逻辑相同。# Debian/Ubuntu sudo systemctl restart sshd # RHEL/CentOS sudo systemctl restart sshd重启之后建议开一个新终端窗口测试登录确认密钥能正常登录再关闭旧会话。这句是真心话我见过太多人改完配置直接断掉了当前连接结果只能去机房或云控制台重置系统。2.3 多台服务器的密钥管理经验生产环境里你肯定不会只有一台服务器。假设有10台每台都生成单独的密钥对会让你抓狂。我的做法是本地一台机器生成一对主密钥将公钥批量分发到所有服务器。for ip in 192.168.1.10 192.168.1.11 192.168.1.12; do ssh-copy-id -i ~/.ssh/id_ed25519.pub user$ip done如果想更精细地管理多台机器可以发挥~/.ssh/config文件的作用Host prod-web-1 HostName 192.168.1.10 User deploy IdentityFile ~/.ssh/id_ed25519_prod Port 22 Host prod-db-1 HostName 192.168.1.20 User deploy IdentityFile ~/.ssh/id_ed25519_prod Port 22配置好之后直接ssh prod-web-1就能登录不用记IP地址和用户名。针对不同环境使用不同密钥还可以做访问隔离。排查密钥登录问题时按这个顺序走客户端是否加载了正确的私钥ssh -v看debug输出、公钥是否正确写入服务器authorized_keys、服务器sshd_config有没有允许PubkeyAuthentication、SELinux或AppArmor有没有拦截。八成问题出在这几个环节。3. 服务器时间同步所有日志和证书都在看着你3.1 时间不一致的后果比你想象的严重刚入行时我觉得时间同步无所谓差几秒有什么大不了直到有一次排查生产环境问题发现应用日志显示的错误时间差了几分钟导致多个服务的事件顺序颠倒定位故障花了整整一个下午。时间不同步引发的典型问题包括分布式系统各节点日志时间戳不一致排障时无法还原事件顺序基于时间戳的协议如Kerberos认证报错票据认证直接失败HTTPS证书校验失败因为客户端认为证书尚未生效或已经过期数据库主从复制时基于时间的事务冲突率升高定时任务cron在集群各节点上的执行时间出现偏差这几条里证书校验失败是最高频遇到的生产事故。证书的有效期判断完全依赖系统时间系统时间一旦跑到证书有效期之外浏览器直接报连接不安全服务端日志则是一片TLS握手失败。3.2 chrony和NTP的工作原理NTPNetwork Time Protocol的基本工作方式是层级同步。顶层的Stratum 0设备是原子钟或GPS时钟Stratum 1直接连接Stratum 0Stratum 2连接Stratum 1以此类推。层级越低精度越高但并非层级越高就越差实际同步效果取决于网络延时和抖动。chrony是新一代的NTP实现比传统ntpd更适应网络环境变化尤其是间歇性网络连接和网络拥塞严重的场景。它的两个核心组件是chronyd守护进程和chronyc控制工具。时间同步的底层逻辑并不复杂客户端向时间服务器发送时间请求包记录发送时间T1服务器收到后记录接收时间T2并立即回复记录回复时间T3客户端收到回复后记录接收时间T4。通过T1、T2、T3、T4四个时间戳可以同时算出网络往返延迟和本地时钟偏差。chrony对每次同步结果做统计筛选抛弃异常值保留最可靠的时间源并用缓慢调整slewing而非直接跳变的方式校准时间避免系统时钟出现大幅回跳。3.3 用chrony配置时间同步的完整步骤在Debian/Ubuntu上安装chrony的命令是sudo apt update sudo apt install -y chronyRHEL/CentOS则用sudo yum install -y chrony安装后看一下配置文件/etc/chrony/chrony.conf。默认配置通常已经指向了官方时间服务器池但我们要根据自己的网络环境做调整。# 使用阿里云时间服务器国内网络延迟更低 pool ntp.aliyun.com iburst # 或者使用腾讯云的 # pool time.cloud.tencent.com iburst # 允许本机无法访问外网时的备份手段 # 如果有内网NTP服务器优先用内网的 # server 192.168.1.1 iburst # 记录漂移速率的文件 driftfile /var/lib/chrony/driftiburst参数非常关键。它表示在初始同步时快速发送4个请求包让系统在几秒内完成初始校准而不需要等几十秒的常规轮询周期。配置完成后的操作sudo systemctl restart chronyd sudo systemctl enable chronyd验证同步状态是重头戏。先看时钟是否已同步chronyc tracking输出中的Leap status应该是NormalStratum越小说明离权威时钟越近System time表示本地时间与NTP服务器的时间偏差数值越小越好。再看当前连接的时间源chronyc sources -v每行前面的字符含义^*表示当前选中的同步源^表示可作为备用的同步源^-表示被判定为不可用。如果没有任何一行以*开头说明同步没成功需要排查网络连通性或时间服务器配置。3.4 一台既当客户端又当服务器的NTP节点配置如果你在内网部署多台服务器最佳实践是让其中一两台作为NTP服务器从外网时间源同步内网其余机器从这个内网NTP服务器同步。这样既能节省外网带宽也便于统一管理。配置区分点在于chrony.conf里的allow和local指令。服务器端从外网同步对内提供时间服务pool ntp.aliyun.com iburst allow 192.168.1.0/24 local stratum 10allow限制允许哪些网段的客户端来同步时间。local stratum 10的作用是当外网时间源不可达时本机仍然作为时间源为内网提供同步stratum 10表示精度层级较深避免内网客户端在互联网上有可用时间源的情况下还在用它。客户端配置修改一行就行server 192.168.1.5 iburst把默认的pool段落注释掉只保留内网服务器地址。这样全部内网机器都从这一台同步巡检时只需检查一台机器的外网时间源连通性即可。建议从云服务商的时间服务器或国内高校提供的服务中选择同步源公网NTP池质量参差不齐有些因为滥用已经封了外网地址。选错时间源最典型的症状是chronyc sources显示^?或者服务完全不通配合journalctl -u chronyd看日志很快能定位。4. Linux网络管理通了通了一切都好说4.1 先理清网络管理的基本层次Linux网络管理看似分散实际上可以归纳为三个层次物理链路层、IP网络层、服务应用层。排查网络问题时严格沿着这三个层次走能省掉大量时间。物理链路层看的是网卡是否up、网线是否接通、链路速率是否正常。IP网络层看的是IP地址配置、路由表、网关是否正确。服务应用层看的是端口是否监听、防火墙是否放行、DNS解析是否正常。实际排查时我从ip命令三板斧开始。第一板斧看网卡和IPip addr show第二板斧看路由ip route show第三板斧看链路连通性ping -c 4 网关IP这三个命令能解决80%的服务器突然连不上了问题。所谓排障更多的时候不是技术难题而是先确认设备状态是否符合预期。4.2 网卡配置实操从命令行临时配置到持久化配置临时配置IP地址立即生效且重启失效适合做测试和应急sudo ip addr add 192.168.1.60/24 dev eth0 sudo ip link set eth0 up但生产环境必须做持久化配置否则一重启配置就没了。不同发行版的持久化方式差异较大这其实是很多新手最容易踩坑的地方。在RHEL/CentOS 7上推荐使用NetworkManager的nmcli工具# 列出当前所有连接 nmcli connection show # 修改连接配置假设连接名为ens160 sudo nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.1.60/24 ipv4.gateway 192.168.1.1 ipv4.dns 223.5.5.5 # 使配置生效 sudo nmcli connection up ens160在Debian/Ubuntu 18.04上使用netplan# /etc/netplan/01-netcfg.yaml network: version: 2 ethernets: eth0: addresses: - 192.168.1.60/24 gateway4: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 119.29.29.29应用配置sudo netplan apply这里要提醒一个坑云服务器默认的DHCP获取IP如果你手动改成静态IP必须在云控制台确认绑定的是同一个IP否则直接把网络改断了。有些云服务商的镜像里默认禁用了SSH密码登录一旦网络改断只能通过控制台的VNC登录修复。4.3 端口、防火墙与网络连通性排查全流程网络不通时按下面这个流程走效率最高。第一步确认本机IP配置是否正确ip addr | grep inet第二步ping网关确认物理链路通不通ping -c 4 192.168.1.1如果网关不通先检查网卡状态和链路。第三步ping外部地址确认通过NAT是否正常ping -c 4 223.5.5.5第四步检查DNS解析是否正常dig 223.5.5.5 www.example.com # 或者 nslookup www.example.com第五步检查目标端口是否通telnet 192.168.1.10 3306 # 或者用 nc nc -vz 192.168.1.10 3306第六步检查本机服务是否监听、防火墙是否放行ss -lntp | grep 3306 sudo firewall-cmd --list-all # firewalld系统回到端口监听这条需要理解ss命令输出里几个字段的含义。State为LISTEN表示正在监听Local Address:Port里的0.0.0.0表示所有网卡都监听该端口127.0.0.1表示只有本机回环地址监听——如果服务只监听了回环地址外部机器自然连不上这是个高频踩坑点。4.4 网络管理的自动化进阶思路手动配置单台服务器没问题但到了几十台的时候手动操作就完全不可行了。我的经验是分两步走。第一步用ansible统一下发网络配置。把网卡配置、DNS、路由、防火墙规则写成playbook批量执行。好处是配置一致性和可审计性极大提升再也不用担心哪台机器多打了一个参数。第二步用监控系统持续跟踪网络状态。部署Prometheus加node_exporter采集各网卡的流量、丢包率、错误包。设置告警规则比如丢包率超过1%就通知值班人员。这些属于基础设施能力的提升对长期运营的价值远大于坏了再修的被动模式。5. 三件事的联动一台新服务器从0到1的标准初始化讲了这么多我把三件事整合成一套标准的初始化流程你可以直接照着操作。假设你刚买了一台云服务器或者拿到一台新分配的虚拟机IP为192.168.1.100操作系统是Ubuntu 22.04。第一步更新系统并安装基础工具包sudo apt update sudo apt upgrade -y sudo apt install -y vim net-tools chrony curl wget第二步配置时间和时区sudo timedatectl set-timezone Asia/Shanghai sudo systemctl restart chronyd chronyc tracking若Leap status不是Normal则执行sudo timedatectl set-ntp true强制开启NTP同步此时chronyd会自动配置默认时间源。第三步配置SSH密钥登录。先在本地客户端生成密钥如果已有可以跳过然后执行ssh-copy-id再修改sshd_config禁用密码登录。第四步配置静态IP和DNS如果需要。用前面讲到的netplan或nmcli完成。第五步配置防火墙只放行需要的端口sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable第六步验证整个链路新开终端用密钥登录、检查系统时间偏差、ping网关和外部地址、确认防火墙规则生效。这个流程跑下来一台具备基本生产可用性的服务器就就绪了。后续再按需安装业务环境。6. 常见问题排查实录这些坑我替你踩过了问题可能原因排查与解决密钥登录时提示Permission deniedauthorized_keys权限过宽或公钥内容不对检查~/.ssh目录和authorized_keys权限用ssh -v查看详细认证过程chronyc sources没显示同步成功防火墙屏蔽UDP 123端口或NTP服务器地址不可达sudo ss -unlp改了IP后服务器失联网卡配置没有生效或网关配置错误通过VNC/控制台登录检查ip addr和route -n确认默认路由存在ping通但SSH连不上防火墙规则拦截了22端口sudo iptables -L -n查看规则ufw status确认防火墙放行DNS能解析但curl超时路由表异常或目标端口被远端防火墙屏蔽ip route检查默认路由traceroute定位断点长时间运行后时间偏差又变大chrony不工作或硬件时钟漂移过快systemctl status chronydtimedatectl对比硬件时钟与系统时钟针对时间同步还有两个容易混淆的点。timedatectl里有一个NTP synchronized: yes/no字段它表示系统是否配置了NTP服务。云服务器默认使用38.3.1.1这种内网时间源地址本质是从外网NTP服务器同步测试时如果用chronyc sources看到所有源都是^?先检查UDP 123端口是不是被安全组规则挡了。再强调一次时间同步和密钥登录如果同时出问题优先解决时间问题再处理登录问题。因为TLS/SSH协议都依赖时间戳时间不正确会导致某些认证操作完全无法执行排查时先确认系统时间就排除了一个干扰因素。还有一个很多人忽略的细节修改/etc/hosts文件时务必保留本机主机名的映射。某些程序如sudo依赖hostname解析如果你把hosts文件里本机名称对应的行删掉sudo操作可能变得异常缓慢因为系统在等待DNS超时。网络管理中最容易被忽视的是MTU最大传输单元值。云环境下默认MTU通常是1500但某些VPC内部或叠加加密隧道后MTU需要调整为1400。如果大包能通、小包也通但某些特定大报文就是不通用ping -M do -s 1472测试一下。这个参数的意义是发送一个不允许分片的大ICMP包如果响应Frag needed说明链路中某台设备限制了MTU比1500更小此时就需要降低网卡MTU值。说到最后我给几个实操建议第一所有生产环境服务器一律关闭密码登录这不是可选项而是必选项。第二内网必须至少保留一台NTP服务器并纳入监控。第三网络排查工具提前装齐mtr、tcpdump、nmap真到用的时候发现没装也是一种生产事故。第四每三到六个月做一次配置审计看看哪些服务器还开着不该开的端口。我个人在实际操作中的体会是这三件事的基础框架搭好后面大部分运维工作都会顺畅很多。很多看似玄学的问题追根溯源都是其中一项没做好。建议你把自己手头的服务器按照这个流程重新过一遍把能提前踩的坑提前踩完以后的日子会好过得多。最后再分享一个小技巧把初始化步骤写成脚本放到配置管理工具里每次新机器上线直接执行手动操作越少人为出错的空间就越小。