我们通常在服务器ip上使用cdn来加速和防御网站或后端程序。但是nginx在设计上有一个小缺陷,会因为ssl证书泄露网站的原始IP。
原则
用Nginx部署网站。在默认或不正确的配置下,网站打开ssl,直接访问ip的443端口,即ip:443。Nginx将返回默认站点的ssl证书,这间接使其他人能够扫描与该ip对应的域名。
原理是将clienthello发送到ip的端口443。对方回复的serverhello有ssl证书,ssl证书中的常用名称有域名信息。这样,我们就知道了解析这个ip的域名。所以更准确地说,IP的端口443可能会暴露域名。
移动大一点,分批扫描机房的ip段,统计对应的域名-ip多值映射表。以后要查一个域名对应的源站ip,查这个表就够了,这是黑产品喜欢做的事情。
同时,这也是很多站点即使被cdn明显覆盖,依然可以打到源站IP的原因。
解决办法
无法直接访问知识产权
# 禁止IP直接访问网站server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444;}
自我签证的目的不是为了访问,而是为了避免Nginx的这个缺陷。自签名的知识产权SSL证书可以由开源的mkcert(https://myssl.com/create _ test _ cert.html)工具生成。Mkcert使用起来有点麻烦,或者使用在线网络工具来测试证书:https://myssl.com/create_test_cert.html.
在您填写域名的地方填写IP地址,点击生成按钮自动显示下面的测试证书,保存为。pem文件和。密钥文件。然后在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;return 444; }
购买合法知识产权网站的SSL证书
花点小钱买个合法的IP SSL证书,在nginx里面配置。一般知识产权证书一两百左右。
加钱,世界触手可及。
仅允许指定cdn的IP访问
Nginx只允许IP访问指定的cdn,以免被公网上的任何人扫描。以腾讯云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段更新,就添加。