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