在这里插入图片描述
做Linux服务器运维的人,几乎都有过这样的困扰:每天打开服务器日志,满屏都是恶意IP的扫描记录和登录尝试。我曾为一家部署在香港机房的电商网站做运维,该网站日均访问量仅5000+,但每天却要承受上千个IP的端口扫描,SSH暴力破解尝试高达上万次——管理员每天花2-3小时手动封禁IP,可刚封完一批,新的恶意IP又蜂拥而至,不仅耗费大量时间,还经常因为响应不及时,导致服务器CPU负载飙升、网站卡顿,甚至出现短暂宕机。

这就是被动防御的痛点:恶意IP是动态变化的,黑客会不断切换IP地址发起攻击,手动封禁根本跟不上攻击节奏。尤其是香港机房,作为国际网络节点,接入了全球多条海底光缆,攻击来源更分散、更隐蔽,手动防御更是杯水车薪。

今天,我将用“代码+讲解+实战”的方式,教你搭建一套自动化的恶意IP封禁体系——通过脚本自动识别SSH暴力破解、CC攻击、端口扫描等恶意行为,结合iptables和fail2ban实现自动封禁,让服务器实现“无人值守”的主动防御,彻底摆脱手动封IP的困扰,尤其适配香港机房的网络环境和攻击特征。

2. 先搞懂概念:哪些IP需要封禁?

在编写脚本之前,我们首先要明确:哪些IP属于“恶意IP”,值得我们重点封禁。结合香港服务器的攻击特点,主要分为5类,用通俗的语言就能快速理解,无需复杂术语:

(1)SSH暴力破解IP

这类IP最常见,黑客通过自动化工具,使用密码字典不断尝试登录服务器的SSH端口(默认22端口),短时间内会发起多次登录失败请求。一旦破解成功,就能获得服务器root权限,后果不堪设想。香港机房的SSH暴力破解IP,多来自欧美、东南亚地区,攻击频率极高。

(2)端口扫描IP

黑客使用nmap、masscan等工具,扫描服务器的开放端口(如80、443、3306等),目的是寻找服务器的漏洞(如弱端口、未修复的漏洞),为后续攻击做准备。这类IP的特征是:短时间内对服务器多个端口发起连接请求,连接成功率极低。

(3)CC攻击IP

针对Web服务的常见攻击,黑客通过脚本或工具,短时间内对网站发起大量HTTP/HTTPS请求,耗尽服务器的CPU、内存和带宽资源,导致网站无法正常响应。香港机房的网站常面临这类攻击,尤其是电商、资讯类网站,攻击IP多来自全球各地,难以手动追踪。

(4)恶意爬虫IP

这类IP不遵守网站的robots.txt协议,高频抓取网站内容(如商品信息、文章、用户数据),不仅占用服务器资源,还可能导致网站数据泄露。与正常爬虫(如百度、谷歌爬虫)不同,恶意爬虫的请求频率极高,且不会携带正常的爬虫标识。

(5)香港机房的特殊性

香港作为国际网络节点,没有网络长城限制,攻击来源更广泛(欧美、东南亚、日韩等),且部分攻击来自“劣质国际线路”,攻击IP的地域分布分散。因此,我们的脚本不能简单“一刀切”封禁IP,需考虑多地域IP的处理策略,避免误封正常用户。

3. 准备工作:了解你的防火墙工具

封禁恶意IP的核心是“防火墙”,Linux系统中有多种防火墙工具,不同工具的适用场景不同,我们先做对比,帮你选择最适合自己的方案(尤其适配香港服务器的运维场景):

在这里插入图片描述

本文将以 iptables + fail2ban 为核心,提供可直接使用的脚本方案——iptables负责执行IP封禁规则,fail2ban负责自动识别恶意行为,两者结合,既能保证防御效果,又能实现自动化,完美适配香港服务器的运维需求。

前置准备(必做):确保服务器已安装iptables、fail2ban(后续脚本会包含安装命令),且日志文件(如/var/log/auth.log、/var/log/nginx/access.log)可正常读取(无权限问题)。

