服务器访问控制黑白名单设置零基础教程
为什么要设置黑白名单?
服务器每天会收到大量访问请求,其中混杂着扫描器、爬虫、暴力破解工具等恶意流量。黑白名单就是最直接的访问控制手段:白名单只允许指定IP通过,黑名单则禁止特定IP进入。
掌握这个技能,能让你的服务器安全系数提升一大截。
本文会从零开始,给你三条清晰的路径:
- 用 Nginx 配置(适合 Web 站点)
- 用 iptables 配置(系统级防火墙)
- 用宝塔面板操作(图形化,新手友好)
你可以根据自己环境任选一条执行。
开始前需要准备的几样东西
- 一台服务器(Windows 或 Linux 均可,本文以 CentOS 7 / Ubuntu 20.04 为例)
- SSH 客户端(如果你用宝塔面板,则不需要)
- 知道自己服务器的公网 IP(可以用
curl ifconfig.me快速查看) - 决定好要封禁或放行的 IP 地址(例如要封锁的 IP:
192.168.1.100,要放行的 IP:203.0.113.5)
注意:操作前建议先通过快照或备份保留当前状态,防止误操作导致自己被封在外。
方法一:用 Nginx 配置黑白名单(适合站点级控制)
如果你运行的是 Web 服务,Nginx 自带 allow 和 deny 指令,修改配置文件即可生效。
1. 找到站点配置文件
通常路径:
- 宝塔面板:
/www/server/panel/vhost/nginx/你的域名.conf - 手动安装:
/etc/nginx/conf.d/你的域名.conf或/etc/nginx/nginx.conf
2. 在 server 块内加入规则
例如只允许公司 IP 访问后台目录 /admin,其他 IP 全部拒绝:
server {
listen 80;
server_name example.com;
location /admin {
allow 203.0.113.5; # 白名单IP
deny all; # 拒绝其余所有
# 其他配置...
}
}
如果你想要全局黑名单,可以在 server 块或 location / 里面写:
server {
deny 192.168.1.100; # 禁止某个IP
allow all; # 放行其他(这一行通常可以省略,因为默认就是放行)
}
关键点:allow 和 deny 按顺序匹配,先匹配到的规则生效。
一般推荐先写白名单,最后写 deny all。
3. 测试配置并重载
nginx -t # 检查语法
systemctl reload nginx # 热重载,不中断服务
验证:用禁止的 IP 访问,应该返回 403 Forbidden。
方法二:用 iptables 配置系统级黑白名单
iptables 是 Linux 自带的防火墙工具,能控制所有进入服务器的流量(不限 Web)。
如果你熟悉命令行,这是最强大的方案。
1. 查看现有规则
iptables -L -n --line-numbers
2. 添加黑名单规则(拒绝某个 IP 所有流量)
iptables -A INPUT -s 192.168.1.100 -j DROP
-A INPUT:追加到 INPUT 链(入站)-s 192.168.1.100:指定源 IP-j DROP:丢弃数据包(相当于拒绝)
3. 添加白名单规则(只允许某个 IP 访问 SSH)
iptables -A INPUT -s 203.0.113.5 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP # 拒绝其他所有 IP 的22端口
注意:白名单规则必须放在拒绝规则之前,否则拒绝先匹配就进不来了。你可以用 -I INPUT 1 插入到第一行。
4. 保存规则(避免重启丢失)
CentOS 7:
yum install -y iptables-services
service iptables save
Ubuntu 20.04:
iptables-save > /etc/iptables/rules.v4
方法三:用宝塔面板可视化配置(零基础首选)
如果你安装了宝塔面板,点击左侧“安全”菜单,操作非常直观。
1. 进入防火墙管理
在宝塔面板左侧找到 安全 → 防火墙。
2. 添加IP规则
- 点击 添加IP规则
- 选择 黑名单 或 白名单
- 输入 IP 地址(例如
192.168.1.100) - 备注可写可不写
- 点击 确定
3. 生效验证
规则添加后立刻生效。
你可以在 规则列表 中看到刚添加的条目。
如果填错了,直接删除即可。
宝塔的防火墙本质上是基于 firewalld 或 iptables 的界面封装,所以效果和命令行一致。
高频踩坑与避坑指南
1. 不小心把自己 IP 封了怎么办?
- 如果你还有其它渠道(比如面板的VNC、云商的带外管理),赶紧登录并删除规则。
- 如果使用命令行,可以执行
iptables -F清空所有规则(但会同时放行所有流量,需重新配置)。 - 防止方式:添加规则前先把自己的 IP 加入白名单,或者先用
-j REJECT而不是-j DROP,因为 REJECT 会更礼貌地告诉你被拒绝了。
2. Nginx 的 allow/deny 规则对非 Web 请求无效
Nginx 只处理 HTTP/S 流量。
如果你想封锁SSH、数据库等端口,请使用 iptables 或宝塔防火墙。
3. 规则顺序很重要
无论是 Nginx 还是 iptables,都是按顺序匹配。
白名单规则一定要出现在黑名单规则之前。
4. 宝塔面板的防火墙和系统防火墙可能冲突
如果你在宝塔添加了规则,同时又用命令行添加了 iptables 规则,宝塔可能会覆盖你的设置。
建议只使用其中一种方法管理。
如何验证配置已经生效
用 curl 模拟
# 在另一台服务器(或者本地)用被封的 IP 访问你的站点
curl -I http://你的服务器IP
如果返回 403 或连接超时(取决于你用的是 DROP 还是 DENY),说明封锁成功。
查看日志
- Nginx 错误日志:
tail -f /var/log/nginx/error.log,会看到access forbidden by rule或类似的记录。 - iptables 日志:如果你开启了日志(
-j LOG),可以在/var/log/messages或dmesg中查看被拒绝的连接。
使用在线端口检测工具
可以用站长工具或 ping.pe 输入你的服务器 IP,如果从某个 IP 无法访问,说明规则生效。
总结
服务器访问控制黑白名单设置并不复杂,关键是要清楚自己的业务需求:
- 保护站点后台 → 用 Nginx 的 allow/deny
- 封锁恶意 IP 对所有端口的攻击 → 用 iptables 或宝塔防火墙
- 新手怕出错 → 先用宝塔面板练手,规则生效后立即用浏览器验证自己的 IP 是否还能访问。
建议你按照本文步骤先在测试环境走一遍,再应用到生产环境。
如果遇到异常,优先回看上面的“高频踩坑”部分,基本能解决 90% 的问题。