Skip to content

如何封禁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 2

2. 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 reload

3. 应用层封禁(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:

    1. 进入WAF & Shield控制台
    2. 创建IP匹配条件集
    3. 添加到Web ACL规则
  • 阿里云:

    1. 安全中心 > 网络防火墙
    2. 添加自定义拦截策略
    3. 输入IP/网段并保存
  • 腾讯云:

    1. 安全组 > 入站规则
    2. 添加拒绝规则并指定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 reload

6. 使用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

管理建议:

  1. 定期维护:每月审查黑名单,移除不再活跃的IP
  2. 分层防御:建议同时使用操作系统层+Web服务器层封禁
  3. 监控报警:当封禁IP数量突增时触发报警
  4. 备份机制:定期备份黑名单文件
  5. CDN集成:如果使用Cloudflare等CDN,在其控制台同步封禁