Linux服务器过滤IP并不依赖单一文件,真正的修改入口分散在三个层级传统TCP Wrapper的/etc/hosts.allow和/etc/hosts.deny、防火墙iptables或firewalld的规则文件、以及Nginx/Apache等应用配置,大多数生产环境推荐用防火墙,因为它生效最快、粒度最细。
先弄懂linux服务器过滤ip在哪个文件三个层级各有归属
很多新手第一反应是去翻某个配置文件,结果翻遍/etc目录也找不到一个叫ip_filter.conf的文件,这正是Linux设计哲学:过滤IP属于访问控制,职责被拆解到不同子系统,搞清楚这一点,你才能根据场景选对入口。
传统方案:TCP Wrapper的hosts.allow和hosts.deny
早期Linux服务器普遍依赖TCP Wrapper机制,它监听网络服务的连接请求,在真正握手之前做一次访问裁决,这里涉及两个核心文件:
- /etc/hosts.allow:定义允许连接的规则
- /etc/hosts.deny:定义拒绝连接的规则
判断顺序很关键:先匹配allow,再匹配deny。 只要某个IP在allow里出现,即使deny里也写了它,最终结果依然是放行,这种白名单优先的机制容易让人踩坑。
比较典型的写法是:
# /etc/hosts.deny
sshd: 192.168.1.100
ALL: 10.0.0.0/8
第一行禁止192.168.1.100访问SSH服务,第二行拒绝整个10.0.0.0/8网段访问所有受Wrapper管理的服务。
但需要了解的是,TCP Wrapper只对编译时链接了libwrap库的服务生效,现在很多现代服务(比如Nginx、Redis默认编译)已经不再依赖这个库,所以纯靠它已经不够用,行业共识认为,它更适合作为内网环境下的轻量补充,不适合做互联网边界的安全防线。
主力方案:iptables和firewalld的规则存储位置
这是最接近“标准答案”的层级,iptables通过内核netfilter框架工作,过滤能力远强于应用层方案,它的核心配置分两套体系:
iptables-legacy体系直接使用命令动态加载规则,规则保存到/etc/sysconfig/iptables(CentOS 6/7传统路径),修改后执行service iptables save或iptables-save > /etc/sysconfig/iptables永久落地。
firewalld体系(CentOS 7及以上默认)使用XML文件组织规则,核心目录包括:
- /etc/firewalld/zones/:存放自定义区域配置,比如public.xml
- /etc/firewalld/direct.xml:适合习惯iptables语法的迁移场景
- /etc/firewalld/richlang/目录:复杂富规则文件

这两个体系的区别在于,iptables规则重启后默认丢失,必须主动保存;firewalld则天然支持运行时配置和永久配置分离,通过--permanent参数明确写入文件。
应用层补充:Nginx和Apache的反向代理拦截
如果你的服务器前面有Nginx反代,还有一层更精细的控制入口,这类方案和linux服务器禁止ip访问配置方法里常见的防火墙思路不同,它是在HTTP层拒绝请求,连TCP握手都不会到后端。
- Nginx配置文件(通常位于/etc/nginx/conf.d/或/etc/nginx/sites-available/)
- Apache的.htaccess或httpd.conf的Directory段
Nginx里常见写法:
# /etc/nginx/conf.d/block_ip.conf
deny 203.0.113.5;
deny 198.51.100.0/24;
allow all;
将该文件include进server块即可生效,Apache稍显繁琐,需要在
| 控制层级 | 配置文件/入口 | 生效范围 | 适用场景 |
|---|---|---|---|
| TCP Wrapper | /etc/hosts.allow /etc/hosts.deny | 仅支持libwrap的服务 | 内网轻量管控 |
| iptables | /etc/sysconfig/iptables | 整个内核网络栈 | 通用、高并发 |
| firewalld | /etc/firewalld/zones/.xml | 整个内核网络栈 | 新系统首选 |
| Nginx | conf.d下的server配置 | 仅该站点/路径 | 应用层拦截 |
| Apache | httpd.conf/.htaccess | 仅该目录/虚拟主机 | 老牌CMS环境 |
实操:linux服务器禁止指定ip访问配置方法
前面理清了文件位置,接下来直接上手操作,我们按不同场景拆解,每段都给出可直接执行的命令。
用iptables封禁单个IP的完整流程
假设你要封禁来自103.27.12.8的恶意扫描,标准的操作顺序是:
# 查看当前过滤链
iptables -L INPUT -n --line-numbers
# 封禁单个IP(直接丢弃数据包)
iptables -A INPUT -s 103.27.12.8 -j DROP
# 封禁整个网段
iptables -A INPUT -s 103.27.12.0/24 -j DROP
# 保存规则到文件(CentOS 6/7)
service iptables save
# 或者手动导出
iptables-save > /etc/sysconfig/iptables
需要理解的细节是,-A表示追加到链末尾,-I表示插入到链最前面,如果服务器有大量规则,追加规则可能被前面的ACCEPT规则匹配放行,这时候必须用

