1. 原因
默认情况下Nginx配置完毕后,是允许ip地址直接访问的。而我们一直以开发者思维处理的话。也容易忽视这这方面存在的风险。
而这样做的风险在于:
- 其他人将他的域名绑定指向了我们的ip。那么容易造成服务器被网监判定为存在非法域名,造成服务器被断网。
- 各种ip访问扫码工具,会收集我们的Web应用程序信息,容易造成信息泄露。(access.log中很多通过ip地址访问的记录)
而且,如果碰见互联网清网行动大力度管控时期,所有web服务器都不允许通过ip地址进行访问web服务器,必须使用设定的域名访问web服务器。否则一律清理。
以上风险来源于网络,我的阿里云服务器两年期间没有提示有这个风险。 我发现百度到现在也是可以直接通过ip访问的,不一定必须是域名。
下面介绍Nginx中的配置。
2. 配置
首先,删除掉我们原先的server{ server_name}
中的ip地址。如果存在的话就进行删除,如果不存在就保持不变即可。
第二步,在我们的/etc/nginx/conf.d/default.conf
文件中进行添加以下的配置即可:(PS:如果没有这个路径,那么可以添加到/etc/nginx/nginx.conf
文件中,效果是一样的)
server {
listen 80 default_server;
listen 443 default_server;
server_tokens off;
server_name _;
return 444;
ssl_certificate_key 我们自己的SSL证书全路径.key;
ssl_certificate 我们自己的SSL证书全路径.pem;
}
default_server
; 代表默认无匹配的时候由当前的server处理。
server_name _;代表无效域名。
合起来的意思就是,其他server没有匹配的,全部由当前server进行匹配处理。
该server匹配到之后,处理的结果就是直接返回444
状态
而前端收到的效果就是ERR_EMPTY_RESPONSE
错误了。
配置完毕后输入nginx -t
检测通过后,通过service nginx reload
刷新配置就可以生效了。
这个时候我们通过http://ip
或者https://ip
都将无法正确访问了。
所有的访问就必须通过域名才能访问了,通过ip地址的请求都将会打回。
2.1 问题
我配置完毕后,通过https://ip
和 http://ip
访问的确返回了444
状态。但是如果我通过http://ip:443
却不会返回444
。而是返回400
。
最终我也没有找到解决方法,只是为了避免该页面上暴露nginx的版本号,添加了 server_tokens off;
选项。
这个问题影响也不大。