如何封禁IP并添加黑名单(全栈方案)
1. 操作系统层封禁(Linux服务器)
bash
# 使用iptables封禁单个IP
sudo iptables -A INPUT -s 106.14.xxx.31 -j DROP
# 封禁整个IP段
sudo iptables -A INPUT -s 106.14.xxx.0/24 -j DROP
# 保存规则(确保重启后生效)
sudo iptables-save | sudo tee /etc/iptables/rules.v4
# 查看已封禁IP
sudo iptables -L INPUT -v -n
# 列出 `INPUT` 链的规则(含行号):
sudo iptables -L INPUT -v -n --line-numbers
# 通过行号删除(假设是第 2 行)
sudo iptables -D INPUT 22. Web服务器层封禁(Nginx)
nginx
# 在nginx.conf的http块中添加
http {
# 创建黑名单存储路径
geo $blocked_ip {
default 0;
include /etc/nginx/ip_blacklist.conf;
}
server {
# 应用黑名单规则
if ($blocked_ip) {
return 444; # 直接关闭连接
}
}
}
# 创建黑名单文件
sudo echo "106.14.xxx.31 1;" >> /etc/nginx/ip_blacklist.conf
# 重新加载Nginx
sudo nginx -s reload3. 应用层封禁(Node.js/Express示例)
typescript
// IP黑名单中间件
const IP_BLACKLIST = new Set([
"106.14.xxx.31",
"203.0.xxxx.5",
// 添加更多IP...
]);
app.use((req, res, next) => {
const realIp = req.headers['x-real-ip'] || req.ip;
// 提取IPv4格式 (处理 ::ffff:192.168.x.x 格式)
const clientIp = realIp.replace('::ffff:', '');
if (IP_BLACKLIST.has(clientIp)) {
return res.status(403).json({
code: "IP_BLOCKED",
message: "您的IP已被封禁",
ip: clientIp
});
}
next();
});4. 云服务商控制台封禁
AWS:
- 进入WAF & Shield控制台
- 创建IP匹配条件集
- 添加到Web ACL规则
阿里云:
- 安全中心 > 网络防火墙
- 添加自定义拦截策略
- 输入IP/网段并保存
腾讯云:
- 安全组 > 入站规则
- 添加拒绝规则并指定IP
5. 自动化封禁脚本
bash
#!/bin/bash
# auto_block.sh - 自动封禁恶意IP
LOG_PATH="/var/log/nginx/access.log"
BLACKLIST="/etc/nginx/ip_blacklist.conf"
# 提取10分钟内404错误超过20次的IP
malicious_ips=$(awk -vDate=$(date -d '10 minutes ago' +[%d/%b/%Y:%H:%M:%S) '$4 > Date && $9 == 404 {print $1}' $LOG_PATH | sort | uniq -c | awk '$1 > 20 {print $2}')
# 添加到黑名单
for ip in $malicious_ips; do
if ! grep -q $ip $BLACKLIST; then
echo "封禁恶意IP: $ip"
echo "$ip 1;" >> $BLACKLIST
iptables -A INPUT -s $ip -j DROP
fi
done
# 重新加载Nginx
nginx -s reload6. 使用Fail2ban(自动封禁工具)
bash
# 安装
sudo apt install fail2ban
# 创建Nginx防护配置
sudo nano /etc/fail2ban/jail.d/nginx.conf
# 添加以下内容
[nginx-bad-request]
enabled = true
port = http,https
filter = nginx-bad-request
logpath = /var/log/nginx/access.log
maxretry = 10 # 10次错误请求后封禁
findtime = 600 # 10分钟内
bantime = 86400 # 封禁24小时
# 重启服务
sudo systemctl restart fail2ban验证封禁效果
bash
# 测试被封IP的访问
curl -I http://your-domain.com --header "X-Forwarded-For: 106.14.xxx.31"
# 预期结果:
# iptables: 无响应/超时
# Nginx: 444错误
# Node.js: 403 Forbidden管理建议:
- 定期维护:每月审查黑名单,移除不再活跃的IP
- 分层防御:建议同时使用操作系统层+Web服务器层封禁
- 监控报警:当封禁IP数量突增时触发报警
- 备份机制:定期备份黑名单文件
- CDN集成:如果使用Cloudflare等CDN,在其控制台同步封禁