白小兔的小小站

既然选择了远方,便只顾风雨兼程

0%

服务器安全篇:禁止通过IP访问站点

看了下nginx的访问日志,发现很多试探性的请求,路径是各种后台地址之类的。这种请求有个特点,就是直接通过ip访问,所以我决定禁止通过ip直接访问的请求访问我的服务器。

访问服务器的443端口时,无论nginx是否允许通过ip访问,它都会返回服务器的证书用于建立连接。由于证书中包含域名等信息,会导致源站暴露,这也是我们需要禁止通过ip访问的原因之一。怎么解决这个问题呢?

方案一:配置无效证书到默认站点

我们可以使用OpenSSL生成自签证书,安装 OpenSSL:

1
2
apt update
apt install openssl

在任意目录下,生成自签名SSL证书和密钥,文件路径自行替换:

1
openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /etc/nginx/ssl/fake_private_key.key -out /etc/nginx/ssl/fake_origin_certificate.crt

我们在nginx的配置文件中新建一个server,填入以下内容并适当修改

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/fake_origin_certificate.crt;
ssl_certificate_key /etc/nginx/ssl/fake_private_key.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
return 444;
}

经过上面的配置后只能通过域名来访问80和443端口,直接通过ip访问会直接断开连接(返回HTTP 444),一定程度上避免了潜在的安全风险。

方案二:配置ssl_reject_handshake

这个配置项用于拒绝握手,也不会提供显示证书,需要nginx版本号在1.19.4以上,无需创建假证书

1
2
3
4
5
6
7
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
return 444;
}

文档链接: http://nginx.org/en/docs/http/ngx_http_ssl_module.html