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

为什么禁止IP访问网站?
在开始操作前,理解其背后的原因非常重要,这有助于你判断是否真的需要这样做。
- 隐藏服务器信息:直接通过IP访问,可能会暴露服务器的操作系统、Web软件(如Nginx/Apache)版本信息,甚至可以通过目录列表看到网站文件结构,这为攻击者提供了便利。
- 重复:搜索引擎可能会将你的
http://IP地址和http://域名视为两个不同的网站,导致内容重复,影响SEO排名,禁止IP访问可以确保搜索引擎只收录你的域名。 - 规范访问入口:强制用户通过你指定的域名访问,提供统一的品牌体验和正确的SSL证书(如果IP没有绑定证书,访问时会提示不安全)。
- 防止恶意扫描:一些自动化工具会直接扫描IP地址上的80/443端口,禁止IP访问可以有效减少这类无意义的扫描和攻击。
- 避免配置错误:如果服务器上有多个网站,直接通过IP访问可能会指向一个默认的、不正确的网站,造成用户困惑。
如何禁止IP访问(分步指南)
主要有两种方法:使用Web服务器配置文件 和 使用防火墙。通常推荐使用Web服务器配置,因为它更精确,可以返回一个自定义的页面或错误代码。
使用 Nginx 配置(推荐)
Nginx是目前非常流行的Web服务器,配置相对简单。
-
找到配置文件 通常位于
/etc/nginx/nginx.conf或/etc/nginx/sites-available/目录下的站点配置文件中(default)。
(图片来源网络,侵删) -
编辑配置 在
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; } -
检查并重载Nginx 保存文件后,检查配置语法是否正确,然后重载Nginx使配置生效。
# 检查语法 sudo nginx -t # 如果显示 syntax is ok 和 test is successful,则重载 sudo systemctl reload nginx
当用户直接通过IP地址访问你的服务器时,将会收到一个空响应(444)或你指定的错误信息。
使用 Apache 配置
Apache的配置与Nginx类似,也需要添加一个虚拟主机来捕获所有IP请求。

-
找到配置文件 通常位于
/etc/apache2/sites-available/000-default.conf或/etc/apache2/apache2.conf。 -
编辑配置 在配置文件的开头,添加一个
<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> -
检查并重启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访问网站进行调试了,请谨慎使用。
高级技巧与注意事项
-
处理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; } -
允许特定IP访问 如果你希望禁止所有IP,但允许自己或特定管理IP访问,可以在配置中添加
allow和deny指令。# 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; } -
CDN/代理环境 如果你使用了Cloudflare等CDN服务,用户的真实IP对你来说是不可见的,他们看到的都是CDN的IP地址,在这种情况下,禁止IP访问的意义不大,因为所有请求都来自CDN节点,你的重点应该是正确配置Nginx,使其信任
X-Forwarded-For头部,并基于域名进行路由。 -
测试 配置完成后,务必使用
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访问是最佳选择,因为它既安全又灵活。
