要设置一个IP不能访问服务器,最直接的办法是在服务器防火墙或安全组中把该IP加入黑名单,Linux服务器常用iptables或firewalld命令封禁,云服务器则可在控制台安全组中配置拒绝规则。
很多朋友第一次接触服务器管理时,都会遇到某个IP频繁扫描端口、暴力破解密码,或者某个来源的流量异常占用带宽,这时候,把这个IP拉进黑名单就成了最刚需的操作,下面从查IP、封IP、解封IP三个维度,把这件事讲透。
怎么知道是哪个IP在访问服务器
动手封禁之前,先确认目标IP是真实存在的,而不是自己误判,最直观的方法是查看服务器上的访问日志或连接状态。
用Linux命令快速查看当前连接
登录服务器后,执行下面这条命令,可以列出所有正在连接的IP及其状态:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
这条命令会把服务器当前的TCP连接按来源IP归并,并按照连接次数从多到少排列,连接次数最多的那一批IP,就是你需要重点关注的。
如果想看得更细致,可以接着用:
ss -t state established '( dport = :22 or sport = :22 )'
这条命令专门查看SSH端口的连接状态,业内专家指出,大量来自同一IP的SYN_RECV状态连接,通常意味着该IP正在对服务器发起洪水攻击或暴力破解。
查看Web服务器日志定位来源
如果服务器跑着Nginx或Apache,日志里也留着每个来访IP的脚印。
Nginx日志默认路径在/var/log/nginx/access.log,Apache则在/var/log/httpd/access_log,用下面这段命令可以统计出访问量最大的前10个IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
看到某个IP的请求量在短时间内异常飙升,而正常用户不会这样操作,那基本可以锁定目标了。
Linux服务器封禁IP的两种主流方法
确认了IP之后,封禁手段直接决定了安全防护的力度,目前主流的Linux服务器封禁方案是iptables和firewalld,CentOS 7及以上版本默认使用firewalld,但很多运维习惯依然会直接操作iptables。
iptables封禁指定IP
iptables是Linux内核自带的防火墙工具,稳定且高效,封禁单个IP,命令如下:
iptables -A INPUT -s 192.168.1.100 -j DROP
这条命令的含义是:对来自168.1.100的所有流量直接丢弃。-A表示追加规则到INPUT链,-j DROP就是拒绝并丢弃数据包,让客户端表现为“连接超时”而不是“拒绝连接”。
封禁一个IP段则是这样写:
iptables -A INPUT -s 192.168.1.0/24 -j DROP
需要解封某IP时,把-A换成-D即可删除规则:
iptables -D INPUT -s 192.168.1.100 -j DROP
直接执行iptables命令重启后会失效,如果想持久化保存,CentOS 7/8执行:
service iptables save
或使用:
iptables-save > /etc/sysconfig/iptables
该命令会把当前规则覆盖写入配置文件,下次开机自动加载。
firewalld封禁IP及与iptables的对比
firewalld是CentOS 7之后引入的动态防火墙管理工具,最大优势是支持动态更新规则而不中断现有连接,封禁单个IP:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" drop'
这条命令中的--permanent表示写入永久配置,drop表示丢弃该来源的所有流量,执行完后重载防火墙:
firewall-cmd --reload
解封则把add-rich-rule换成remove-rich-rule即可。
firewalld和iptables的核心区别在于管理粒度:iptables直接操作内核netfilter规则,更底层、性能开销更小;firewalld基于区域和服务管理,对普通用户更友好,适合不想记忆复杂参数的新手,实际选型时,如果服务器上已经有复杂的iptables规则,继续用iptables反而更稳妥;如果服务器环境刚初始化,优先用firewalld做日常管理即可。
云服务器安全组的IP黑名单设置
前面讲的防火墙操作,都是针对服务器系统内部的,现在很多业务跑在云服务器上,例如简米云、酷番云和华为云,这些平台都自带一层安全组规则,相当于云环境里的“前置防火墙”,安全组设在服务器系统之外,一旦在安全组里封了IP,这个IP根本连不到服务器网卡,比系统防火墙更彻底。
安全组封禁IP的操作路径
以简米云为例,登录ECS控制台后,按下面步骤操作:
- 找到目标实例,点击“安全组”标签页
- 点击“配置规则”,进入入方向规则列表
- 点击“手动添加”,协议类型选择“全部”,授权对象填写要封禁的IP,例如
2.3.4/32 - 授权策略选择“拒绝访问”
- 保存并等待约1分钟生效
酷番云和华为云的操作路径基本一致,安全组规则支持多条,多条规则同时存在时,拒绝优先级高于允许,这一点确保了黑名单的安全兜底效果。
安全组封禁与iptables封禁的取舍
业务跑在云服务器上时,适用哪种封禁方案取决于防护需求:
- 需要防护DDoS洪水攻击时,依靠安全组在云平台侧丢弃流量,不消耗服务器CPU资源,更合适
- 需要对某个特定端口精准拒绝访问时,在服务器内部用iptables或firewalld操作更灵活
- 需要封禁大量境外恶意IP时,安全组每条规则对应一个IP,数量大时管理成本较高,此时配合脚本定时更新iptables规则反而更高效
多数情况下,生产环境建议两层同时配置:安全组拦住最明显的恶意来源,系统防火墙作为第二道防线。
封禁IP之后要做的事:验证和告警
封禁不是终点,验证和持续监控才是完整闭环。
验证封禁是否生效
封禁操作完成后,最简单的验证方式是在另一台机器上执行:
ping 服务器IP
如果提示超时,说明ICMP协议已被拦截,但如果封禁只是针对特定端口,就需要用telnet或nc来测试,例如检查80端口是否已被拒绝:
nc -zv 服务器IP 80
返回“Connection refused”或超时,即表示该IP已无法访问对应端口。
配置邮件或短信告警
单靠人工盯日志,很难做到及时发现攻击,许多运维面板(宝塔、WDCP)内置了SSH登录告警和防火墙日志监控功能,可在后台设置触发阈值,例如同一IP在1分钟内建立超过20次SSH连接时自动发送警报,对于没有面板的裸系统,用fail2ban这款开源工具也能实现自动封禁和邮件通知。
问答:关于IP封禁的三个高频疑问
设置了Drop规则后,对方会看到什么提示
使用-j DROP时,服务器不返回任何RST包,客户端会一直等待直到超时,表现为“连接超时”,使用-j REJECT时,客户端会立刻收到“拒绝连接”的提示,响应更快,实际防攻击场景中,业内共识认为Drop更安全,因为攻击者无法通过返回包判断服务器是否在线。
IP封禁后,自己也无法访问服务器,是什么原因
最常见的原因是封禁时将服务器当前的出口IP也纳入了规则,例如所在办公网络为动态IP,重启路由器后IP变化,导致把自己误封,另一种情况是安全组规则配置了“拒绝所有来源”,而没有在更高优先级允许自己的IP,封禁前一定要先通过ip addr确认当前登录SSH的客户端IP,并确保白名单优先级高于黑名单。
宝塔面板如何禁止一个IP访问服务器
宝塔面板有独立的防火墙插件,登录面板后台,点击左侧菜单欄的“安全”选项,找到防火墙页面,在“IP规则”输入框里填入目标IP,选择“拒绝”后提交,该操作会同步写入系统防火墙规则,和命令行执行的效果一致,适用于不熟悉Linux命令、偏好可视化操作的用户。
从确认攻击来源到执行封禁,再到验证效果,整个流程实际上不到十分钟就能走完,但服务器安全不是一次性工作,建议每隔一段时间回头查看防火墙规则列表,及时清理不需要的封禁条目,避免误封积累到影响正常业务,设置IP黑名单的原则始终一致:先确认、再封禁、后验证。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/788707.html


