我们通常会用cdn套到服务器ip上,来为网站或者后端程序做加速、防御。可是nginx在设计上有个小缺陷,会因为ssl证书泄露网站的原IP
原    理
用Nginx部署网站,在默认或不正确的配置下,网站开启ssl,直接访问ip的443端口,即ip:443,Nginx会返回默认一个站点的ssl证书,间接的能让别人扫到这个ip对应的域名。
原理就是对ip的443端口发送clienthello,对方回复的 serverhello中有ssl证书,ssl证书里的common name 有域名信息。这样就知道了解析这个ip的域名。所以更准确的说是IP的443端口可能会暴露了域名。
动作再大一点,批量扫描机房的ip段,把对应的域名-ip 的多值映射表统计起来。以后想查某个域名对应的源站 ip 查这个表就够了,这是黑产喜欢干的事。
同时也是很多站点,明明套上了cdn,依然能被打到源站IP的原因。
解决办法
禁止直接访问IP
# 禁止IP直接访问网站

server {

      listen       
80
 default_server;

      listen       [::]:
80
 default_server;

      server_name  _;

return444
;

}

自签IP的SSL证书,返回444
自签证书的目的不是为了访问,而是避开Nginx的这个缺陷。生成自签的IP SSL证书可以用开源的Mkcert(https://myssl.com/create_test_cert.html)工具。Mkcert使用起来稍微麻烦,或者用一个测试证书的在线网页工具:https://myssl.com/create_test_cert.html
在填写域名的位置填上IP地址,点生成按钮会自动测试证书展示在下面,各自保存为.pem文件和.key文件。然后在nginx里配置上“return 444”,类似配置大概:
{

listen 
80
 ;

listen 
443
 ssl http2 default_server;

server_name ip;


  #HTTP_TO_HTTPS_END

    ssl_certificate    xxxx.pem;

    ssl_certificate_key   xxxx.pem;

    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;


return444
;


}

购买合法IP站点的SSL证书
花点小钱买个合法的IP SSL证书配置到nginx里,IP证书一般一二百左右。加钱,世界触手可及。
仅允许指定cdn的IP访问
Nginx仅允许指定cdn的IP访问,避免放到公网上被任何人扫。以腾讯云CDN段为例,在Nginx网站配置文件里,添加如下:
location / {

allow   
58.250
.143.0/
24
;

allow   
58.251
.121.0/
24
;

allow   
59.36
.120.0/
24
;

allow   
61.151
.163.0/
24
;

allow   
101.227
.163.0/
24
;

allow   
111.161
.109.0/
24
;

allow   
116.128
.128.0/
24
;

allow   
123.151
.76.0/
24
;

allow   
125.39
.46.0/
24
;

allow   
140.207
.120.0/
24
;

allow   
180.163
.22.0/
24
;

allow   
183.3
.254.0/
24
;

allow   
223.166
.151.0/
24
;

  deny    all;

}

查一下使用的CDN商家的文档,如果有新的IP段更新,也加到里面。
END
官方站点:www.linuxprobe.com
Linux命令大全:www.linuxcool.com
刘遄老师QQ:5604922
Linux技术交流群:193666693
(新群,火热加群中……)
想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!
继续阅读
阅读原文