最直接命令是sudo iptables -A INPUT -s 192.168.1.100 -j DROP,但需立即保存:Debian/Ubuntu执行sudo iptables-save > /etc/iptables/rules.v4,CentOS 7及更早用sudo service iptables save,否则重启后失效。

iptables 添加单个IP黑名单最直接的命令是什么
直接用 iptables -A INPUT -s 192.168.1.100 -j DROP 就能生效,但这条规则重启后丢失。关键不是“加没加”,而是“加完能不能留得住”。
- 加完必须保存:Debian/Ubuntu 执行
sudo iptables-save > /etc/iptables/rules.v4;CentOS 7 及更早用sudo service iptables save;CentOS 8+ 默认不用 iptables,改用 nftables 或 firewalld - 别漏掉
-A和-I的区别:-A追加到链尾,-I插入链首——如果已有 ACCEPT 规则在前,DROP 被跳过就无效 - 验证是否真生效:
sudo iptables -L INPUT -n --line-numbers看规则位置,再用sudo iptables -L INPUT -n | grep 192.168.1.100确认匹配项存在
firewalld 拒绝某个IP时为什么用 reject 而不是 drop
reject 主动发 RST(TCP)或 ICMP port unreachable(UDP),让客户端立刻知道被拒;drop 是静默丢包,客户端会超时重试,容易误判为网络故障。
- 生产环境建议优先用
reject:比如sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.5" reject' - 若要彻底隐藏服务存在,才选
drop,但需配合--set-target=DROP在自定义 zone 中使用,不能直接在 rich rule 里写drop - 注意:firewalld 的 rich rule 不支持端口粒度的黑名单(如只封某IP的3306),得用
--direct模式:sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -s 192.168.1.100 -p tcp --dport 3306 -j REJECT
多个IP要拉黑,用 hosts.deny 还是防火墙工具
只对 ssh、vsftpd 等支持 libwrap 的服务有效,且优先级低于防火墙——/etc/hosts.allow 里写了 sshd: ALL,/etc/hosts.deny 就完全失效。
- 适用场景极窄:确认目标服务编译时带
--with-libwrap(查ldd $(which sshd) | grep wrap),且你只管 SSH/FTP 类服务 - 语法简单但不可靠:
echo "sshd: 192.168.1.100" | sudo tee -a /etc/hosts.deny,改完立即生效,无需重启 - 真正要封全协议、全端口,必须走 iptables/firewalld/nftables;hosts.deny 是补丁,不是主力
nftables 配置黑名单时最容易错的路径和加载方式
nftables 规则文件位置不统一,硬编码路径会失败;加载时若语法错,整条链清空,可能锁死 SSH 连接。
- 标准路径是
/etc/nftables.conf,但 Ubuntu 22.04+ 默认用/etc/nftables.d/*.conf目录结构,直接改主文件可能被覆盖 - 加规则别手写整个文件:先
sudo nft list chain ip filter input查当前链名,再用sudo nft add rule ip filter input ip saddr 192.168.1.100 drop动态添加 - 持久化要导出:
sudo nft list ruleset > /etc/nftables.conf,然后sudo systemctl enable nftables确保开机加载 - 切记测试阶段加一条
sudo nft add rule ip filter input tcp dport 22 accept在 DROP 前,防自己被踢出


















