阻止通过HTTPS直接访问networking服务器IP

类似这个和这个问题,我想阻止用户使用IP访问我的服务器。

对于HTTP(端口80),这工作正常,但不适用于HTTPS。 所以用户仍然可以inputhttps://<myip>访问networking服务器,nginx返回默authentication书。 顺便说一句,我在我的“通常的”服务器块(使用我的域名)使用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阻塞更好,你也可以做到这一点,并说服我也阻止对IP的HTTP [或所有其他]请求。 一般来说,删除连接是好的(如nginx状态码444)。

但是有一个要求:我不想在configuration中明确地提到服务器的IP地址,因为它是一个dynamicIP,服务器使用dynamicDNS服务。

所以总之,这就是我想要达到的目的:

  • 通过IP阻止访问
  • 允许通过域名访问
  • 阻止非SNI客户端是很好的
  • 为此使用防火墙阻塞是很好的
  • 丢弃连接是好的
  • 而不提及服务器的IP地址
  • 不通过HTTPS暴露域名

编辑:另一个失败的尝试。 我试图按照这个build议 ,使用这个configuration片段,这似乎是一个好事:

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

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

试试这个 – default_server位是重要的一部分。 如果不起作用,请更新显示其他侦听443 / SSL的服务器configuration的问题。

 server { listen 443 ssl default_server; listen [::]:443 ssl default_server; # not sure if you want/need it here as well. Try both ways. server_name _; return 444; }