防止 Nginx 的未授权解析和 SSL 源站泄露

对于境内备案网站,为了防止不法分子恶意将未授权域名解析到服务器,可以在 Nginx 上进行如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80 default_server;
listen [::]:80 default_server;
return 444;
}

server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name _;
return 444;
ssl_reject_handshake on;
}

开启以上配置的情况下配置 HTTP 跳转 HTTPS

以上配置导致所有 HTTP 未加密请求均被拒绝,如果需要开启 HTTP 跳转 HTTPS,一种方法为每个站点单独配置 server 块;另一种方法如下,即一个 server 块配置整个域名及其子域名。

假设您的域名是 example.com,如下配置可仅允许 example.com 及其子域名进行 HTTP 跳转 HTTPS:

1
2
3
4
5
6
7
8
9
server {
listen 80;
listen [::]:80;
server_name example.com ~^(?<subdomain>.+)\.example\.com$;

location / {
return 301 https://$host$request_uri;
}
}

这样,在默认情况下,所有未授权的域名请求都会被拒绝,只符合 server_name 的域名会被允许访问。

限制 TLS 版本和密钥交换算法

此外一般 CDN 均支持 TLSv1.3,建议仅开启 TLSv1.3,并仅允许 X25519 密钥交换:

1
2
3
4
5
6
7
server {
# ...
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ecdh_curve X25519;
# ...
}

该配置应放在开启 sslserver 块中。可以放在单独的文件并使用 include 引入。