很多站长把 VPS 买回来、网站跑起来之后,就再也没管过服务器安全这件事。直到某天凌晨邮箱里收到一长串登录失败的提醒、SSH 被暴力破解、网站被挂马,才猛然发现自己的服务器早就被扫了个底朝天。其实服务器被入侵,九成以上都是从 SSH 和端口敞开这两个口子进去的:SSH 默认 22 端口全天暴露在公网,密码强度不够就等着被爆破;防火墙没配,MySQL、Redis 这些服务就裸露在公网上。这篇文章不聊虚的,就按真实操作顺序,把 SSH 加固、Fail2ban 自动封禁、防火墙白名单一次讲清,让你在半小时内把服务器从"裸奔"状态拉到能见人的水平。
一、先盘点一下你的服务器暴露面
动手之前,先看看自己的服务器到底开着哪些端口,心里有个数。用 ss 命令查看所有监听端口:
ss -tlnp
看到的结果里,22(SSH)、80(HTTP)、443(HTTPS)是常规的,但如果出现 3306(MySQL)、6379(Redis)、27017(MongoDB)这类数据库端口对外监听,就说明你已经把家底亮给全网了,必须处理。原则很简单:只留业务需要的端口,其余全部关掉。
二、SSH 安全配置:从密钥登录到改端口
SSH 是服务器的门,门锁一定得用最好的。第一步,禁用密码登录,改用密钥登录。在本机生成密钥对:
ssh-keygen -t ed25519
然后把公钥传到服务器:
ssh-copy-id root@你的服务器IP
密钥传上去之后,编辑 SSH 配置:
vim /etc/ssh/sshd_config
把这几项改成下面的值:
Port 22022 PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes
Port 改成非默认端口,能直接过滤掉绝大多数扫描脚本;PermitRootLogin no 禁止 root 直接登录,平时用普通用户加 sudo;PasswordAuthentication no 彻底关掉密码登录,爆破就没了土壤。改完重启服务:
systemctl restart sshd
注意:确认密钥能正常登录、防火墙放行了新端口之后,再重启 sshd,否则容易把自己锁在门外。
三、Fail2ban:让暴力破解自动吃封禁
光改密码策略还不够,总有人不死心。Fail2ban 的思路很简单:扫描日志,发现同一 IP 连续失败 N 次,就自动把它拉黑一段时间。安装:
apt install -y fail2ban
Debian/Ubuntu 下默认配置就能用,如果想自定义,编辑 /etc/fail2ban/jail.local:
[sshd] enabled = true maxretry = 5 bantime = 86400
maxretry 是连续失败几次触发封禁,bantime 是封禁时长(秒),86400 就是一天。改完重启:
systemctl restart fail2ban
常用查看命令:
fail2ban-client status sshd
会列出当前被封禁的 IP 列表。从此爆破的人失败够次数,就自动进小黑屋一天,服务器清净很多。
四、防火墙:只开需要的端口
防火墙和 Fail2ban 各司其职:Fail2ban 管"已经出事的 IP",防火墙管"根本不该进来的流量"。Debian/Ubuntu 用 UFW,一条命令先看状态:
ufw status
配置前先把 SSH 新端口放行,防止把自己锁外面:
ufw allow 22022/tcp ufw allow 80/tcp ufw allow 443/tcp
然后开启防火墙:
ufw enable
只放行了 SSH、HTTP、HTTPS 三个端口,其余全部拒绝。CentOS 系列则用 firewalld:
firewall-cmd --permanent --add-port=22022/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload
五、顺手做掉的其他安全项
前面四步是最核心的,下面几件事成本极低,强烈建议一起做了:
1. 及时更新系统补丁:apt update 与 apt upgrade -y,安全漏洞基本都是靠补丁修的。
2. 宝塔等面板改默认端口:面板默认端口和入口被扫描工具盯得很紧,改掉默认端口、设置复杂入口路径。
3. 关掉不用的服务:长期不用的 FTP、Telnet 直接卸载或禁用,多一个服务就多一个被攻击面。
4. 数据库不对外:MySQL、Redis 这类服务监听在 127.0.0.1,只让本机应用访问。
六、常见坑与排查
1. 改完 sshd_config 连不上:大概率是密码登录被关了但密钥没配好。建议先保持 PasswordAuthentication yes,等密钥登录验证通过再关,最后一步才重启 sshd。
2. ufw enable 之后网站打不开:先检查 80/443 有没有放行,UFW 默认策略是拒绝所有入站流量。
3. Fail2ban 把自己误封了:jail.local 里加 ignoreip,把自己常用的办公 IP 加进白名单。
4. 面板端口改了还是被扫:配合云服务商的安全组一起限制,安全组和系统防火墙双保险。
七、总结
服务器安全没有一劳永逸,但把 SSH 密钥登录、Fail2ban 自动封禁、防火墙白名单这三板斧落实到位,九成以上的攻击都能被挡在门外。整个过程半小时以内就能完成,却能把服务器被入侵的概率降到最低。建议所有站长都花这半小时,把服务器从"裸奔"状态拉到能见人的水平——毕竟网站可以重新搭,数据丢了就真的什么都没了。