最稳妥、通用且生效快的方式是用iptables在input链添加drop规则,需确认防火墙体系避免失效,立即生效但重启后须保存:debian/ubuntu执行iptables-save > /etc/iptables/rules.v4,centos 6用service iptables save,centos 7+用iptables-save > /etc/sysconfig/iptables,并建议先添加自身ip允许规则防断连。

iptables 在 INPUT 链添加 DROP 规则。但别急着敲命令——先确认你用的是什么防火墙体系,否则规则可能不持久、不生效,甚至把自己锁在外面。
怎么用 iptables 禁止单个IP(最常用场景)
适用于大多数传统 Linux 发行版(CentOS 6/7、Ubuntu 18.04 及更早),规则立即生效,但重启后丢失,必须显式保存。
-
iptables -I INPUT -s 192.168.1.100 -j DROP:用-I插入到最前面,优先级高于其他规则;-A是追加到末尾,容易被前面的ACCEPT规则拦截而失效 - 验证是否写入:
iptables -nL INPUT --line-numbers,看到192.168.1.100对应的DROP行就对了 - 保存规则(关键!否则重启即失效):
– Debian/Ubuntu:iptables-save > /etc/iptables/rules.v4
– CentOS/RHEL 6:service iptables save
– CentOS/RHEL 7+(若仍用 iptables):iptables-save > /etc/sysconfig/iptables - 常见坑:远程操作时,如果没提前放行自己 IP,又误封了网关或本机段,会直接断连。建议先加一条允许自己 IP 的规则:
iptables -I INPUT -s YOUR_IP -j ACCEPT,再封别人
为什么 nftables 替代 iptables 后规则不生效
新版系统(Ubuntu 20.04+、CentOS 8+、AlmaLinux 9)默认启用 nftables,此时 iptables 命令只是兼容层,实际规则走的是 nft 后端。直接运行 iptables -A ... 可能看似成功,但 nft list ruleset 里找不到,或者重启后消失。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 正确做法是直接写
nft规则:nft add rule ip filter input ip saddr 192.168.1.100 drop - 要持久化,必须写入配置文件(如
/etc/nftables.conf),并在ip filter input链中声明,然后执行:nft -f /etc/nftables.conf - 检查是否加载:
nft list chain ip filter input,不是iptables -L - 注意:
nft没有“保存”概念,所有规则靠配置文件驱动,改完不 reload 就不生效
SSH 服务单独限制 IP 的三种写法(不依赖防火墙)
如果你只希望限制 SSH 登录,而不是全端口封禁,有更轻量、更精准的方案,且不干扰其他服务流量。
- 用
/etc/hosts.deny和/etc/hosts.allow(TCP Wrappers):
– 编辑/etc/hosts.deny,加一行:sshd: 192.168.1.100
– 确保/etc/hosts.allow中没有sshd: 192.168.1.100这类允许项(allow优先级高于deny)
– 注意:仅对使用libwrap的服务有效(sshd默认支持,nginx、redis不支持) - 改
/etc/ssh/sshd_config:
– 加DenyUsers *@192.168.1.100(按用户+IP 组合封禁)
– 或加AllowUsers admin@192.168.1.10(白名单模式,更安全)
– 修改后必须systemctl restart sshd,且错误语法会导致 SSH 无法启动 - 配合
fail2ban动态封禁:
– 安装后启用[sshd]jail,它会自动解析/var/log/auth.log,发现多次失败登录就调用iptables或nft封 IP
– 封禁是临时的(默认 10 分钟),适合防爆破,不适合永久拉黑
为什么 nginx 的 deny all 没拦住请求
在 location 块里写 deny 192.168.1.100; deny all; 看似合理,但常因顺序或上下文失效。
-
deny和allow按书写顺序匹配,且只对当前location生效;如果请求命中了别的location(比如location ~ \.php$),这条规则就完全不触发 - 必须确保
deny all;放在所有allow之后,且该location是请求最终落入的块(可用nginx -T查看完整展开配置) - 更可靠的做法是用
geo+if:在http块定义变量,再在server或location中if ($blocked_ip) { return 403; },避免 location 匹配歧义 - 注意:
if在location外使用有风险,Nginx 官方不推荐在server级别大量用if,但用于简单 IP 判断是安全的
iptables 或 nftables 是底层最可靠的手段;但具体选哪一层拦截,得看你的目标服务、系统版本和运维习惯。最容易出问题的不是“怎么封”,而是“封完忘了保存”或“没测试 fallback 路径”。尤其远程操作时,永远先留一条自己的通行规则,再动刀。










