黑白名单批量配置服务器IP访问权限管控自动化脚本详解
为什么需要批量配置IP黑白名单?
手动一条条添加防火墙规则,在管理几十甚至上百个IP时效率极低,还容易手误遗漏。
通过自动化脚本,你可以把白名单IP和黑名单IP分别写进两个文件,执行一次脚本就能全部生效。
无论你用的是 iptables、firewalld 还是 ufw,都能用类似思路实现。
本文以最常见的 iptables 为例,给出可直接套用的脚本和避坑说明。
准备工作
- 一台运行 CentOS 7/8 或 Ubuntu 20.04+ 的服务器(脚本兼容性好)。
- 已安装 iptables-services(CentOS)或 iptables(Ubuntu 默认自带)。
- 创建两个文本文件:
whitelist.txt和blacklist.txt,每行一个 IP 或子网(如192.168.1.100或10.0.0.0/24)。 - 确保有 root 权限执行脚本。
核心脚本实现
将以下内容保存为 ip_acl.sh,然后赋予执行权限 chmod +x ip_acl.sh。
#!/bin/bash
# 黑白名单批量管控脚本 - 基于iptables
iptables -F INPUT # 清空INPUT链(请只在测试环境这么做,生产环境建议先保存原规则)
# 设置默认策略为允许(后续封禁黑名单)
iptables -P INPUT ACCEPT
# 读取白名单并放行
while read ip; do
[ -z "$ip" ] && continue
iptables -A INPUT -s $ip -j ACCEPT
done < whitelist.txt
# 读取黑名单并封禁
while read ip; do
[ -z "$ip" ] && continue
iptables -A INPUT -s $ip -j DROP
done < blacklist.txt
# 封禁后默认拒绝其他非白名单IP(可选,若想彻底仅允许白名单则启用下行)
# iptables -P INPUT DROP
echo "黑白名单已批量配置完成。"
关键说明:
- 脚本先清空 INPUT 链,再依次放行白名单、封禁黑名单。
- 如果希望仅允许白名单,需要把最后一行注释去掉,并将默认策略改为 DROP。
- 注意白名单和黑名单文件与脚本放在同一目录,或使用绝对路径。
避坑指南与高频问题
Q:执行后自己 SSH 掉线怎么办?
A: 如果你把当前 SSH 连接的 IP 放入了黑名单,或者设置默认策略为 DROP 但没有先加入白名单,就会断连。建议先在本地用 iptables -L INPUT -n 查看当前规则,确认白名单包含你的 IP。或者在脚本开头加入 iptables -A INPUT -s 你的管理IP -j ACCEPT 保护自己。
Q:脚本执行报错 iptables: No chain/target/match by that name?
A: 通常是 iptables 模块未加载。CentOS 可以执行 systemctl start iptables,Ubuntu 用 iptables-restore < /etc/iptables/rules.v4 初始化。
Q:黑白名单文件中有空行或注释行?
A: 脚本中 [ -z "$ip" ] && continue 可以跳过空行。如果需要跳过 # 开头的注释行,可以改成 [[ $ip == \#* ]] && continue。
效果验证
- 运行脚本:
./ip_acl.sh - 查看生效规则:
iptables -L INPUT -n --line-numbers - 用白名单列表外的 IP 尝试 SSH 或 ping,应该被拒绝;白名单中的 IP 可以正常访问。
- 如果想持久化规则(防止重启丢失),CentOS 执行
service iptables save,Ubuntu 执行netfilter-persistent save。
现在你已经掌握了黑白名单批量配置服务器IP访问权限管控的核心方法。
结合自己的网络环境稍微调整文件路径和策略,就能直接用起来。
遇到其他异常时,多检查 IP 格式和 iptables 状态即可。