最近发现有一个别人的域名(下文以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