nginx如果在没有正确配置的情况下直接访问服务器ip或未经配置的域名(域名已指向服务器ip)会出现成功访问或者https证书不安全的问题

关键词:nginx ip 域名 https

一、解决方案

1.禁止http未配置域名IP访问

server
{
    listen 80 default_server;
    server_name _;
    return 444; 
}

defalut_server显式指出本server为80端口的默认server,因为是默认server,所以server_name其实可以填任意值,444为nginx自定义code,表示断开连接不返回任何响应。

2.禁止https未配置域名IP访问

server {
    listen 443 default_server;
    server_name _;
    include conf.d/ssl.config;
    
    # 不用返回 444 了,直接拒绝握手
    ssl_reject_handshake on;
    # return 444;
}

在nginx1.19.4 及以上版本,禁止非预期域名直接访问配置也很简单,只需要添加443端口监听并配置ssl_reject_handshake on即可

要是你仍然使用的是低版本的nginx,例如nginx 1.18.0及以下版本,你仍然可以通过为以上server块配置无效的https自签名证书来达到一样的效果,使用权威机构签发的证书也是可以的

二、nginx相关配置

1.default_server定义及匹配规则

nginx的default_server指令可以定义默认的server去处理一些没有匹配到server_name的请求。如果没有显式定义,则会选取第一个定义的 server 作为 default_server。

在了解到如上规则后,我们可以捕获未做绑定的域名访问或直接IP访问,做重定向到 403 页面等处理。

nginx 批量载入配置 conf 时会按 ascii 排序载入,这就会以 server_a.conf server_b.conf server_c.conf 的顺序载入,如果没有声明 default_server 的话,那 server_a 会作为默认的 server 去处理 未绑定域名/ip 的请求。

三、参考文章

nginx禁止直接ip、未配置域名访问配置
nginx 的 default_server 定义及匹配规则
NGINX 配置避免 IP 访问时证书暴露域名

文章作者:四文鱼Max

本文链接:https://blog.awolon.fun/archives/nginx-forbid-ip-unexpected-host-access.html

许可协议:CC BY-SA 4.0

标签: nginx

添加新评论