服务器被入侵,轻则业务中断,重则数据永久丢失。每天数万次扫描,多数攻击源于基础配置疏忽——22端口暴露、弱密码、数据库公网开放。本文8个措施,堵住99%常见攻击入口。
别等被攻击了再后悔。今天我就把自己每次新购服务器必做的8个安全设置,掰开揉碎了教给你。每一步都有命令和效果说明,你照着做就能防住绝大多数攻击。
目标:先搞清楚自己家开了几扇门,然后把没人用的门彻底封死。
操作:
# 查看当前开放的所有端口netstat -tulpn | grep LISTEN【示意图:终端输出示例,列出所有监听端口,比如22(ssh)、80(nginx)、3306(mysql)等】
你会看到一堆端口。如果发现你根本不需要的服务(比如FTP的21端口、Telnet的23端口),立即关掉它:
# 以关闭FTP服务为例sudo systemctl stop vsftpdsudo systemctl disable vsftpd再执行 netstat -tulpn | grep LISTEN 检查,那个端口应该消失了。
【示意图:再次执行netstat,vsftpd对应的端口已不在列表中】
记住原则:开放的端口越少,攻击面越小。
目标:MySQL、Redis这类数据库,绝不能把端口直接暴露在公网上。
操作:
先看看你的数据库是不是在“裸奔”:
# 以MySQL为例sudo netstat -tulpn | grep 3306【危险信号图:显示 0.0.0.0:3306,表示监听所有网络接口】
如果看到 0.0.0.0:3306,说明你的数据库全世界都能访问,这是极度危险的。
把它改造成只监听本地(或内网):
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf找到 bind-address 这一行,修改为:
bind-address = 127.0.0.1 # 只允许本机访问# 如果必须被内网其他服务器访问,则改为内网IP,如 192.168.1.10保存后重启MySQL:
sudo systemctl restart mysql再次检查:
sudo netstat -tulpn | grep 3306【安全图:显示 127.0.0.1:3306 或 内网IP:3306】
现在公网已经扫不到你的数据库端口了。
目标:SSH的22端口是全球被扫描最多的目标。我们要改端口、禁root、禁用密码登录,让暴力破解工具彻底失效。
操作:
sudo vim /etc/ssh/sshd_config在文件中找到并修改或添加以下几行:
Port 2222 # 将22改为一个不常用的端口,比如2222PermitRootLogin no # 禁止root直接登录PasswordAuthentication no # 禁用密码登录,只允许密钥登录【示意图:vim中sshd_config文件,以上三行被高亮或圈出】
💡 关于禁用密码登录:这是防止暴力破解最关键的一步。如果你还不熟悉如何配置SSH密钥登录,强烈建议先看我的另一篇文章: 《Linux SSH免密登录终极指南:三步搞定,效率翻倍》 里详细讲了密钥生成、公钥部署、权限设置的全过程,看完再回来继续。
保存退出后,重启SSH服务:
sudo systemctl restart sshd⚠️ 特别注意:在退出当前SSH连接前,一定要新开一个终端窗口,用新的端口和你的私钥测试能否登录成功! 否则你可能把自己锁在服务器外面。
【示意图:新窗口使用 ssh -p 2222 user@your-server 成功登录的画面】
一旦确认新窗口能登录,再关闭原窗口。
目标:即使改了端口,也可能有漏网之鱼。让Fail2ban自动监控登录日志,谁连续输错密码就封他IP。
操作:
# 安装Fail2bansudo apt updatesudo apt install fail2ban -y创建一个本地配置文件:
sudo vim /etc/fail2ban/jail.local写入以下内容(注意端口号要与你修改的SSH端口一致):
[sshd]enabled = trueport = 2222 # 这里填你修改后的SSH端口!maxretry = 3 # 允许连续失败的次数bantime = 3600 # 封禁时间,单位秒(3600=1小时)【示意图:jail.local文件内容截图】
启动并查看状态:
sudo systemctl restart fail2bansudo fail2ban-client status sshd【示意图:fail2ban-client状态输出,可能显示已封禁的IP列表】
从此,任何IP尝试3次失败就会被自动封禁1小时,暴力破解者只能望洋兴叹。
目标:在系统层面做简单但有效的配置,抵御常见的SYN Flood等攻击。
操作:
开启SYN Cookie(这是抵御SYN Flood攻击的利器):
# 临时生效sudo sysctl -w net.ipv4.tcp_syncookies=1# 永久生效echo "net.ipv4.tcp_syncookies=1" | sudo tee -a /etc/sysctl.confsudo sysctl -p【示意图:执行sysctl命令和确认参数写入的画面】
这一行配置会让内核在面对大量半连接请求时,不会耗尽内存,而是直接丢弃攻击包。
目标:如果有人想用大量请求把你的网站累垮(CC攻击),Nginx可以自动限制他。
操作:
编辑你的Nginx站点配置文件(例如 /etc/nginx/sites-available/你的站点),在 server 块外面添加限流池定义:
# 定义一个名为“one”的限流池,每个IP每秒最多10个请求limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;然后在 location / 内部应用这个限流:
server { ... location / { limit_req zone=one burst=20; # 每秒10次,突发最多20个排队 ... }}【示意图:nginx配置文件中添加的这两段代码】
测试配置并重载Nginx:
sudo nginx -tsudo systemctl reload nginx现在,任何一个IP如果每秒请求超过10次,多余的请求就会被Nginx直接返回503,你的应用服务器就不会被拖垮。
目标:自动更新能堵住大部分已知漏洞;3-2-1备份策略能让你在被勒索或误操作后安然无恙。
操作:
自动安全更新:
sudo apt install unattended-upgradessudo dpkg-reconfigure --priority=low unattended-upgrades在配置界面选择“是”,以后系统就会自动安装重要的安全更新。
【示意图:unattended-upgrades配置界面】
定期备份(3-2-1原则:3份备份,2种介质,1份异地):
编辑crontab,每天自动备份重要数据到另一块硬盘或远程服务器:
crontab -e添加一行(示例:每天凌晨2点备份 /data 目录到 /backup 下以日期命名的文件夹):
0 2 * * * rsync -av --delete /data/ /backup/$(date +\%Y\%m\%d)/【示意图:crontab -e中显示已添加的备份任务】
如果有条件,再定期将备份同步到另一台机器或云存储。
目标:防止数据在传输过程中被监听或篡改。
操作:
全站启用HTTPS,并强制跳转:
# 在Nginx配置中server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; # 所有HTTP请求301跳转到HTTPS}server { listen 443 ssl; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; # 启用HSTS,告诉浏览器强制使用HTTPS访问 add_header Strict-Transport-Security "max-age=31536000" always;}【示意图:浏览器地址栏显示绿色锁标志,以及HSTS响应头】
现在,即使攻击者在你和服务器之间,也无法解密你的数据。
为了方便你操作,我把前七步(除数据库和Nginx配置外)的核心操作打包成了一个脚本。注意:执行前请仔细阅读注释,并根据你的实际情况修改(特别是SSH端口)!
保存为 secure.sh:
#!/bin/bash# Linux服务器一键安全加固脚本 (适用Ubuntu/Debian)# 警告:执行前请确保你已准备好SSH密钥,并知晓新端口!# 1. 关闭无用服务示例 (请根据实际调整)echo ">>> 正在关闭vsftpd服务(如果存在)..."sudo systemctl stop vsftpd 2>/dev/null && sudo systemctl disable vsftpd 2>/dev/null# 2. 开启SYN Cookieecho ">>> 开启SYN Cookie..."echo "net.ipv4.tcp_syncookies=1" | sudo tee -a /etc/sysctl.confsudo sysctl -p# 3. SSH强化NEW_SSH_PORT=2222 # <--- 请修改为你想要的端口!echo ">>> 配置SSH: 端口=$NEW_SSH_PORT, 禁用root登录, 禁用密码登录..."sudo sed -i "s/^#Port 22/Port $NEW_SSH_PORT/" /etc/ssh/sshd_configsudo sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_configsudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_configsudo systemctl restart sshdecho ">>> SSH配置完成!请在另一个窗口测试登录成功后,再退出当前会话!"# 4. 安装并配置Fail2banecho ">>> 安装Fail2ban..."sudo apt update && sudo apt install fail2ban -ycat << EOF | sudo tee /etc/fail2ban/jail.local[sshd]enabled = trueport = $NEW_SSH_PORTmaxretry = 3bantime = 3600EOFsudo systemctl restart fail2banecho ">>> Fail2ban配置完成。"# 5. 安装自动更新echo ">>> 配置自动安全更新..."sudo apt install unattended-upgrades -ysudo dpkg-reconfigure --priority=low unattended-upgrades -f noninteractiveecho "====================================================="echo "✅ 基础加固完成!请务必:"echo "1. ✅ 确认SSH密钥登录正常,且端口为 $NEW_SSH_PORT"echo "2. 🔥 手动配置防火墙,放行新SSH端口,并限制数据库端口"echo "3. 🌐 手动配置Nginx限流和HTTPS"echo "4. 💾 手动设置定时备份任务"echo "====================================================="【示意图:运行bash secure.sh的过程和结束提示】
执行:chmod +x secure.sh && sudo ./secure.sh
安全不是一劳永逸的事,而是一场持续的攻防战。但这8招,能帮你防住90%的常见攻击。
现在就登录你的服务器,跑一遍脚本,检查一遍配置。 别等到被黑了才追悔莫及。
如果你在操作中遇到问题,或者有自己独到的防御技巧,欢迎在评论区留言分享!