在运维工作中,我们经常会遇到服务器被恶意扫描、DDoS攻击或者是某个IP频繁尝试暴力破解密码的情况,为了保障服务器的安全,最直接有效的方法之一就是封禁(禁止)该IP的访问权限。
在Linux系统中,实现禁止一个IP访问的方法有很多,通常取决于你使用的防火墙工具(如iptables、firewalld)以及服务类型(如Web服务、SSH服务等),本文将详细介绍几种常用的方法,帮助你快速屏蔽恶意IP。
使用 iptables(传统且通用)
iptables 是Linux内核中著名的包过滤防火墙工具,几乎适用于所有Linux发行版,它是底层防御的第一道防线。

添加禁止规则
假设我们要禁止的IP地址是 168.1.100,请在终端执行以下命令:
iptables -A INPUT -s 192.168.1.100 -j DROP
命令解析:
-A INPUT:表示在INPUT链(进入服务器的数据包)的末尾添加一条规则。-s 192.168.1.100:指定源IP地址为168.1.100。-j DROP:如果数据包匹配该规则,直接丢弃数据包,不发送任何回复。
查看规则是否生效
你可以使用 -L 参数查看当前的防火墙规则列表:
iptables -L -n
在输出结果中,你应该能看到类似 DROP 的动作出现在该IP对应的行。
持久化保存 如果服务器重启,上述规则可能会丢失,为了永久生效,你需要保存规则(具体命令取决于你的系统版本):
-
CentOS 6/旧版系统:
service iptables save
-
CentOS 7/8/9 或 Ubuntu/Debian: 通常使用
iptables-persistent或netfilter-persistent:# Ubuntu/Debian apt-get install iptables-persistent netfilter-persistent save # CentOS/RHEL yum install iptables-services service iptables save
删除规则
如果需要解封该IP,使用 -D 参数(删除):
iptables -D INPUT -s 192.168.1.100 -j DROP
使用 firewalld(现代RHEL/CentOS默认)
如果你使用的是CentOS 7、8或9,系统默认使用的是 firewalld,相比iptables,它更易于管理区域和端口。
添加直接规则
firewalld 禁止特定IP通常使用 --direct 参数来添加内核级的过滤规则:
firewall-cmd --permanent --direct --add-rule=ipv4 filter INPUT 0 -s 192.168.1.100 -j DROP
命令解析:
--permanent:表示永久生效,重启后依然有效。--direct:直接向内核传递规则。ipv4 filter INPUT 0:指定协议为IPv4,操作在INPUT链,优先级为0。
重新加载防火墙 添加规则后,必须执行重新加载命令才能立即生效:
firewall-cmd --reload
查看规则
firewall-cmd --direct --get-rules ipv4 filter INPUT
针对Web服务(Nginx/Apache)禁止IP
如果你的服务器主要运行Web服务(如Nginx或Apache),且恶意流量主要来自Web层,直接在Web服务器配置中禁止IP往往更精准,且不会影响SSH等底层连接。
Nginx 禁止IP访问 编辑Nginx配置文件(通常在 `/etc/nginx/nginx.conf

