bash_rematch可用于精准提取日志中匹配攻击特征的ip并临时封禁,但仅适用于轻量分析或教学演示;生产环境应使用fail2ban、iptables+ipset等专业方案。

直接用 BASH_REMATCH 提取黑客IP并注入黑名单,**不推荐作为生产级防御手段**。它适合轻量日志分析、临时响应或教学演示,但无法替代专业IDS/防火墙(如fail2ban、iptables + ipset、nftables 或 Suricata)。下面给出一个**安全、可控、可验证的 Bash 实现思路**,聚焦“从日志中提取疑似攻击IP → 去重 → 临时封禁”,全程避免误杀和权限失控。
一、前提:确认日志格式与攻击特征
典型网络层日志(如 nginx access.log、tcpdump -r 输出、或自定义审计日志)需含 IP 字段,且有可识别的恶意行为线索,例如:
- 高频 404/403 请求(扫描路径)
- POST /wp-login.php 多次失败(爆破)
- User-Agent 含 sqlmap、nikto、wget -r 等工具标识
- 单 IP 短时大量连接(需配合 conntrack 或 netstat 辅助判断)
⚠️ 注意:仅靠 IP 出现频次不能等同于“黑客”,必须结合上下文规则。以下以 nginx 日志中“10秒内发起 ≥5 次 /admin/login 的 POST 请求”为例。
二、用 grep + sed + BASH_REMATCH 提取匹配IP
BASH_REMATCH 是 [[ string =~ regex ]] 成功后自动填充的数组,BASH_REMATCH[0] 是完整匹配,[1], [2]… 是捕获组。关键在于写准正则并提取 IP:
# 示例:从 nginx 日志行中提取满足条件的源IP
while IFS= read -r line; do
# 匹配形如 '192.168.1.123 - - [10/Jul/2024:14:22:35 ...] "POST /admin/login HTTP/1.1" 401'
if [[ $line =~ ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*\"POST[[:space:]]+/admin/login[[:space:]]+HTTP ]]; then
ip="${BASH_REMATCH[1]}"
# 验证IP格式(防正则误匹配)
if [[ $ip =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] &&
[[ ${BASH_REMATCH[1]/#/} == ${BASH_REMATCH[1]} ]]; then
echo "$ip"
fi
fi
done <p>? 提示:用 <code>grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'</code> 更快,但 <code>BASH_REMATCH</code> 的优势在于能同时校验请求方法、路径、状态码等多条件,避免单纯IP提取的噪声。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill7940" title="Zynq Linux Hardware Debug"><img
src="https://img.php.cn/upload/skill/000/000/081/179177762288958.jpg" alt="Zynq Linux Hardware Debug" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill7940" title="Zynq Linux Hardware Debug" class="overflowclass">Zynq Linux Hardware Debug</a>
<p class="overflowclass">Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。</p>
</div>
<a rel="nofollow" href="/xiazai/skill7940" title="Zynq Linux Hardware Debug" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h3>三、去重计数 + 动态生成黑名单(内存级)</h3><p>不直接封禁每个匹配IP,而是统计频次,只处理超过阈值的IP(如 5 次/60秒):</p><pre class="brush:php;toolbar:false;"># 统计最近1分钟内高危请求IP(需日志带时间戳)
awk -v cutoff="$(date -d '1 minute ago' '+%d/%b/%Y:%H:%M:%S')"'
'$4 > "["cutoff { print $1 }' /var/log/nginx/access.log | \
sort | uniq -c | sort -nr | awk '$1 >= 5 {print $2}'得到 IP 列表后,用 Bash 数组暂存,避免重复操作:
declare -A blacklist
while read -r ip; do
[[ -n "$ip" ]] && blacklist["$ip"]=1
done 输出待封IP(调试用)<p>echo "Found malicious IPs:"
printf '%s\n' "${!blacklist[@]}"</p>四、安全注入黑名单(推荐 iptables + ipset)
直接用 iptables -A INPUT -s x.x.x.x -j DROP 效率低且难管理。更合理的方式是:
- 先确保
ipset已安装:sudo apt install ipset(Debian)或yum install ipset(RHEL) - 创建 hash:ip 类型集合:
sudo ipset create hackips hash:ip timeout 3600(自动过期1小时) - 批量添加(原子操作,无中间开放窗口):
printf '%s\n' "${!blacklist[@]}" | sudo ipset restore -!(需先用ipset save构造 restore 格式,或逐条 add) - 最后一条 iptables 规则匹配该集合:
sudo iptables -I INPUT -m set --match-set hackips src -j DROP
✅ 这样做:封禁实时生效、可查可删(ipset list hackips)、不污染主规则链、超时自动清理。
真正对抗自动化攻击,应结合 fail2ban(内置正则+封禁+解封+邮件通知),而 Bash 脚本更适合做“离线日志巡检”或“应急快照封禁”。把 BASH_REMATCH 当作精准提取器,而非防御引擎本身——它强大,但只是工具链里的一颗螺丝。










