Linux iptables封禁IP地址教程

作者:技术拾光

时间:2026-07-18

浏览:340

使用iptables封禁IP需注意:添加-s源地址和-jDROP,规则顺序正确;封网段用CIDR斜杠格式;删除规则通过行号;重启后规则消失需持久化保存;规则过多时改用ipset提升性能。

文章目录

在使用 iptables 封禁 IP 地址时,许多用户容易忽略细节导致规则失效或误封。正确执行 iptables 封 IP 命令,需要关注规则顺序、参数格式、持久化保存等关键环节。以下逐一说明。

Linux iptables封禁IP地址教程

iptables 封 IP 必须加 -s 和 -j DROP,顺序不能错

执行 iptables -A INPUT -s 192.168.1.100 -j DROP 即可生效,但常见错误是遗漏 -s(源地址)或误写为 -d(目标地址),导致规则不匹配。此外,-j DROP 不应随意替换为 -j REJECT——前者静默丢弃数据包,后者会发送 RST 包,某些扫描器可能将其误判为“端口开放”并继续试探。

常见错误现象:

  • 执行命令无报错,但目标 IP 仍能连接 SSH:通常因忘记 -s 或链名错误(例如使用了 OUTPUT 而非 INPUT)。
  • 封禁后自身也无法连接:规则插入位置过于靠前,拦截了本机回环或已建立连接。建议在 ESTABLISHED 规则之后添加封禁规则。

封单个 IP 和封网段用法不同,/24 不等于“最后一位改成0”

封单个 IP 使用 iptables -I INPUT -s 203.0.113.45 -j DROP;封网段必须采用 CIDR 表示法,例如封整个 C 段应写 203.0.113.0/24,而非 203.0.113.* 或 203.0.113.0/255.255.255.0——iptables 仅识别斜杠格式。

参数差异:

  • /24 覆盖 256 个地址(0–255)。
  • /16 覆盖 65536 个地址(如 192.168.0.0/16)。
  • 不建议使用 /32 封单个 IP,虽语法合法但语义冗余,直接写 IP 更清晰。

规则删不掉?先看行号,再用 -D + 编号,别硬记完整规则

执行 iptables -L INPUT -n --line-numbers,输出第一列即为规则编号。要删除第 3 条规则,直接使用 iptables -D INPUT 3。若使用 -D 加完整规则(如 iptables -D INPUT -s 203.0.113.45 -j DROP),必须确保参数顺序、空格、大小写与原始添加时完全一致——多一个空格也会导致失败。

容易踩的坑:

  • 误删其他规则:编号会随增删动态变化,删除前务必重新执行 --line-numbers 确认。
  • 删除后未生效:规则仍在内存中,但未保存,重启后恢复——这不是删除失败,而是忘了持久化。

重启后规则消失?不同系统保存方式完全不同

Debian/Ubuntu 需安装 iptables-persistent,保存命令为 iptables-save > /etc/iptables/rules.v4;CentOS 7 使用 service iptables save;CentOS 8+ 默认不含 iptables 服务,需安装 iptables-services 或切换至 nftables。

性能影响:

  • 规则越多,匹配越慢,超过 50 条建议改用 ipset(尤其需封禁数百个零散 IP 时)。
  • 避免在 FORWARD 链随意添加 DROP 规则——除非机器作为路由器,否则通常无需操作该链。

实际操作中,最常被忽略的是规则加载顺序和持久化机制。封禁 IP 看似一行命令,但生效依赖于链位置、保存动作以及是否与其他规则冲突——仅添加一条 DROP 规则远远不够。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›