4. 核心脚本一:自动封禁SSH暴力破解IP

SSH暴力破解是香港服务器最常见的攻击,这类攻击的特征是“短时间内多次登录失败”,我们可以通过扫描SSH登录日志,统计失败次数,超过阈值就自动封禁该IP。以下是完整的bash脚本,可直接复制粘贴使用。

脚本功能

定时扫描服务器的SSH登录日志(Ubuntu/Debian为/var/log/auth.log,CentOS/RHEL为/var/log/secure),统计单个IP的登录失败次数,当失败次数超过设定阈值时,自动将该IP加入iptables黑名单,同时记录封禁日志,方便后续排查。

完整代码示例(bash脚本)

#!/bin/bash

自动封禁SSH暴力破解IP脚本

适用系统:Ubuntu/Debian、CentOS/RHEL

作者:资深Linux运维工程师

功能:统计SSH登录失败次数,超过阈值自动封禁IP,记录封禁日志

1. 配置参数(可根据自身需求调整)

THRESHOLD=5 # 登录失败次数阈值(建议5-10次,香港服务器可设5次,攻击频繁)
LOG_FILE=“/var/log/auth.log” # SSH登录日志路径(Ubuntu/Debian)

LOG_FILE=“/var/log/secure” # 注释上面一行,启用此行(CentOS/RHEL)

BAN_LOG=“/var/log/ban_ip.log” # 封禁日志路径,记录所有封禁操作
WHITELIST_FILE=“/etc/whitelist.txt” # 白名单文件路径,避免误封正常IP

2. 检查必要命令是否存在(避免脚本执行失败)

if ! command -v grep &>/dev/null || ! command -v awk &>/dev/null || ! command -v iptables &>/dev/null; then
echo “$(date): 脚本依赖的grep、awk、iptables命令未找到,请先安装!” >> $BAN_LOG
exit 1
fi

3. 检查白名单文件是否存在,不存在则创建(避免报错)

if [ ! -f $WHITELIST_FILE ]; then
touch $WHITELIST_FILE
echo “# 白名单IP,每行一个,可添加公司IP、常用IP、CDN节点IP” >> $WHITELIST_FILE
fi

4. 统计SSH登录失败的IP及失败次数

grep “Failed password” 筛选登录失败记录

awk ‘{print $(NF-3)}’ 提取IP地址(日志中IP位于倒数第4个字段)

sort | uniq -c 统计每个IP的失败次数,输出格式为“次数 IP”

grep “Failed password” $LOG_FILE | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 7: (NF-3)}̲' | sort | uniq…ip" $WHITELIST_FILE; then
# 6. 判断失败次数是否超过阈值
if [ $count -gt $THRESHOLD ]; then
# 7. 检查该IP是否已被封禁,未封禁则添加iptables规则
if ! iptables -C INPUT -s $ip -j DROP 2>/dev/null; then
iptables -A INPUT -s KaTeX parse error: Expected 'EOF', got '#' at position 13: ip -j DROP #̲ 添加封禁规则,拒绝该IP的所…(date +“%Y-%m-%d %H:%M:%S”): 封禁SSH暴力破解IP $ip (失败次数: $count)" >> $BAN_LOG
fi
fi
fi
done

8. 持久化iptables规则(避免重启服务器后规则丢失)

Ubuntu/Debian 持久化命令

if [ -f /etc/network/interfaces ]; then
iptables-save > /etc/iptables/rules.v4
fi

CentOS/RHEL 持久化命令

if [ -f /etc/redhat-release ]; then
iptables-save > /etc/sysconfig/iptables
fi

