黑白名单批量配置服务器访问权限管控:从零开始的安全加固指南
黑白名单批量配置服务器访问权限管控:从零开始的安全加固指南
作为服务器运维博主,我经常收到读者提问:“怎么让特定IP能登录服务器,其他IP全都拒绝?
”“想批量封一批恶意IP,但一个个手动添加太累了。
”今天这篇教程就围绕黑白名单批量配置服务器访问权限管控展开,我会把概念、准备、操作和排错一次讲清楚,保证零基础也能照着做。
一、先搞清楚黑白名单是什么
白名单:只有名单内的IP(或IP段)允许访问服务器指定端口(比如22、443),其他IP一律拒绝。
黑名单:所有IP都可以正常访问,但名单内的IP被拒绝。
实际场景中,白名单常用于管理后台、SSH登录(只允许公司出口IP访问),黑名单用于拦截已经发现爬虫或攻击源。
本文我会分别演示如何用iptables和fail2ban批量操作,并补充宝塔面板的可视化配置。
二、准备工作:确认系统和工具
执行任何操作前,先登录服务器检查几项基础信息:
- 系统版本:运行
cat /etc/os-release查看,CentOS 7/8、Ubuntu 20.04/22.04 都适用本教程。 - 是否已安装iptables:执行
which iptables,如果没显示路径则运行yum install iptables-services(CentOS)或apt install iptables(Ubuntu)。 - 备份原有规则(非常重要):执行
iptables-save > /root/iptables_backup_$(date +%Y%m%d).bak。 - 当前开放端口:执行
ss -tlnp或netstat -tlnp记下SSH(22)、Web(80/443)等端口号,避免误封。
三、批量配置黑白名单的核心操作
场景一:白名单控制SSH登录
假设公司出口IP为 203.0.113.1 和 203.0.113.2,只允许这两个IP通过SSH连接服务器。
# 1. 清空现有INPUT链规则(谨慎操作,先备份!)
iptables -F INPUT
# 2. 设置默认策略为DROP(拒绝所有入站)
iptables -P INPUT DROP
# 3. 放行本地回环(本机通信必需)
iptables -A INPUT -i lo -j ACCEPT
# 4. 允许已建立的连接继续通信
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 5. 批量添加白名单IP(一行一个)
iptables -A INPUT -s 203.0.113.1/32 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 203.0.113.2/32 -p tcp --dport 22 -j ACCEPT
# 6. 如果还有其他服务(如Web),也要放行对应端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
注意:执行 iptables -P INPUT DROP 后,如果忘记放行自己的IP,当前SSH连接可能被立即断开。强烈建议先在一个screen/tmux会话中操作,并保留一个root SSH窗口作为救急通道。如果误操作,可以用服务器面板的VNC/IPMI重启或清空规则。
一次性批量添加多个IP:可以将IP写入一个文本文件white_ips.txt,每行一个IP,然后用脚本循环执行:
while read ip; do
iptables -A INPUT -s "$ip" -p tcp --dport 22 -j ACCEPT
done < white_ips.txt
持久化规则:CentOS执行 service iptables save(或 iptables-save > /etc/sysconfig/iptables);
Ubuntu安装iptables-persistent并用 netfilter-persistent save。
场景二:黑名单批量封禁IP
假设你从日志里提取了一批恶意IP(bad_ips.txt),想直接封掉所有端口访问:
while read ip; do
iptables -A INPUT -s "$ip" -j DROP
done < bad_ips.txt
如果只想封禁特定服务(比如SSH),加上 -p tcp --dport 22。
场景三:使用fail2ban自动管理黑名单
fail2ban 可以根据登录失败日志动态封禁IP,支持白名单免封。
配合批量导入IP,高效管控。
- 安装:
yum install fail2ban或apt install fail2ban - 配置文件
/etc/fail2ban/jail.local(复制原文件修改):
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
ignoreip = 127.0.0.1/8 203.0.113.1/32 203.0.113.2/32 # 白名单IP,多个用空格分隔
- 重启生效:
systemctl restart fail2ban - 查看封禁列表:
fail2ban-client status sshd - 批量导入已有黑名单:将IP写入
/etc/fail2ban/action.d/iptables.conf相关位置不方便直接导入,建议直接用iptables添加并配合fail2ban使用。
场景四:宝塔面板可视化配置
如果你用的是宝塔面板,操作更直观:
- 进入宝塔后台 → 安全 → 防火墙。
- 在“IP规则”标签页,点击“添加规则”。
- 选择“白名单”或“黑名单”,输入IP或IP段(如
203.0.113.0/24),端口选择“所有端口”或指定端口。 - 批量添加:宝塔支持一次添加多个IP,每个IP用换行分隔。
- 点击“确定”即可生效。
注意:宝塔的防火墙规则重启后可能重置,建议在“系统” → “定时任务”添加一个“重启后执行”的脚本来重新加载规则。
四、避坑指南(新手必看)
- 不要先DROP所有流量再放行:正确顺序是先放行本地回环、已有连接和SSH,最后再设置默认DROP。否则自己会被踢出。
- 规则顺序影响结果:
iptables按顺序匹配,一旦匹配就停止。所以白名单放行规则要放在默认拒绝规则之前。 - 白名单要包含本地IP:
127.0.0.1以及内网IP(如192.168.1.0/24),否则本地服务(如MySQL)可能无法连接。 - fail2ban ignoreip 要填真实白名单:错误格式(如缺少子网掩码)会导致白名单不生效。
- 宝塔面板开启云锁或其他WAF时:IP黑白名单可能冲突,建议统一在一个地方管理。
五、效果验证与常见问题
验证方法
- 用白名单之外的IP尝试SSH登录,应该连接超时或被拒绝。
- 用白名单内的IP尝试登录,应能正常连接。
- 查看iptables规则:
iptables -L INPUT -n -v,计数pkts列可以看该规则被命中次数。 - fail2ban验证:
fail2ban-client status sshd可以查看当前被封IP。
常见问题
Q:我把自己封了怎么办?
A:如果还有根控制台(VNC/IPMI)可登录,执行 iptables -F INPUT && iptables -P INPUT ACCEPT 清空规则。如果没有物理控制台,联系服务器商家重启并进入救援模式。
Q:批量导入失败,iptables报错“Bad argument”
A:检查IP文件是否有多余空格、空行(最后一行不要空行),IPv4地址格式必须正确。
Q:重启后规则丢失?
A:未持久化。CentOS执行 service iptables save,Ubuntu用 iptables-save > /etc/iptables/rules.v4 并启用iptables-persistent。
Q:fail2ban不拦截IP?
A:检查 logpath 是否指向正确的日志文件(如CentOS是 /var/log/secure),并确认 maxretry 和 bantime 值合理。
Q:宝塔面板的IP规则和iptables规则冲突?
A:宝塔会在系统iptables中插入规则,两者会叠加。建议统一在宝塔或纯iptables中管理,避免重复。
总结
通过本文,你已经学会了用iptables手动、用fail2ban自动、以及用宝塔面板可视化的方式,完成黑白名单批量配置服务器访问权限管控。
记住:白名单用于严格管控核心服务,黑名单用于事后拦截。
操作前务必备份,突发情况用VNC救急。
如果遇到本文未覆盖的问题,可以留言或查看站内其他安全相关教程。