咱们通常会用 cdn 套到服务器 ip 上,来为网站或者后端程序做减速、进攻。可是 nginx 在设计上有个小缺点,会因为 ssl 证书泄露网站的原 IP
别让 SSL 证书裸露了你的网站服务器 IP 别让 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 _;
return 444;
}
自签 IP 的 SSL 证书, 返回 444
自签证书的目标不是为了拜访,而是避开 Nginx 的这个缺点。生成自签的 IP SSL 证书能够用开源的 Mkcert(https://myssl.com/create_test_cert.html)工具。Mkcert 应用起来略微麻烦,或者用一个测试证书的在线网页工具:https://myssl.com/create_test_cert.html
别让 SSL 证书裸露了你的网站服务器 IP 别让 SSL 证书裸露了你的网站服务器 IP
在填写域名的地位填上 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;
return 444;
}
购买非法 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 段更新,也加到外面。