恶意IP扫描是几乎所有公开网站都会遇到的问题。只要你的服务器有公网IP,用不了多久就会在日志里看到各种奇怪的请求:探测后台地址、尝试常见漏洞路径、暴力扫描端口等。这些扫描行为本身可能不会直接攻破网站,但它是绝大多数攻击的第一步。如果放任不管,扫描者一旦发现可利用的漏洞,后续就是入侵、挂马、勒索甚至数据窃取。因此,学会识别和拦截恶意IP扫描,是网站安全防护的基本功。

一、先搞清楚:怎么判断自己正在被恶意扫描
最直接的判断依据是服务器日志。以Nginx为例,打开日志目录(通常在 /var/log/nginx/ 下),查看 access.log 中出现频率最高的IP。正常用户的请求路径五花八门,而扫描器的请求往往有明显特征:大量访问 /phpmyadmin/、/admin/、/wp-login.php、/.env、/config.php 这类敏感路径,或者短时间内对同一个地址发起几十上百次请求。
除了Web日志,还要关注系统层面的异常。用 netstat -anp 或 ss -s 查看当前连接,如果发现某个IP同时建立了大量连接,或者服务器的CPU、带宽突然飙升却没有对应的有效流量增长,基本可以断定正在被扫描或攻击。另外,可以借助whois查询IP归属,来自可疑数据中心、已知恶意段(如某些国外VPS商的IP段)的高频访问,更值得警惕。
二、防火墙层面:最基础也最有效的拦截手段
防火墙是拦截恶意IP的第一道关卡,建议在系统层和云平台层同时配置。Linux系统下常用 iptables 或 firewalld,直接封禁单个IP很简单:
iptables -I INPUT -s 192.168.1.100 -j DROP
这条命令会丢弃来自该IP的所有数据包。如果需要封禁整个网段,写成 192.168.1.0/24 即可。使用 firewalld 的话,可以用 firewall-cmd 添加 drop 规则,效果相同。要注意的是,封禁前务必确认该IP不是CDN节点或搜索引擎爬虫,否则会误伤正常流量。
云服务器用户还可以利用云平台提供的安全组功能。安全组在虚拟化层生效,即使系统防火墙被绕过也能拦截,而且配置更直观。常见的做法是:只放行80、443和SSH端口,SSH端口不要对全网开放,可以限制只允许自己的固定IP访问。对于不必要的服务端口,一律关闭,这能大幅减少被端口扫描发现攻击面的机会。
三、Fail2ban:让封禁自动化起来
手动封IP效率太低,扫描器经常换IP,靠人盯日志不现实。Fail2ban是解决这个问题的经典工具,它会实时监控日志文件,匹配到符合规则的失败请求(比如多次尝试登录失败、访问不存在的敏感路径),就自动调用防火墙封禁该IP一段时间。
以Nginx为例,先创建一个过滤规则文件,匹配日志中的404扫描行为,然后在jail配置中设置 maxretry(最大尝试次数)和 bantime(封禁时长)。比如设置10分钟内产生30次404就封禁24小时。这种策略对正常用户几乎无影响,因为普通人不可能短时间访问几十个不存在的页面,而扫描器往往一次就请求成百上千个路径,很快就会触发规则。
需要注意封禁时长的平衡:设置太短,攻击者换个周期继续扫;设置太长,如果误封了共享出口IP(比如某些公司或校园网的NAT出口),会影响一批正常用户。建议对明确恶意的IP长期封禁,对可疑但不确定的IP短期封禁并观察。
四、隐藏真实IP与CDN防护
很多时候被扫描是因为真实服务器IP暴露了。如果域名直接解析到服务器IP,任何人用简单工具就能拿到地址然后绕过域名直接扫描。解决办法是给网站套一层CDN,比如Cloudflare、阿里云CDN等,把域名解析到CDN节点,真实服务器只允许CDN节点的IP回源访问。
配置回源白名单的具体做法是:在防火墙中只放行CDN商公布的IP段对80和443端口的访问,其他来源一律拒绝。这样即使扫描器拿到了你的真实IP,发起请求也会被直接丢弃。同时要检查服务器上是否有其他服务(比如邮件服务、旧的业务端口)会泄露真实IP,历史DNS解析记录也可以通过修改服务器IP来彻底切断关联。
CDN还附带一个好处:大多数CDN自带基础防护能力,可以在边缘节点识别并拦截常见的扫描行为,流量根本到不了你的源站,服务器压力和暴露风险同时降低。
五、应用层加固:Nginx限流与WAF
防火墙管的是连接层面,应用层的防护则需要Web服务器和安全工具配合。Nginx自带限流模块,可以按IP限制请求速率,典型配置是定义一个限流区域,每个IP每秒最多处理10个请求,超出的返回503或直接丢弃。对付低频率慢速扫描,还可以按连接数限制,防止单个IP占满连接池。
另一个实用技巧是对敏感路径做精准拦截。比如网站根本不使用PHP,可以在Nginx中直接对 .php、.asp 结尾的请求返回403,对 /.env、/.git 等路径一律拒绝。这样扫描器探测时拿不到任何有效信息,也就无从判断你的技术栈和漏洞点。
如果预算允许,建议部署WAF(Web应用防火墙)。开源方案有ModSecurity配合OWASP规则集,可以直接集成到Nginx或Apache中;商业方案则包括各大云厂商的WAF服务。WAF能识别SQL注入、路径遍历、漏洞利用等扫描特征,在请求到达业务代码之前就完成拦截,防护粒度比防火墙细得多。
六、日常运维:持续监控与定期复盘
安全不是一次性配置就完事的工作。建议养成定期看日志的习惯,每周至少检查一次访问日志中的异常IP和异常路径,及时更新封禁列表。可以写个简单脚本统计日志中403和404的Top IP,配合whois信息判断是否需要长期封禁。
同时保持系统和应用更新,很多扫描就是针对已知漏洞的批量探测,及时打补丁能让大部分扫描无功而返。修改SSH默认端口、禁用密码登录只允许密钥登录、删除不必要的后台页面,这些小改动叠加起来,能显著降低被攻击成功的概率。
总结一下,防护恶意IP扫描的核心思路是:减少暴露面(关端口、藏真实IP)+ 自动化拦截(Fail2ban、防火墙规则)+ 应用层过滤(限流、WAF)+ 持续监控。多层防护配合使用,即使不能百分之百杜绝扫描,也足以让绝大多数扫描者知难而退。