技术解析

NGINX 如何禁止未绑定域名和 IP 访问 443 端口
0
2021-05-20 21:20:11
idczone

如题,这需求对 80 端口来说很简单,到了 443 各种问题啊,求解决方法!!

详细描述: 比如我服务器 443 端口只绑定了 www.baidu.com 这一个域名, https://www.baidu.com 是可以访问的,与此同时,使用其美国服务器他解析到我 IP 上的域名和直接使用我的 IP ,也是可以访问的,我现在想只让我绑定的域名能访问, https://其他域名 和 https://我服务器 IP ,一律 444 或者 403.


设一个 default_server 和 一个只映射 www.baidu.com 的 server , default 那个全部返回 404 , 这样只有用 www.baidu.com 域名访问的才会正确映射。

是啊,理论上是这样,但是我这样搞之后,正常绑定的也无法访问了。

这个很简单啊, Nginx 对于找不到 hostname 的域名,默认采用第一个 host
所以你可以在 include vhost/*. conf 之前加一个 default server
然后 Nginx 有个直接打断连接的 http code 444
所以
location / 左大括号
return 444 分号
右大括号
就可以实现了

至于 ip ,直接绑 server name

那你就贴一下你正常绑定的配置文件吧, 如果 server_name 正确应该不会你自己域名都访问不了

server {
listen 443 ssl default_server;
return 403;
}
server {
listen 443 ssl;
server_name www.baidu.com;
下面省略
}
匹配到 baidu 用 baidu ,匹配不到的全部到 default_server,直接返回 403.

以下内容来源 Nginx 官方文档
If someone makes a request using an IP address instead of a server name, the “ Host ” request header field will contain the IP address and the request can be handled using the IP address as the server name:
server {
listen 80;
server_name example.org
www.example.org
""
192.168.1.1
;
...
}
In catch-all server examples the strange name “_” can be seen:
server {
listen 80 default_server;
server_name _;
return 444;
}
There is nothing special about this name, it is just one of a myriad of invalid domain names which never intersect with any real name. Other invalid names like “--” and “[email&may equally be used.

参考官方文档。 server_name 填一个下划线。

解决了,需要添加私钥和证书路径才可以。

进帖子之前就猜到是这个问题了。
Nginx 上对于 SSL 服务器在不配置证书的时候会出现协议错误,哪怕端口上配置了其他网站也会报错。
解决方法就是随便生成一个证书填进去就好。

是的,我也是实在没办法了,随便加了证书路径,结果就 OK 了。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服