逐行讲解(关键部分)
  1. 配置参数:THRESHOLD是失败次数阈值,香港服务器攻击频繁,建议设5次;LOG_FILE需根据系统版本选择,避免日志路径错误;BAN_LOG用于记录封禁操作,方便后续追溯;WHITELIST_FILE是白名单文件,可添加公司IP、常用IP,避免误封。

  2. 依赖检查:脚本依赖grep(筛选日志)、awk(提取IP)、iptables(执行封禁),若缺少这些命令,脚本会报错并记录日志,避免无意义执行。

  3. 日志分析:grep “Failed password” 筛选出所有SSH登录失败的记录;awk ‘{print $(NF-3)}’ 提取IP地址(SSH失败日志的格式固定,IP位于倒数第4个字段);sort | uniq -c 统计每个IP的失败次数。

  4. 白名单检查:先判断IP是否在白名单中,若在则跳过,避免误封正常用户(比如自己的办公IP)。

  5. 封禁逻辑:若IP不在白名单,且失败次数超过阈值,先检查是否已封禁(避免重复添加规则),未封禁则执行iptables -A INPUT -s $ip -j DROP,拒绝该IP的所有入站请求,同时记录封禁日志。

  6. 规则持久化:iptables规则默认是临时的,重启服务器后会丢失,因此脚本最后添加了持久化命令,根据系统版本保存规则。

脚本使用方法
  1. 保存脚本:将上述代码复制到服务器,保存为 ban_ssh.sh(路径建议:/usr/local/scripts/ban_ssh.sh)。

  2. 赋予执行权限:chmod 700 /usr/local/scripts/ban_ssh.sh(700权限确保只有root用户能执行,避免被恶意修改)。

  3. 添加定时任务:执行 crontab -e,添加一行:*/5 * * * * /usr/local/scripts/ban_ssh.sh(每5分钟执行一次,香港服务器可设3分钟一次,提升响应速度)。

  4. 测试脚本:手动执行 ./ban_ssh.sh,查看/var/log/ban_ip.log,确认脚本是否正常运行。

5. 核心脚本二:自动封禁CC攻击IP

CC攻击是针对Web服务的恶意攻击,特征是“短时间内单个IP发起大量HTTP请求”,会耗尽服务器资源。我们通过分析Nginx访问日志(Apache日志可类比修改),统计单个IP的请求次数,超过阈值自动封禁,以下是完整脚本。

脚本功能

分析Nginx访问日志,统计最近1分钟内单个IP的请求次数,当请求次数超过设定阈值时,自动封禁该IP;支持白名单排除(如搜索引擎、CDN节点),支持临时封禁(24小时后自动解封),适配香港网站的CC攻击防御需求。

完整代码示例(bash脚本)

#!/bin/bash

自动封禁CC攻击IP脚本

适用系统:Ubuntu/Debian、CentOS/RHEL(需安装Nginx)

功能:分析Nginx访问日志,封禁高频请求IP,支持白名单、临时封禁

1. 配置参数(可根据网站流量调整)

THRESHOLD=200 # 每分钟请求次数阈值(香港小型网站建议150-200,大型网站可设500)
LOG_FILE=“/var/log/nginx/access.log” # Nginx访问日志路径(默认路径)
BAN_LOG=“/var/log/ban_ip.log” # 与SSH封禁共用日志,方便统一管理
WHITELIST_FILE=“/etc/whitelist.txt” # 与SSH封禁共用白名单
BAN_DURATION=86400 # 临时封禁时长(秒),86400秒=24小时,重复攻击可延长

2. 检查必要命令和文件

if ! command -v grep &>/dev/null || ! command -v awk &>/dev/null || ! command -v iptables &>/dev/null; then
echo “$(date): 脚本依赖的grep、awk、iptables命令未找到,请先安装!” >> $BAN_LOG
exit 1
fi
if [ ! -f LOGFILE];thenecho"LOG_FILE ]; then echo "LOGFILE];thenecho"(date): Nginx访问日志 $LOG_FILE 不存在,请检查路径!" >> $BAN_LOG
exit 1
fi
if [ ! -f $WHITELIST_FILE ]; then
touch $WHITELIST_FILE
echo “# 白名单IP,每行一个,可添加CDN节点、搜索引擎IP” >> $WHITELIST_FILE
fi

3. 提取最近1分钟的访问日志(tail -n 10000 避免日志过多导致脚本卡顿)

筛选最近1分钟的记录:根据日志时间格式(默认[DD/Mon/YYYY:HH:MM:SS])提取

