nginx – 阻止通过HTTPS直接访问Web服务器IP

前端之家收集整理的这篇文章主要介绍了nginx – 阻止通过HTTPS直接访问Web服务器IP前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

thisthis question类似,我想阻止用户使用IP访问我的服务器.

对于HTTP(端口80),这可以正常工作,但不适用于HTTPS.因此,用户仍然可以输入https://< myip>访问网络服务器和Nginx返回默认证书.
顺便说一句,我在我的“通常”服务器块(使用我的域名)中使用HTTP2,所以我使用:

listen 443 ssl http2;
listen [::]:443 ssl http2;

我试过这个来阻止HTTPS ip访问:

server {
   listen 443 ssl;
   listen [::]:443 ssl;

   server_name _;
   return 444;
}

但遗憾的是,无论是否使用域,都会阻止所有HTTPS请求.
我知道可能有必要阻止非SNI客户端,因为这些客户当然不会将使用过的域名提供给服务器,所以我很好. (我的意思是不支持SNI的客户不管怎样……)

我通常更喜欢在Nginx中阻止它,但是如果你有一些关于在防火墙级别阻止它的想法(iptables)我也很高兴地欣赏它们.如果你想争论为什么阻止使用iptables更好,你也可以这样做并说服我也阻止HTTP [或所有其他]对IP的请求.
通常丢弃连接很好(如Nginx状态代码444那样).

但是有一个要求:我不想在配置中明确提到服务器的IP地址,因为它是动态IP,服务器使用动态DNS服务.

简而言之,这就是我想要实现的目标:

>通过IP阻止访问
>允许通过域名访问
>可以阻止非SNI客户端
>可以使用防火墙阻止它
>放下连接就好了
>没有提到服务器的IP地址
>不通过HTTPS暴露域名

编辑:另一个失败的尝试.
我试着按照this suggestion使用这个配置片段,从逻辑上讲这似乎是一件好事:

if ($host != "example.com") {
        return 444;
}

它基本上也可以工作,但是当我访问“https://”时,我发现Nginx最初已经发送了HTTPS证书(包含域名),并且只有当我跳过连接警告时,才会看到它阻止了访问.这是合乎逻辑的,因为当HTTPS连接存在时,Nginx只能读取Host头,但此时Nginx已经发送了包含域名的服务器证书,因此用户现在拥有域名并可以使用它重新连接制作整个IP阻止无用.
我也有点担心这个解决方案的性能方面,因为它会导致Nginx检查每个请求的主机头,所以我仍然在寻找解决方案.

最佳答案
今天,我遇到了与此块相同的问题:

server {
  listen 443 ssl default_server;
  server_name 

Nginx-logs说:

no “ssl_certificate” is defined in server listening on SSL port while
SSL handshaking

正如您所提到的,这似乎也禁用了其他服务器块.可以通过使用server-ip-address的(自签名)证书来解决这个问题.我用openssl做了这个:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt -subj '/CN=

然后将服务器块更改为:

server {
    listen 443 ssl default_server;
    server_name 

当有人使用https上的SERVER-IP访问服务器时,Nginx显示(自签名)证书,而不是您要隐藏的域名证书.

顺便说一下,让你的服务器块与IP一起使用default_server.这样,禁用SNI的客户端将获得IP证书而不是域名证书.这也可以用openssl测试(-servername选项,它将启用SNI,省略):

openssl s_client -connect 

猜你在找的Nginx相关文章