下面我将从“为什么”“如何做”以及“高级技巧”三个方面,详细讲解如何在不同服务器环境中实现禁止IP访问。

服务器禁止ip访问网站
(图片来源网络,侵删)

为什么禁止IP访问网站?

在开始操作前,理解其背后的原因非常重要,这有助于你判断是否真的需要这样做。

  1. 隐藏服务器信息:直接通过IP访问,可能会暴露服务器的操作系统、Web软件(如Nginx/Apache)版本信息,甚至可以通过目录列表看到网站文件结构,这为攻击者提供了便利。
  2. 重复:搜索引擎可能会将你的 http://IP地址http://域名 视为两个不同的网站,导致内容重复,影响SEO排名,禁止IP访问可以确保搜索引擎只收录你的域名。
  3. 规范访问入口:强制用户通过你指定的域名访问,提供统一的品牌体验和正确的SSL证书(如果IP没有绑定证书,访问时会提示不安全)。
  4. 防止恶意扫描:一些自动化工具会直接扫描IP地址上的80/443端口,禁止IP访问可以有效减少这类无意义的扫描和攻击。
  5. 避免配置错误:如果服务器上有多个网站,直接通过IP访问可能会指向一个默认的、不正确的网站,造成用户困惑。

如何禁止IP访问(分步指南)

主要有两种方法:使用Web服务器配置文件使用防火墙通常推荐使用Web服务器配置,因为它更精确,可以返回一个自定义的页面或错误代码。

使用 Nginx 配置(推荐)

Nginx是目前非常流行的Web服务器,配置相对简单。

  1. 找到配置文件 通常位于 /etc/nginx/nginx.conf/etc/nginx/sites-available/ 目录下的站点配置文件中(default)。

    服务器禁止ip访问网站
    (图片来源网络,侵删)
  2. 编辑配置http 块中,或者在你要禁用的 server 块之前,添加一个专门用于处理IP访问的 server 块,这个块需要放在所有其他 server 块的最前面,因为它会根据IP地址进行匹配。

    # 在 http 块的开头添加以下配置
    server {
        listen 80 default_server;  # 监听所有80端口的请求
        listen [::]:80 default_server; # 监听所有IPv6的80端口请求
        # 你可以返回一个自定义的页面
        # return 403 "Access Denied by IP. Please use the domain name.";
        # 或者返回一个自定义的错误页面(需要先创建好这个页面)
        # return 403 http://your-domain.com/forbidden.html;
        # 最佳实践:返回一个444状态码,这是Nginx特有的,表示无响应,连接会立即关闭。
        # 这能有效阻止扫描工具和恶意访问。
        return 444;
    }
    # 接下来是你的正常网站配置
    server {
        listen 80;
        server_name your-domain.com www.your-domain.com;
        # ... 其他配置 ...
        root /var/www/your-domain.com;
        index index.html;
    }
  3. 检查并重载Nginx 保存文件后,检查配置语法是否正确,然后重载Nginx使配置生效。

    # 检查语法
    sudo nginx -t
    # 如果显示 syntax is ok 和 test is successful,则重载
    sudo systemctl reload nginx

当用户直接通过IP地址访问你的服务器时,将会收到一个空响应(444)或你指定的错误信息。

使用 Apache 配置

Apache的配置与Nginx类似,也需要添加一个虚拟主机来捕获所有IP请求。

服务器禁止ip访问网站
(图片来源网络,侵删)
  1. 找到配置文件 通常位于 /etc/apache2/sites-available/000-default.conf/etc/apache2/apache2.conf

  2. 编辑配置 在配置文件的开头,添加一个 <VirtualHost> 块,用于捕获所有IP的请求,同样,这个块需要放在其他虚拟主机配置的最前面

    # 在文件开头添加以下配置
    <VirtualHost *:80>
        # ServerAdmin webmaster@localhost
        # DocumentRoot /var/www/html
        # 捕获所有指向IP的请求
        ServerName _ # 这是一个通配符
        ServerAlias _ # 也是一个通配符
        # 返回403 Forbidden错误
        # 可以指向一个自定义的错误页面
        # ErrorDocument 403 /forbidden.html
        # 自定义错误日志(可选)
        # CustomLog ${APACHE_LOG_DIR}/ip_access.log combined
        # 设置一个空的DocumentRoot,防止Apache提供默认页面
        <Directory />
            Require all denied
        </Directory>
    </VirtualHost>
    # 你的正常网站配置
    <VirtualHost *:80>
        ServerName your-domain.com
        ServerAlias www.your-domain.com
        DocumentRoot /var/www/your-domain.com
        # ... 其他配置 ...
    </VirtualHost>
  3. 检查并重启Apache 保存文件后,检查配置语法并重启Apache。

    # 检查语法
    sudo apache2ctl configtest
    # 如果显示 Syntax OK,则重启
    sudo systemctl restart apache2