-I INPUT 1把DROP规则插到首位。
很多场景只需要屏蔽某个端口,例如只封禁来自该IP的SSH连接:
iptables -A INPUT -s 103.27.12.8 -p tcp --dport 22 -j DROP
这种精准限制比全IP封禁更合理,避免误伤合法流量,遇到DDoS攻击时,建议同时结合limit模块做并发连接数限制,单纯DROP已不足以应对流量型攻击。
firewalld下的IP黑名单管理
CentOS 8/9、Rocky Linux、AlmaLinux默认都走firewalld,它的设计理念是用“区域”区分信任级别,public区域对应大多数互联网场景。
# 封禁单个IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.9" drop'
# 重新加载配置
firewall-cmd --reload
# 查看当前拦截规则
firewall-cmd --list-all
firewalld的rich rule语法比iptables复杂,但胜在语义清晰,如果你更习惯iptables风格的直通规则,还可以用:
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -s 203.0.113.9 -j DROP
这两者的保存逻辑有实质差异:不加–permanent的规则实时生效但重启失效;加了–permanent则需要reload才激活,多数运维事故都源于忘加–permanent导致重启后规则丢失。
Nginx层屏蔽恶意IP的进阶写法
Nginx过滤IP的应用场景通常配合日志分析,比如从access.log发现某个IP频繁请求wp-login.php,就能精准拦截:
# 在http块内定义
geo $bad_ip {
default 0;
203.0.113.10 1;
198.51.100.0/24 1;
}
server {
if ($bad_ip) {
return 444;
}
}
返回444是Nginx特有的“断开连接”状态码,客户端看到的不是403错误页,而是连接被直接切断,恶意请求方更难以判断服务端策略。
如果你的Nginx版本支持map模块,还能把拦截逻辑做得更细,比如根据UA标识动态切换。
封禁IP前的三个诊断步骤
乱封IP容易伤及无辜,比如共享出口IP的企业用户,或者某些CDN节点IP,封禁后可能直接流失正常访问,所以在执行任何linux服务器过滤ip动作之前,建议先做几项基础功课:
确认来源IP的真实性
用last命令查登录记录,用ss -tnp查看当前活跃连接来源,如果大量连接来自境外动态IP段,基本可以确认是扫描行为,如果IP出现在搜索引擎蜘蛛网段(可通过官方反查确认),就绝不能封。
用fail2ban实现自动化封禁
手动封IP的问题在于你不可能24小时盯着日志,fail2ban通过监控日志文件中的登录失败记录,自动调用iptables或firewalld动态封禁,是目前业内应用最广的自动防护工具,它的核心配置在

/etc/fail2ban/jail.local,可以针对SSH、nginx、postfix等不同服务设置独立规则:
[sshd]
enabled = true
port = 22
maxretry = 3
bantime = 3600
设置完成后执行systemctl restart fail2ban,它会自动把频繁尝试登录的IP加入防火墙黑名单,还能在指定时间后自动解封。
定期审计过滤规则
规则太多时,维护成本比攻击本身还高,建议每月跑一次:
iptables -L -n --line-numbers
看看有没有过期的临时封禁可以清理,扛不住的时候直接用iptables -F清空所有规则重新来过,但在执行之前务必确认服务器有物理访问渠道,否则清错规则可能导致远程连接直接断开。
常见问题快速定位
问:Linux服务器过滤IP在哪个文件最可靠?
多数场景下iptables的规则文件(/etc/sysconfig/iptables)和firewalld的zone配置(/etc/firewalld/zones/public.xml)是最可靠的选择,前者兼容所有Linux发行版,后者是RHEL系新系统的默认标准。
问:为什么我改了hosts.deny但IP还是能访问?
大概率原因是对应服务没有链接libwrap库,用ldd $(which sshd)命令查看是否输出libwrap.so.0,如果没有,说明该服务根本不读取hosts.deny,需要改用防火墙或应用层方案,这也是TCP Wrapper逐渐被淘汰的核心原因。
问:封IP后网站变慢了,是规则写错了吗?
封IP本身不会导致性能下降,但如果规则顺序不合理,每个连接都要遍历大量规则才会命中,确实会产生微小的性能损耗,建议把命中率最高的规则放在链最前面,减少匹配次数,另一个原因可能是误封了CDN节点,导致回源链路异常,检查一下封禁列表里是否有云厂商的IP段。
回到最初的问题,linux服务器过滤ip在哪个文件答案取决于你的控制层级,如果只想快速见效,用iptables一条命令就能解决问题;如果追求策略的长期可维护性,firewalld的富规则功能更值得投入学习,最合理的做法是把防火墙作为基础防线,fail2ban作为动态补充,应用层拦截处理特殊场景,三者组合下来,绝大多数IP滥用问题都能在无需人工干预的情况下解决,最后提醒一句,所有规则改动后务必备份现有配置,这是Linux运维里永远不会过时的安全底线。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/741803.html

