Skip to content

在Nginx服务器中禁止直接通过IP地址访问网站

有些时候,我们并不希望有人能通过IP地址而直接访问到我们刚搭建好的网站。

如果能直接通过IP就能访问的话,那么恶意爬虫或者各种Web扫描工具就会获取我们的隐私内容或低门槛入侵到服务器内部。

再或者,其他恶意攻击者会轻而易举地将他的域名绑定我们的ip,从而访问我们的网站。倘若这个域名存在问题或者是恶意域名,那么很容易造成损失以及不可预料到的风险。当然,我们并不希望这种情况发生。

然而Nginx的服务器配置完毕后是默认允许用户通过IP地址直接访问的。这是我们需要先了解一下Nginx的运行原理:

原理

当我们正常通过域名来访问时,浏览器会发送一个Host头,Nginx服务器接收后会自动为我们匹配server_name,从而返回目标网站的内容

当我们通过IP来访问时,由于没有域名标识,Nginx则会返回默认server块。其原理可以如下图所示↓

如果返回默认server块的话,非常容易让攻击者得知你的服务器指纹或者你的敏感信息、默认安装界面、目录结构等,使攻击入口门户大开。

这时候,我们就必须添加一个默认拦截块,并使用一个占位符“_”匹配所有其他 server 块未处理的域名,然后返回444状态码。这样的话,我们就如同在Nginx服务器上设置了一层过滤网,使非法访问无法进入实际的内容服务流程,从根源上消除信息暴露风险。

操作

在你的网站文件中找到 nginx.conf 这个配置文件,一般来说位于 //www/server/nginx/conf 中,完成****在http模块的最顶部添加一个独立的server块(确保它是第一个server配置)****内添加如下代码:

1
2
3
4
5
6
7
8
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate /www/server/panel/vhost/cert/example/fullchain.pem; # 这里使用示例路径,替换为你的SSL证书路径
ssl_certificate_key /www/server/panel/vhost/cert/example/privkey.pem; # 这里使用示例路径,替换为你的SSL私钥路径
return 444;
}

完成后,保存并退出。使用命令来验证一下

1
2
3
4
5
6
7
8
#测试HTTP
curl -I http://你的IP # 应该返回 "Empty reply from server"

#测试HTTPS
curl -kI https://你的IP # 同上

# 重载配置
sudo nginx -t && sudo systemctl reload nginx

这样的话,通过通过https://IP和http://IP就会返回444状态码了。

About this Post

This post is written by Leapan, licensed under CC BY-NC-SA 4.0.