使用操作系统防火墙(iptables/firewalld)

这种方法比较“粗暴”,它会直接阻止所有对80/443端口的访问,包括你的域名。此方法只在你确定所有流量都通过代理(如Cloudflare)时才推荐使用。

使用 iptables (Debian/Ubuntu老版本或CentOS):

# 禁止所有80端口的访问
sudo iptables -A INPUT -p tcp --dport 80 -j DROP
# 禁止所有443端口的访问
sudo iptables -A INPUT -p tcp --dport 443 -j DROP
# 保存规则 (Debian/Ubuntu)
sudo iptables-save > /etc/iptables/rules.v4

使用 firewalld (CentOS 7+/RHEL/Fedora):

# 添加一个富规则,禁止所有80/443端口访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source not address="127.0.0.1" port protocol="tcp" port="80" reject'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source not address="127.0.0.1" port protocol="tcp" port="443" reject'
# 重载防火墙
sudo firewall-cmd --reload

警告:直接在服务器上禁止80/443端口后,你自己也无法通过IP访问网站进行调试了,请谨慎使用。


高级技巧与注意事项

  1. 处理HTTPS(443端口) 上述Nginx/Apache配置默认只处理80端口,如果你也希望通过IP禁止HTTPS访问,需要在配置中增加对 443 端口的监听。

    # Nginx 示例
    server {
        listen 80 default_server;
        listen 443 default_server; # 增加这一行
        listen [::]:80 default_server;
        listen [::]:443 default_server; # 增加这一行
        # SSL证书配置对于IP访问通常是无效的,所以这里不需要
        # ssl_certificate ...;
        # ssl_certificate_key ...;
        return 444;
    }
  2. 允许特定IP访问 如果你希望禁止所有IP,但允许自己或特定管理IP访问,可以在配置中添加 allowdeny 指令。

    # Nginx 示例
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        # 允许你的公网IP访问
        allow 123.45.67.89;
        # 允许本地回环地址
        allow 127.0.0.1;
        # 允许内网IP
        allow 192.168.1.0/24;
        # 拒绝所有其他IP
        deny all;
        return 444;
    }
  3. CDN/代理环境 如果你使用了Cloudflare等CDN服务,用户的真实IP对你来说是不可见的,他们看到的都是CDN的IP地址,在这种情况下,禁止IP访问的意义不大,因为所有请求都来自CDN节点,你的重点应该是正确配置Nginx,使其信任 X-Forwarded-For 头部,并基于域名进行路由。

  4. 测试 配置完成后,务必使用 curl 命令进行测试,确保效果符合预期。

    # 测试IP访问
    curl -I http://[你的服务器IP地址]
    # 预期输出(如果配置了444,可能看不到任何输出)
    # HTTP/1.1 403 Forbidden
    # 或
    # (无响应)
    # 测试域名访问
    curl -I http://your-domain.com
    # 预期输出
    # HTTP/1.1 200 OK
方法 优点 缺点 适用场景
Nginx/Apache配置 精确、灵活、可自定义响应 需要编辑配置文件 强烈推荐,适用于绝大多数情况。
操作系统防火墙 简单粗暴,底层拦截 影响所有流量,无法精细控制 所有流量都通过代理,且确定无需直接访问时。

对于绝大多数用户来说,使用Nginx或Apache的配置文件来禁止IP访问是最佳选择,因为它既安全又灵活。