Nginx域名跟server_name不匹配也能访问

最近发现有一个别人的域名(下文以www.hack.com举例),DNS恶意解析到了我的一台服务器IP上,我的服务器上刚好部署了一个网站(域名为www.mysite.com),Nginx里的server_name配置为mysite.com

server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/mysite.cer;
    ssl_certificate_key /etc/nginx/ssl/mysite.key;

    server_name mysite.com
}

奇怪的是,用www.hack.com域名竟然也能访问到我的网站,server_name都不匹配,Nginx怎么会允许它访问的呢?

后来查资料得知,如果Nginx匹配不到server_name的话,会将请求交给默认server来处理。默认server怎么确定呢?

首先是看此端口有没有配置了default_server指令:

listen 443 ssl default_server;

如果这个server配置了default_server指令,那么就会交给它处理。

但如果所有的server都没有default_server指令呢?那么就会交给第一个开启了此端口的server处理。

所以要解决这个问题,只需要新增一个默认server就可以了:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    ssl_certificate /etc/nginx/ssl/xxx.cer;
    ssl_certificate_key /etc/nginx/ssl/yyy.key;

    server_name _
}

默认server 443端口的SSL证书可以使用自签名证书

配置443端口的默认server还要生成证书和私钥,有点麻烦。如果你的Nginx的版本 >= 1.19.4,那么可以不这么麻烦,像下面这样配置就可以了:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    ssl_reject_handshake on;

    server_name _
}

参阅

https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_reject_handshake

你可能感兴趣的:(Linux,nginx,运维)