如何让 nginx 在 https 握手前就判断并阻断黑名单 IP 连接

2018-05-28 16:19:31 +08:00
 MX7J
使用 if ( $remote_addr = x.x.x.x ){ return 444; }和 deny x.x.x.x,都不行,都会先握手。

但是就是连握手也不想让它握,怎么做。
不能设置防火墙,因为还有同 IP:443 下还有别的虚拟主机
6150 次点击
所在节点    NGINX
35 条回复
alamaya
2018-05-28 16:24:19 +08:00
iptables
alamaya
2018-05-28 16:25:02 +08:00
没看到不能防火墙,无视吧
janxin
2018-05-28 16:27:09 +08:00
没办法,你不让人家说话怎么知道要说什么
MX7J
2018-05-28 16:29:20 +08:00
@janxin 在对方第一次 TCP 跟自己的说话的时候就判断它的 IP 是否在黑名单
因为需要隐藏源站 IP,但是对方可以带上 host 穷举,我如果跟他握手了。把自己的有效证书发出去了,就相当于告诉对方我就是源站了
smallHao
2018-05-28 16:30:54 +08:00
nginx 在应用层 而你需要的功能在传输层 无解
defunct9
2018-05-28 16:34:28 +08:00
哦,简单,写个 nginx 模块来搞定。
akira
2018-05-28 16:39:39 +08:00
握手的时候 并不知道他的目标域名是哪个
wwqgtxx
2018-05-28 16:40:36 +08:00
隐藏源站 IP 的话,在源站设置只允许 cdn 访问呀,其他的 ip 直接干掉
gclove
2018-05-28 16:42:10 +08:00
不要老从 nginx 考虑 , 防火墙直接设置只允许白名单不就行了嘛
warden123
2018-05-28 16:42:27 +08:00
在 https 握手前就判断并阻断黑名单 IP 连接
这个问题有有点奇怪,他没握手你怎么知道他这个连接是否在黑名单
而且还有同 IP:443 下还有别的虚拟主机,反正我个人感觉有点矛盾,可能是我技术不到家。
lx394311930
2018-05-28 16:46:11 +08:00
这个问题比较奇怪,你既然阻止与 ng 握手,那干嘛还在 ng 上做限制,试试别的想法
lsylsy2
2018-05-28 16:51:21 +08:00
我先猜测一下你的需求:你的网站隐藏在 CloudFlare 之类 CDN/抗 D 服务的背后,希望只对 CDN 的白名单内 IP 开放服务。

理论上是可行的,需要在 SNI 的部分做处理,但是我简单查了一下 Nginx 的 SNI 是让 openssl 处理的,好像没有现成的配制方法。建议用另外端口、IP 的方式做处理。
另外端口:这个网站不开在 443,而是 4430 之类其他端口,用防火墙处理限制,然后设置 CDN 的源站为非标准端口;
另外 IP:同一台机器能加 IP 的话那就直接用新 IP+防火墙;否则假如是 VPS 的话,开一台新的小鸡做个转发,把新机器的 443 转发到老机器的 4430,然后同上
mashiro233
2018-05-28 16:51:34 +08:00
@warden123

nginx 开启 SNI(RFC 6066)拓展之后,可以在 tls client hello 这一步就知 server name。
查了一圈应该没有留这种接口出来,硬是要这么做的话改 nginx 源码写拓展吧。
janxin
2018-05-28 16:53:59 +08:00
仔细想了想要是跟 nginx 这个层面的话用 Netfilter 做一个就好了,不过要做额外的协议解析工作,只是不要让 nginx 完成这个发送证书应该就算是成功了
lsylsy2
2018-05-28 16:56:13 +08:00
@janxin
@smallHao
@akira
@wwqgtxx
@gclove
@warden123
@lx394311930
我猜测你们可能没有完全理解 LZ 的想法,或者有一些知识遗漏。

现在支持同一个 IP 开多个 HTTPS 网站的 SNI,是会在请求的最开始加上想要访问的域名的;所以同一个 IP、同一个端口,在握手前实现 IP 黑白名单是做得到的;效果就是该 IP 能访问同一 IP 的其它域名,但是访问指定域名就握手失败,看起来像该 IP 上没有架设指定网站。
(跑个题,这一步是明文的,所以在中国大陆,部分 https 网站上不去,也是在这一步被 XX )
lsylsy2
2018-05-28 16:57:22 +08:00
@mashiro233
http://nginx.org/en/docs/http/configuring_https_servers.html
In order to use SNI in nginx, it must be supported in both the OpenSSL library with which the nginx binary has been built as well as the library to which it is being dynamically linked at run time.
看起来是把很多工作交给 openssl 库了
cpdyj
2018-05-28 16:58:19 +08:00
你都不让握手 Nginx 怎么判断要访问哪个主机呢?判断不了只能全不让访问了呗,iptables...
AX5N
2018-05-28 16:58:33 +08:00
那我也想问个问题,如何探测站源的 ip,以前没了解过这方面。
cpdyj
2018-05-28 17:00:01 +08:00
@cpdyj 看错了,以为是 tcp 的握手...无视我吧
LGA1150
2018-05-28 17:01:20 +08:00
https://github.com/Lochnair/xt_tls
把这个编辑进 iptables,然后配合源 IP 限制就好了,不会影响其他域名

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/458395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX