菜鸟科技网

如何彻底禁止IP访问服务器?

禁止IP访问服务器是保障服务器安全的重要措施之一,尤其当某个IP存在恶意行为(如暴力破解、DDoS攻击、异常爬取等)时,及时封禁可降低安全风险,以下从技术实现、不同场景操作步骤及注意事项等方面详细说明如何禁止IP访问服务器。

如何彻底禁止IP访问服务器?-图1
(图片来源网络,侵删)

禁止IP访问的核心技术原理

禁止IP访问的本质是在服务器的网络入口或应用层设置访问控制规则,通过匹配源IP地址与预设的黑名单列表,拦截符合条件的请求,具体实现可通过系统级防火墙、Web服务器配置、反向代理或安全设备(如WAF)完成,不同技术方案的拦截范围和深度有所差异。

基于Linux系统防火墙的禁止方法

Linux系统自带防火墙工具(如iptables、firewalld),通过配置规则可直接拦截特定IP的访问,适用于整个服务器的通用封禁场景。

使用iptables(适用于CentOS 6/7、传统Linux系统)

iptables是Linux内核级的防火墙,通过添加DROP或REJECT规则实现IP拦截。

  • 临时封禁(重启后失效)

    如何彻底禁止IP访问服务器?-图2
    (图片来源网络,侵删)
    # 封禁单个IP
    iptables -I INPUT -s 192.168.1.100 -j DROP
    # 封禁IP段(如192.168.1.0/24网段)
    iptables -I INPUT -s 192.168.1.0/24 -j DROP

    参数说明:-I INPUT表示插入到规则链的头部,-s指定源IP,-j DROP直接丢弃数据包(REJECT会返回拒绝信息)。

  • 永久封禁(需保存规则)

    # 保存规则(CentOS 7使用iptables-service)
    service iptables save
    # 或CentOS 7+使用iptables-persistent
    netfilter-persistent save

使用firewalld(适用于CentOS 7+、RHEL 7+、Fedora)

firewalld支持动态管理规则,无需重启服务即可生效,适合频繁调整策略的场景。

  • 添加富规则(Rich Rules)
    # 封禁单个IP
    firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" drop'
    # 封禁IP段
    firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" drop'
    # 重新加载防火墙使规则生效
    firewall-cmd --reload

    参数说明:--permanent表示规则永久生效(需重载),若临时生效可省略该参数。

    如何彻底禁止IP访问服务器?-图3
    (图片来源网络,侵删)

操作对比(iptables vs firewalld)

