Ubuntu服务器想要长期稳定运行,核心不是装多少监控工具,而是把更新策略、防火墙规则、SSH访问控制和日志轮转这四件事做扎实。绝大多数故障都出在这四个环节的疏忽上,比如长期不更新导致内核漏洞被利用,或者SSH暴露公网后被暴力破解。下面直接讲具体做法和容易忽略的细节。
无人值守安全更新必须配置但要有选择性
很多运维习惯手动更新,但长期看一定会漏。Ubuntu自带的unattended-upgrades可以自动安装安全更新,关键是只启用安全源,避免功能性更新引入不兼容。先安装并启用:
sudo apt install unattended-upgrades sudo dpkg-reconfigure --priority=low unattended-upgrades
然后编辑配置文件,只允许安全更新和必要的稳定更新,禁止自动重启无关服务。打开/etc/apt/apt.conf.d/50unattended-upgrades,确认以下内容:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";
这里有一个容易踩坑的地方:如果服务器运行数据库或内存缓存服务,自动重启可能导致数据不一致。建议对MySQL、PostgreSQL、Redis这类服务设置黑名单,禁止自动重启:
Unattended-Upgrade::Package-Blacklist {
"mysql-server";
"mysql-server-8.0";
"postgresql";
"redis-server";
};
同时设置每周至少一次手动检查更新,尤其是内核更新后需要重启才能生效。可以用命令检查哪些服务需要重启:
sudo needrestart -r l
长期稳定的关键不是“不重启”,而是“有计划地重启”。内核安全更新如果不重启,等于没更新。
防火墙策略默认拒绝,只开放必要端口
Ubuntu默认的UFW足够用,但很多服务器只开了22、80、443就认为安全了。真正的问题是出站流量和内部服务端口。建议默认拒绝入站,出站也做限制,防止服务器被入侵后成为跳板机。
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable
如果服务器上有Redis、MongoDB这类服务,绝对不要直接绑定0.0.0.0。检查配置文件,确认绑定地址是127.0.0.1或者内网IP。很多入侵事件就是公网可访问的Redis未设密码导致的。对于必须对外提供的管理端口,比如数据库的远程管理,建议用SSH隧道转发,而不是直接开放端口。
另外UFW的日志默认不记录,建议开启并定期检查:
sudo ufw logging on
日志在/var/log/ufw.log,重点看被拒绝的入站请求来源,如果某个IP持续扫描端口,直接手动封禁。
SSH访问控制是防爆破的第一道防线
公网服务器每天都会遭受大量SSH暴力破解尝试。最有效的办法不是改端口,而是禁用密码登录、禁用root直接登录、限制登录用户和来源IP。修改/etc/ssh/sshd_config:
PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2
改完后重启SSH服务:
sudo systemctl restart sshd
如果必须保留密码登录,至少安装fail2ban。但fail2ban只能缓解,不能根治。长期稳定运维建议彻底切换到密钥登录。密钥管理上,每个管理员使用独立密钥,不要共用私钥。私钥文件权限必须是600,公钥放在~/.ssh/authorized_keys,权限700/600。
还有一个常被忽略的点:SSH的HostKey算法和加密套件。Ubuntu较新版本默认已经禁用不安全的算法,但如果从旧版本升级上来,需要检查/etc/ssh/sshd_config中是否还有旧算法残留。可以用命令检测:
ssh -Q kex ssh -Q cipher
确保没有diffie-hellman-group1-sha1、3des-cbc这类弱算法。
日志轮转与磁盘空间监控防止服务静默崩溃
服务器长期运行后,日志文件会不断增长,如果不做轮转,磁盘写满后服务会直接崩溃。Ubuntu默认用logrotate管理日志,但很多自定义服务的日志不在默认配置里。检查/etc/logrotate.d/目录,为每个关键服务添加轮转规则。例如Nginx日志:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
重点参数是rotate 14,保留14天,compress压缩旧日志。对于数据库日志,比如MySQL的错误日志,也要单独配置,否则可能增长到几个GB。
磁盘空间监控不能只靠人工。建议用脚本定期检查,超过阈值发送告警。一个简单的检查脚本:
#!/bin/bash
THRESHOLD=85
df -h | awk 'NR>1 {gsub("%","",$5); if ($5+0 > '"$THRESHOLD"') print $1, $5"%", $6}'
把这个脚本加入crontab,每小时执行一次,输出非空就说明有分区超过85%。配合邮件或消息推送,可以在磁盘写满前处理。
内核参数调优提升长期稳定性
默认的内核参数对大多数场景够用,但高并发或内存较大的服务器需要调整。重点是文件描述符限制、TCP连接复用和内存回收策略。编辑/etc/sysctl.conf或/etc/sysctl.d/99-custom.conf:
fs.file-max = 65535 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 vm.swappiness = 10 vm.overcommit_memory = 1
应用后执行sudo sysctl -p。其中vm.swappiness=10对数据库服务器很重要,降低系统使用交换分区的倾向,避免内存数据频繁换入换出导致性能抖动。但不要设为0,否则在内存紧张时内核会直接杀进程。
文件描述符限制还要在/etc/security/limits.conf中设置:
* soft nofile 65535 * hard nofile 65535
很多服务如Nginx、MySQL在高负载下会因为文件描述符不够而报错,这个配置能有效避免。
定期备份与恢复演练是最后的防线
再稳定的系统也可能因为硬件故障、误操作或入侵导致数据丢失。备份策略要遵循3-2-1原则:至少3份副本,2种不同介质,1份异地。对于Ubuntu服务器,推荐用rsync做增量备份,配合tar做全量备份。关键目录包括/etc、/var/www、/var/lib/mysql、/home等。
一个简单的每日备份脚本:
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
tar czf $BACKUP_DIR/etc.tar.gz /etc
tar czf $BACKUP_DIR/www.tar.gz /var/www
mysqldump --all-databases | gzip > $BACKUP_DIR/mysql.sql.gz
find /backup -type d -mtime +7 -exec rm -rf {} \;
备份完成后必须定期做恢复演练,否则备份可能只是心理安慰。至少每季度测试一次从备份恢复关键服务,确认备份文件完整可用。
安全审计与入侵检测不能只靠日志
长期运行的服务器需要定期做安全审计。Ubuntu自带auditd可以记录关键文件的访问和修改。安装并配置:
sudo apt install auditd sudo auditctl -w /etc/passwd -p wa -k passwd_changes sudo auditctl -w /etc/ssh/sshd_config -p wa -k sshd_changes sudo auditctl -w /var/www -p wa -k web_changes
这样任何对密码文件、SSH配置和网站目录的修改都会被记录。定期用ausearch查看异常:
sudo ausearch -k passwd_changes --start today
另外建议安装rkhunter或chkrootkit做rootkit扫描,虽然不能100%检测,但能发现常见的入侵痕迹。每周执行一次扫描,结果通过邮件发送。
还有一个容易被忽略的点:检查系统用户的登录shell。很多服务安装时会创建系统用户,但有些用户被错误地赋予了登录shell。用命令检查:
grep -v nologin /etc/passwd
除了root和实际需要登录的管理员,其他用户都应该是nologin或false。如果发现异常用户,立即检查其来源和用途。
服务管理与启动项最小化
长期稳定的服务器应该只运行必要的服务。每个运行的服务都是潜在的攻击面。用systemctl列出所有已启用的服务:
systemctl list-unit-files --state=enabled
逐个检查,不需要的服务直接禁用。特别是蓝牙、打印、Avahi这类桌面相关服务,在服务器上完全不需要:
sudo systemctl disable --now bluetooth sudo systemctl disable --now cups sudo systemctl disable --now avahi-daemon
同时检查开机启动项和定时任务:
ls -la /etc/cron.d/ ls -la /etc/cron.daily/ crontab -l
入侵者经常通过cron持久化,定期检查这些位置能发现异常任务。
Ubuntu服务器长期稳定安全运维的核心就是把上述每个环节都落实到日常操作中,而不是出了问题再补救。更新、防火墙、SSH、日志、备份、审计,这六件事形成闭环,服务器就能在无人值守的情况下稳定运行很长时间。关键是要有纪律性地执行,并且定期复查配置是否被意外修改。