current_time=(date+"recentlogs=(date +"%d/%b/%Y:%H:%M") recent_logs=(date+"recentlogs=(tail -n 10000 LOGFILE∣grep"LOG_FILE | grep "LOGFILEgrep"current_time")

4. 统计每个IP的请求次数

echo “$recent_logs” | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲' | sort | uniq…ip" $WHITELIST_FILE; then
# 6. 超过阈值则封禁
if [ $count -gt $THRESHOLD ]; then
# 7. 检查是否已封禁
if ! iptables -C INPUT -s $ip -j DROP 2>/dev/null; then
# 添加封禁规则
iptables -A INPUT -s ip−jDROPecho"ip -j DROP echo "ipjDROPecho"(date +“%Y-%m-%d %H:%M:%S”): 封禁CC攻击IP $ip (1分钟请求次数: $count,封禁时长: $BAN_DURATION 秒)" >> $BAN_LOG

            # 8. 临时封禁:启动后台进程,到期后自动解封
            (sleep $BAN_DURATION; iptables -D INPUT -s $ip -j DROP; echo "$(date +"%Y-%m-%d %H:%M:%S"): 自动解封IP $ip(封禁时长到期)" >> $BAN_LOG) &
        fi
    fi
fi

done

9. 持久化iptables规则(临时封禁规则重启后会丢失,不影响长期封禁)

if [ -f /etc/network/interfaces ]; then
iptables-save > /etc/iptables/rules.v4
elif [ -f /etc/redhat-release ]; then
iptables-save > /etc/sysconfig/iptables
fi

逐行讲解(关键部分)
  1. 配置参数:THRESHOLD根据网站流量调整,香港小型网站(日均访问5000+)建议设150-200,大型网站可设500;BAN_DURATION是临时封禁时长,默认24小时,避免误封后无法恢复正常访问,重复攻击可手动延长。

  2. 日志筛选:current_time获取当前时间(格式与Nginx日志一致),grep “$current_time” 筛选最近1分钟的访问日志;tail -n 10000 避免日志过多导致脚本卡顿,可根据日志量调整。

  3. 临时封禁逻辑:通过后台进程(sleep $BAN_DURATION)实现自动解封,& 符号表示后台运行,不影响脚本主进程执行;解封时会删除对应的iptables规则,并记录日志。

  4. 白名单共用:与SSH封禁脚本共用白名单文件,避免重复配置,方便管理(可在白名单中添加Cloudflare、阿里云等CDN节点IP,避免误封CDN)。

进阶优化(必做)
  1. 排除CDN真实IP:如果网站使用Cloudflare等CDN,Nginx日志中记录的是CDN节点IP,而非真实攻击IP,需先配置Nginx获取真实IP(后面“香港机房的特殊考虑”会详细说明),否则会误封CDN节点。

  2. 调整阈值:根据网站正常访问量调整THRESHOLD,比如正常用户每分钟请求不超过50次,可将阈值设为150,既避免误封,又能防御攻击。

  3. 结合fail2ban:如果觉得脚本维护麻烦,可将CC攻击防御交给fail2ban,后面会给出配置方案。

脚本使用方法
  1. 保存脚本:保存为 ban_cc.sh,路径与ban_ssh.sh一致(/usr/local/scripts/ban_cc.sh)。

  2. 赋予权限:chmod 700 /usr/local/scripts/ban_cc.sh。

  3. 定时任务:crontab -e 添加一行:*/1 * * * * /usr/local/scripts/ban_cc.sh(每分钟执行一次,及时防御CC攻击)。

6. 核心脚本三:fail2ban的高效配置

虽然手动编写脚本灵活,但维护成本较高,fail2ban是专门用于封禁恶意IP的工具,开箱即用,可自动分析日志、触发封禁,还能与iptables无缝结合,适合不想手动维护脚本的运维人员。以下是fail2ban的完整安装、配置方案,适配香港服务器。

安装fail2ban(主流Linux发行版)

Ubuntu/Debian 安装命令

apt-get update && apt-get install fail2ban -y

CentOS/RHEL 安装命令

yum install epel-release -y # 先安装epel源(CentOS默认没有fail2ban)
yum install fail2ban -y

启动并设置开机自启

systemctl start fail2ban
systemctl enable fail2ban

查看运行状态,确认安装成功

systemctl status fail2ban

完整配置示例(覆盖SSH、CC攻击防御)

fail2ban的核心配置文件是 /etc/fail2ban/jail.local(新建该文件,覆盖默认配置,避免修改原始文件),以下配置可直接复制使用,适配香港服务器的攻击特征。

新建并编辑fail2ban配置文件

cat > /etc/fail2ban/jail.local <<EOF

全局配置(所有规则通用)

[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.0.0/16 # 默认忽略的IP(本地IP、内网IP)
bantime = 3600 # 默认封禁时长(秒),3600秒=1小时
findtime = 600 # 统计时间窗口(秒),600秒=10分钟内的攻击次数
maxretry = 5 # 最大尝试次数,超过则封禁
backend = auto # 自动选择日志后端,无需手动配置
action = iptables-multiport[name=DEFAULT, port=“ssh,http,https”, protocol=tcp] # 默认封禁的端口
logpath = /var/log/auth.log /var/log/nginx/access.log # 监控的日志文件

1. SSH防护(重点,香港服务器必开)

[sshd]
enabled = true # 启用该规则
port = ssh # 防护的端口(默认22,若修改过SSH端口,需同步修改)
filter = sshd # 内置的过滤规则(匹配SSH登录失败日志)
logpath = /var/log/auth.log # SSH日志路径(Ubuntu/Debian)

logpath = /var/log/secure # CentOS/RHEL 需启用此行

maxretry = 5 # 10分钟内失败5次,封禁1小时
bantime = 3600 # 首次封禁1小时,重复攻击可延长
findtime = 600

2. Nginx CC攻击防护

[nginx-cc]
enabled = true # 启用该规则
port = http,https # 防护的Web端口
filter = nginx-cc # 自定义过滤规则(需新建)
logpath = /var/log/nginx/access.log # Nginx访问日志路径
maxretry = 200 # 1分钟内请求超过200次,封禁2小时
bantime = 7200 # 封禁时长2小时
findtime = 60 # 统计时间窗口1分钟

3. Nginx 404攻击防护(可选,针对恶意扫描404页面的IP)

[nginx-404]
enabled = true
port = http,https
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 50 # 10分钟内404请求超过50次,封禁1小时
bantime = 3600
findtime = 600
EOF

新建自定义过滤规则(nginx-cc、nginx-404)

上面配置中,[nginx-cc]和[nginx-404]使用了自定义过滤规则,需要新建对应的filter文件,否则fail2ban无法识别日志。

1. 新建nginx-cc过滤规则(匹配CC攻击日志)

cat > /etc/fail2ban/filter.d/nginx-cc.conf <<EOF
[Definition]
failregex = ^ .* "GET .* HTTP/." 200 .$
^ .* "POST .* HTTP/." 200 .$
ignoreregex = # 忽略的日志(可添加正常爬虫的标识,如百度、谷歌)
EOF

2. 新建nginx-404过滤规则(匹配404扫描日志)

cat > /etc/fail2ban/filter.d/nginx-404.conf <<EOF
[Definition]
failregex = ^ .* "GET .* HTTP/." 404 .$
^ .* "POST .* HTTP/." 404 .$
ignoreregex =
EOF

重启fail2ban,使配置生效

systemctl restart fail2ban

查看fail2ban状态,确认规则已启用

fail2ban-client status

查看具体规则的状态(如sshd、nginx-cc)

fail2ban-client status sshd
fail2ban-client status nginx-cc

fail2ban常用命令(必记)

1. 查看所有被封禁的IP

fail2ban-client banned

2. 手动解封某个IP(如误封正常用户IP)

fail2ban-client set sshd unbanip 192.168.1.100 # 解封sshd规则中的IP
fail2ban-client set nginx-cc unbanip 192.168.1.100 # 解封nginx-cc规则中的IP

3. 手动封禁某个IP(临时应急)

fail2ban-client set sshd banip 192.168.1.200

4. 查看fail2ban日志(排查问题)

tail -f /var/log/fail2ban.log

5. 重启、停止、启动fail2ban

systemctl restart fail2ban
systemctl stop fail2ban
systemctl start fail2ban

7. 香港机房的特殊考虑

香港机房作为国际节点,网络环境和攻击特征与大陆服务器不同,在配置防火墙和封禁脚本时,需要重点注意以下4点,避免出现防御失效或误封正常用户的情况。

(1)国际攻击来源的处理策略

香港服务器的攻击IP多来自欧美、东南亚、日韩等地区,这些地区既有恶意IP,也有正常用户。因此,禁止直接封禁整个IP段(如192.168.0.0/16),应精准封禁单个恶意IP;同时,可结合GeoIP模块(后续优化会提及),对攻击频繁的地区做精细化封禁(如某东南亚国家的IP频繁攻击,可限制该地区IP的访问频率)。

(2)CDN场景下获取真实IP(必做)

很多香港网站会使用Cloudflare、阿里云国际版等CDN,此时Nginx日志中记录的是CDN节点IP,而非真实的攻击IP,若直接封禁,会误封CDN节点,导致正常用户无法访问。因此,需先配置Nginx获取真实IP,步骤如下:

编辑Nginx主配置文件(或站点配置文件)

vi /etc/nginx/nginx.conf

在http块中添加以下配置(获取真实IP)

http {
# 允许的CDN节点IP段(以Cloudflare为例,可根据实际使用的CDN修改)
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;

# 从X-Forwarded-For头中获取真实IP
real_ip_header X-Forwarded-For;
real_ip_recursive on;  # 递归解析,获取最外层的真实IP

}

重启Nginx,使配置生效

systemctl restart nginx

配置完成后,Nginx日志中会记录真实的用户IP,此时脚本和fail2ban才能精准封禁恶意IP,避免误封CDN节点。

(3)香港线路质量与攻击特征分析

香港机房的部分攻击来自“劣质国际线路”,这类IP的特征是:延迟高、丢包率高,且攻击频率集中在夜间(香港时间22:00-次日6:00,对应欧美白天)。因此,可在脚本中添加“时间段判断”,夜间适当降低封禁阈值,提升防御灵敏度;同时,记录封禁IP的来源地区(可使用ipinfo等工具),分析攻击特征,针对性优化防御规则。

(4)高防机房配合(进阶)

如果香港服务器使用了机房的高防服务(如香港电讯PCCW、新世界电讯的高防),可将脚本和fail2ban封禁的IP同步上报给机房,实现“本地防火墙+机房高防”的多层防御。多数机房支持API接口,可编写简单脚本,将/var/log/ban_ip.log中的封禁IP同步到机房高防系统,进一步提升防御效果。

8. 脚本优化与安全建议

基础脚本和fail2ban配置已能满足大部分香港服务器的防御需求,以下优化建议可进一步提升脚本的健壮性和安全性,避免出现误封、脚本被恶意利用等问题。

(1)完善白名单机制(必做)

白名单是避免误封的关键,建议在/etc/whitelist.txt中添加以下IP:

  • 公司办公IP、运维人员常用IP;

  • CDN节点IP(如Cloudflare、阿里云CDN);

  • 搜索引擎爬虫IP(如百度、谷歌、必应);

  • 合作伙伴IP(如支付接口、第三方服务IP)。

同时,定期检查白名单,删除不再使用的IP,避免白名单过大导致防御失效。

(2)临时封禁 vs 永久封禁

建议采用“临时封禁为主,永久封禁为辅”的策略:

  • 首次攻击的IP:临时封禁24小时,若24小时后不再攻击,自动解封;

  • 重复攻击的IP(如7天内被封禁3次以上):手动设置永久封禁,或延长封禁时长(如7天);

  • 可在脚本中添加“重复攻击检测”,记录IP的封禁次数,自动延长封禁时长。

(3)日志监控与告警

将封禁日志(/var/log/ban_ip.log)接入监控系统(如Zabbix、Prometheus),或配置邮件告警,当出现大量恶意IP封禁时,及时收到通知,排查是否存在大规模攻击。邮件告警配置示例(添加到脚本末尾):

邮件告警配置(需安装sendmail或postfix)

BAN_COUNT=(grep"(grep "(grep"(date +“%Y-%m-%d”)" $BAN_LOG | wc -l)
ALERT_THRESHOLD=50 # 单日封禁超过50个IP,触发告警
if [ $BAN_COUNT -gt $ALERT_THRESHOLD ]; then
echo “香港服务器今日已封禁 $BAN_COUNT 个恶意IP,可能存在大规模攻击,请及时排查!” | mail -s “服务器恶意IP封禁告警” your@email.com
fi

(4)脚本自我保护
  • 限制脚本执行权限:chmod 700,确保只有root用户能执行,避免普通用户修改脚本、添加恶意规则;

  • 定期备份脚本和配置文件:将ban_ssh.sh、ban_cc.sh、jail.local等文件备份到其他服务器,避免误删或被篡改;

  • 脚本添加日志轮转:避免/var/log/ban_ip.log过大,可配置logrotate,定期压缩日志。

(5)GeoIP精细化封禁(进阶)

安装GeoIP模块,结合IP的地域信息,对攻击频繁的地区做精细化封禁,避免误封正常用户。以iptables结合GeoIP为例:

安装GeoIP模块(Ubuntu/Debian)

apt-get install xtables-addons-common geoip-database -y

加载GeoIP模块

modprobe xt_geoip

封禁攻击频繁的地区(如某东南亚国家,国家代码可查询GeoIP数据库)

iptables -A INPUT -m geoip --geoip-country ID -j DROP # 封禁印度尼西亚IP
iptables -A INPUT -m geoip --geoip-country VN -j DROP # 封禁越南IP

持久化规则

iptables-save > /etc/iptables/rules.v4

9. 避坑指南:防火墙设置的5个常见误区

结合香港服务器的运维经验,总结了5个最容易踩的防火墙误区,很多运维人员因为这些误区,导致防御失效、误封正常用户,甚至影响服务器正常运行,一定要避开:

误区1:封禁IP时直接封整个C段

很多人发现某个IP攻击后,会直接封禁该IP所在的C段(如192.168.1.0/24),认为这样防御更彻底。但香港服务器的攻击IP地域分散,一个C段中可能既有恶意IP,也有正常用户,直接封禁整个C段会导致大量正常用户无法访问,正确做法是精准封禁单个IP。

误区2:iptables规则顺序错误导致失效

iptables规则按“从上到下”的顺序匹配,若将DROP规则放在ACCEPT规则之后,会导致DROP规则失效。例如:先添加“ACCEPT所有IP的访问”,再添加“DROP恶意IP”,此时恶意IP会被ACCEPT规则匹配,无法被封禁。正确顺序:先添加DROP规则,再添加ACCEPT规则。

误区3:忘记保存iptables规则

iptables规则默认是临时的,重启服务器后会全部丢失,很多运维人员配置完规则后,忘记持久化,导致重启后防御失效。正确做法:每次修改规则后,执行iptables-save命令,将规则保存到对应文件(Ubuntu/Debian:/etc/iptables/rules.v4;CentOS/RHEL:/etc/sysconfig/iptables)。

误区4:过度依赖脚本,忽略系统更新

脚本和防火墙是“被动防御”,无法防御系统漏洞导致的攻击。很多人过度依赖脚本,却忘记定期更新系统、修复漏洞(如SSH漏洞、Nginx漏洞),导致黑客通过漏洞入侵服务器,即使封禁了IP也无济于事。正确做法:每周更新系统(apt update && apt upgrade 或 yum update),及时修复高危漏洞。

误区5:香港服务器忽视国际线路特点,误封正常用户

香港服务器的正常用户可能来自全球各地,若盲目封禁某个地区的IP(如欧美IP),会导致该地区的正常用户无法访问。正确做法:结合日志分析攻击特征,只封禁高频恶意IP,避免“一刀切”封禁某个地区;同时,配置白名单,确保正常用户IP不被误封。

10. 实战案例:脚本封禁的实际效果

以下2个真实案例(适配香港服务器),展示脚本和fail2ban的实际防御效果,让你直观了解自动化封禁的价值:

案例1:SSH暴力破解防御

某部署在香港机房的游戏服务器,每天遭受上万次SSH暴力破解,管理员手动封禁IP,每天耗费2小时,仍有漏网之鱼,甚至出现一次被破解成功、服务器被植入木马的情况。部署ban_ssh.sh脚本+fail2ban后,设置失败次数阈值5次、封禁时长1小时,运行1天后:

  • 自动封禁恶意IP 127个,SSH登录失败次数从日均10000+降至500以下;

  • 管理员无需手动封IP,节省大量时间;

  • 未再出现SSH被破解的情况,服务器安全性大幅提升。

案例2:CC攻击防御

某香港电商网站,遭遇CC攻击,单个IP每分钟请求次数高达500+,导致服务器CPU负载飙升至100%,网站无法正常响应,订单流失严重。部署ban_cc.sh脚本+fail2ban nginx-cc规则后,设置请求阈值200次/分钟、封禁时长2小时,运行30分钟后:

  • 自动封禁CC攻击IP 89个,服务器CPU负载从100%降至15%以下;

  • 网站恢复正常响应,访问速度回到正常水平;

  • 后续未再出现大规模CC攻击,仅偶尔有少量恶意IP被快速封禁。

总结:从被动防御到主动防护

对于香港网站云服务器来说,恶意IP攻击是常态,被动手动封禁不仅效率低,还无法跟上攻击节奏。自动化脚本+fail2ban的组合,能实现“无人值守”的主动防御,既节省运维成本,又能有效保障服务器安全,尤其适配香港机房的国际攻击特征。

给Linux运维人员一份“三步走”防御指南,直接照做即可:

第1步:部署基础防护 → 安装iptables和fail2ban,配置SSH防护规则,快速抵御最常见的SSH暴力破解,这是香港服务器的基础防御。

第2步:扩展Web防护 → 部署CC攻击封禁脚本,配置Nginx获取真实IP(若使用CDN),防御针对Web服务的CC攻击、404扫描等恶意行为。

第3步:持续优化 → 根据封禁日志,调整阈值和封禁时长,完善白名单,结合GeoIP做精细化封禁,定期更新系统和脚本,实现长期稳定的防御。

最后想跟大家说:防火墙和脚本不是“一劳永逸”的,攻击手段在不断变化,我们需要定期审查封禁日志、优化规则,才能持续抵御恶意攻击。如果你有更复杂的防御需求(如定制化脚本、高防方案适配),欢迎咨询专业运维团队,获取针对香港服务器的专属安全配置建议。

防火墙配置自检清单(10项,必查)

配置完成后,对照以下10项检查点,确保防火墙和脚本正常运行,避免出现防御漏洞:

  1. 是否已安装iptables和fail2ban,且服务正常运行(systemctl status iptables fail2ban)?

  2. iptables规则是否持久化,重启服务器后规则是否会丢失?

  3. 是否已配置白名单(/etc/whitelist.txt),并添加了常用IP、CDN节点IP?

  4. 若使用CDN, 是否已配置Nginx获取真实IP(set_real_ip_from和real_ip_header)?

  5. 脚本(ban_ssh.sh、ban_cc.sh)是否赋予700权限,且添加了定时任务?

  6. 封禁日志(/var/log/ban_ip.log)是否正常记录,无报错信息?

  7. fail2ban是否启用了sshd、nginx-cc规则,且状态正常(fail2ban-client status)?

  8. 是否已测试手动解封IP,确保解封功能正常(fail2ban-client set sshd unbanip)?

  9. 系统是否开启自动更新,高危漏洞是否及时修复?

  10. 是否配置了日志监控或邮件告警,能及时发现大规模攻击?

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