Nginx   发布时间:2022-05-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了nginx – 阻止通过HTTPS直接访问Web服务器IP大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

与this和this 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说:

正如您所提到的,这似乎也禁用了其他服务器块.可以通过使用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 – 阻止通过HTTPS直接访问Web服务器IP全部内容,希望文章能够帮你解决nginx – 阻止通过HTTPS直接访问Web服务器IP所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: