个人站点被DDoS打挂、被CC刷爆、被扫描器盯着漏洞打,这些事离你并不远。很多站长以为小站没人惦记,实际上大量自动化攻击根本不挑目标,扫到谁算谁,挂上代理池就无差别打。预算有限的情况下,不需要上高防机房,也不需要买企业级WAF,先把架构、配置、策略三件事做对,就能挡掉绝大多数低成本攻击。
先分清DDoS和CC,防护思路完全不同DDoS的核心是流量型攻击,用大量垃圾包占满你的带宽和服务器资源。个人站点带宽通常很小,几Gbps的UDP反射就能把你打出黑洞。CC更偏向应用层,攻击者用大量请求拖慢PHP、数据库,让正常用户打不开页面。DDoS靠本地硬抗基本没戏,必须借助外部清洗;CC则可以在服务器层面做大量优化和拦截。很多人把两者混为一谈,结果配置了一堆防火墙规则,流量型攻击照样把端口堵死。
低成本DDoS防护:套CDN隐藏真实IP个人站点防DDoS第一件事是隐藏源站真实IP。只要攻击者拿不到你的源站IP,流量型攻击就只能打在CDN节点上,而主流CDN服务商都有基础DDoS清洗能力。操作上先把域名解析全部接入CDN,源站只允许CDN回源IP访问,其他IP一律拒绝。防火墙里只放行80和443端口,SSH改成非标准端口并限制来源IP。以前解析过的IP记录要换掉,别在域名历史里留下真实IP。邮件服务、子域名、FTP等都可能暴露源站,全部关掉或者走CDN。
源站防火墙策略:只留必要端口很多个人服务器默认开着22、3306、6379这些端口,扫描器一碰就知道有没有漏洞。装好系统后第一件事就是用防火墙工具把入站规则清空,只允许22(限来源IP)、80、443。数据库和缓存服务全部监听127.0.0.1,不对外网开放。如果你用宝塔或者LNMP一键包,默认配置经常开放了不必要的端口,检查一下iptables或firewalld的规则,把多余的全部删掉。
CC攻击的识别与低成本拦截CC攻击的特点是请求频率高、UA特征明显、来源IP分散。个人站点没有专业设备,可以用Nginx的limit_req模块做频率限制。比如对动态页面限制单IP每秒最多5次请求,超过就返回444或者跳转到验证码页面。配置示例:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server {
location ~ \.php$ {
limit_req zone=one burst=10 nodelay;
fastcgi_pass 127.0.0.1:9000;
}
}
}
这个配置对单IP请求PHP页面做限速,突发允许10个请求,超过直接拒绝。CC攻击一般会打动态页面,静态资源走CDN缓存,源站压力就小很多。如果攻击量更大,可以配合fail2ban自动封禁频繁请求的IP。
用fail2ban自动封禁恶意IPfail2ban可以监控Nginx日志,发现某个IP在短时间内大量请求或反复触发错误,就自动加入防火墙黑名单。安装后创建一个针对Nginx的规则,比如60秒内请求超过120次就封禁10分钟。这样CC攻击的代理IP会被逐步封掉,攻击成本变高。配置并不复杂,关键是阈值要调得合理,别把正常搜索引擎蜘蛛误伤。百度蜘蛛的抓取频率一般不会超过每秒几次,如果某个IP每秒几十次请求,基本可以判定为攻击。
网站漏洞:先堵住最常见的几个口子个人站点被入侵,绝大多数不是0day,而是弱口令、老版本组件、文件上传、SQL注入这些老问题。先把后台地址改掉,不要用/admin、/wp-admin这种默认路径。后台密码至少16位,包含大小写字母、数字和符号,不要与其他网站重复。数据库密码同理,别用root加弱密码。定期更新CMS和插件,尤其是WordPress,很多漏洞公开后几天内就会被批量利用。
文件上传漏洞的硬核处理如果你的站点有上传功能,必须做严格校验。文件扩展名白名单只允许jpg、png、gif、pdf这类,MIME类型要匹配,文件内容头也要检查。上传目录禁止执行PHP,在Nginx里对上传目录单独配置:
location /uploads/ {
location ~ \.php$ {
deny all;
}
}
这样即使攻击者传了PHP木马,访问时也会被拒绝执行。上传后的文件名要随机重命名,不要保留原始文件名,防止构造路径穿越。
SQL注入的简单防御SQL注入在个人站点里依然很常见,尤其是老旧的CMS和手写代码。低成本方案是尽量用参数化查询,所有用户输入都要过滤。如果用的是WordPress这类成熟系统,保持更新就能挡住大部分注入。对于自写代码,至少要把单引号、双引号、反斜杠等特殊字符转义。Nginx层面可以加一条规则拦截明显的注入特征:
location ~* (\?|&)(union|select|concat|information_schema|sleep|benchmark) {
return 403;
}
这条规则会拦截URL参数里包含常见注入关键词的请求,虽然不能防住所有注入,但能挡住大量自动化扫描器。
XSS和CSRF的防护要点XSS主要靠输出转义,所有用户提交的内容在页面输出时必须做HTML实体编码。如果你用模板引擎,开启自动转义功能。评论、留言、昵称这些地方最容易出问题。CSRF则要给所有表单加随机token,验证请求来源。个人站点如果只有一个后台管理员,CSRF风险相对低,但XSS被利用后可能直接盗取管理员Cookie,进而控制整站。
日志监控与快速发现异常很多站长被打了半天才发现,因为根本不看日志。建议每天花几分钟检查Nginx访问日志和错误日志,重点看请求量突增、大量相同UA、大量404请求、异常POST请求。可以用一条命令快速统计当前访问量最高的IP:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
如果发现某个IP请求量远超其他,直接手动封禁。长期来看,可以配置一个简单的定时脚本,当某个IP请求量超过阈值时自动发邮件提醒。日志文件本身也要定期切割,防止占满磁盘。
备份和应急响应是最后一道防线防护做得再好,也可能被新的攻击方式打穿。个人站点必须定期备份,数据库每天备份一次,文件每周备份一次,备份文件存到本地之外的地方。恢复流程要提前演练,确保出事后能在半小时内恢复。如果被篡改,先别急着恢复,保留现场日志和样本,分析攻击入口,否则恢复完还会被打第二次。应急响应顺序是:断网隔离、保留证据、分析日志、修复漏洞、恢复数据、上线观察。
低成本防护的核心思路是提高攻击成本个人站点不可能做到绝对安全,但可以通过隐藏源站、限制端口、频率控制、自动封禁、漏洞修补这些手段,让攻击者觉得打你性价比太低。绝大多数自动化攻击遇到一点阻力就会转向下一个目标。真正针对你的定向攻击,只要你能扛住第一波,攻击者消耗的资源远大于你的损失,自然就会放弃。把基础配置做扎实,比买一堆昂贵的安全设备更实际。