工具 适用系统 规则生效方式 管理复杂度 动态更新
iptables 传统Linux(CentOS 6/7) 需保存配置文件(如/etc/sysconfig/iptables 较高 不支持(需重启服务)
firewalld 新版Linux(CentOS 7+/RHEL 7+) 支持动态重载(firewall-cmd --reload 较低 支持

基于Web服务器的禁止方法

若仅需禁止IP访问特定网站(如Nginx、Apache配置的虚拟主机),可在Web服务器层面配置,避免影响其他服务。

Nginx配置

在Nginx的配置文件(如nginx.conf或站点配置文件)的serverhttp段中添加以下规则:

server {
    listen 80;
    server_name example.com;
    # 封禁单个IP
    deny 192.168.1.100;
    # 封禁IP段
    deny 192.168.1.0/24;
    # 允许其他IP(若需限制仅允许特定IP,可替换为allow)
    allow all;
}

注意事项

  • denyallow规则按顺序匹配,一旦命中即停止,因此需将deny规则放在allow之前(若需白名单模式)。
  • 修改配置后需执行nginx -t检查语法并nginx -s reload重载配置。

Apache配置

在Apache的虚拟主机配置文件或.htaccess文件中,通过Require all deniedRequire not ip实现:

<Directory "/var/www/html">
    # 封禁单个IP
    Require not ip 192.168.1.100
    # 封禁IP段
    Require not ip 192.168.1.0/24
    # 允许所有IP(若需白名单,可改为Require ip all)
    Require all granted
</Directory>

注意事项

  • 需确保Apache配置了AllowOverride All(若使用.htaccess)。
  • 修改后执行systemctl reload apache2(Ubuntu/Debian)或systemctl reload httpd(CentOS/RHEL)生效。

Web服务器配置对比

服务器 配置指令 生效范围 是否支持动态重载
Nginx deny/allow 当前虚拟主机或目录 支持(需重载)
Apache Require not ip/Require ip 当前虚拟主机或目录 支持(需重载)

基于反向代理或WAF的禁止方法

若服务器通过Nginx反向代理、CDN或WAF(如ModSecurity、阿里云WAF)接入,可在代理层或云端配置IP黑名单,实现更灵活的拦截。

Nginx作为反向代理

在Nginx的locationserver段中添加deny指令,或在http段定义共享黑名单:

# 定义共享黑名单(可在多虚拟主机复用)
http {
    # 黑名单文件路径(每行一个IP或IP段)
    geo $block_ip {
        default 0;
        192.168.1.100 1;
        192.168.1.0/24 1;
    }
    server {
        location / {
            # 若IP在黑名单中,返回403错误
            if ($block_ip) {
                return 403;
            }
            proxy_pass http://backend;
        }
    }
}

WAF/云安全服务

  • ModSecurity(WAF):通过规则集拦截特定IP:
    SecRule REMOTE_ADDR "192.168.1.100" "id:1001,phase:1,deny,status:403"
  • 阿里云WAF:在“访问控制”策略中添加IP黑名单,支持精准IP和IP段,并设置拦截动作(如拦截、观察模式)。
  • 腾讯云云防火墙:在“访问控制”中配置“黑名单IP”,可针对端口、协议进行精细化拦截。

自动化脚本与日志监控

为提升效率,可通过结合日志分析与自动化脚本实现动态IP封禁,使用fail2ban工具监控登录日志(如SSH、Web登录失败),自动触发防火墙规则封禁恶意IP。

fail2ban配置示例(以SSH防暴力破解为例)

  1. 安装fail2ban:
    apt install fail2ban(Ubuntu/Debian)
    yum install fail2ban(CentOS/RHEL)
  2. 创建配置文件/etc/fail2ban/jail.local
    [sshd]
    enabled = true
    port = 22
    filter = sshd
    logpath = /var/log/auth.log
    maxretry = 3
    bantime = 3600  # 封禁1小时
    findtime = 600  # 10分钟内失败3次触发封禁
  3. 启动fail2ban:
    systemctl start fail2ban
    systemctl enable fail2ban

注意事项

  1. 误封风险:封禁前需确认IP归属,可通过whois查询或IP地理位置工具(如ipinfo.io)验证,避免误封正常用户。
  2. 规则优先级:防火墙规则按顺序匹配,高优先级规则(如iptables的-I插入头部)应放在黑名单规则前,避免覆盖重要策略。
  3. 日志备份:定期备份防火墙和Web服务器日志,便于事后追溯和分析攻击行为。
  4. 多层级防护:建议结合系统防火墙、Web服务器配置和WAF实现多层级拦截,避免单一规则失效导致风险。

相关问答FAQs

Q1:如何查看当前服务器是否已封禁某个IP?
A:可通过以下命令检查:

  • iptablesiptables -L -n | grep 192.168.1.100-n避免域名解析)
  • firewalldfirewall-cmd --list-rich-rules | grep 192.168.1.100
  • Nginxnginx -T 2>/dev/null | grep -A5 -B5 "deny 192.168.1.100"
  • Apachegrep -r "Require not ip 192.168.1.100" /etc/apache2/

Q2:封禁IP后如何解封?需要重启服务吗?
A:解封方法取决于封禁工具:

  • iptables
    iptables -D INPUT -s 192.168.1.100 -j DROP  # 删除规则
    service iptables save  # 永久规则需保存
  • firewalld
    firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" drop'
    firewall-cmd --reload  # 重载生效
  • Nginx/Apache:直接删除配置中的denyRequire not ip指令,重载服务即可,无需重启。
  • fail2banfail2ban-client set sshd unbanip 192.168.1.100
    大部分工具解封后无需重启服务,仅firewalld和iptables的永久规则需保存或重载。
分享:
扫描分享到社交APP
上一篇
下一篇