V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
MX7J
V2EX  ›  NGINX

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

  •  
  •   MX7J · 2018-05-28 16:19:31 +08:00 · 6427 次点击
    这是一个创建于 2371 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用 if ( $remote_addr = x.x.x.x ){ return 444; }和 deny x.x.x.x,都不行,都会先握手。

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

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

    nginx 开启 SNI(RFC 6066)拓展之后,可以在 tls client hello 这一步就知 server name。
    查了一圈应该没有留这种接口出来,硬是要这么做的话改 nginx 源码写拓展吧。
    janxin
        14
    janxin  
       2018-05-28 16:53:59 +08:00
    仔细想了想要是跟 nginx 这个层面的话用 Netfilter 做一个就好了,不过要做额外的协议解析工作,只是不要让 nginx 完成这个发送证书应该就算是成功了
    lsylsy2
        15
    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
        16
    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
        17
    cpdyj  
       2018-05-28 16:58:19 +08:00
    你都不让握手 Nginx 怎么判断要访问哪个主机呢?判断不了只能全不让访问了呗,iptables...
    AX5N
        18
    AX5N  
       2018-05-28 16:58:33 +08:00
    那我也想问个问题,如何探测站源的 ip,以前没了解过这方面。
    cpdyj
        19
    cpdyj  
       2018-05-28 17:00:01 +08:00
    @cpdyj 看错了,以为是 tcp 的握手...无视我吧
    LGA1150
        20
    LGA1150  
       2018-05-28 17:01:20 +08:00   ❤️ 2
    https://github.com/Lochnair/xt_tls
    把这个编辑进 iptables,然后配合源 IP 限制就好了,不会影响其他域名
    flyingfz
        21
    flyingfz  
       2018-05-28 17:05:44 +08:00
    貌似,openResty 可解。本贴右侧有链接。
    mashiro233
        22
    mashiro233  
       2018-05-28 17:07:25 +08:00
    @lsylsy2
    是的,这个是 TLS 那层的事,所以丢给 openssl 处理这么做设计上来说没什么问题。
    要实现这种需求估计只能魔改 nginx 了,在把数据转发到 bio 之前解析 client hello 取出 server name 然后再判断写入到 bio 还是关闭这个链接……真是太 hack 了。
    akira
        23
    akira  
       2018-05-28 17:09:43 +08:00
    @lsylsy2 对的,理解有偏差。一说握手就本能的反应到 tcp 的握手去了。lz 的这个情况应该是在 ssl 的握手环节来处理
    3dwelcome
        24
    3dwelcome  
       2018-05-28 17:51:52 +08:00
    楼上都说 SSL 握手,个人觉得不是。LZ 的主要目的,就是为了爬虫访问的时候,能防止网站证书外泄。
    如果严格控制 SNI 的走的路径,是可以在 ClientHello 阶段,就直接阻断的。
    janxin
        25
    janxin  
       2018-05-28 18:02:13 +08:00
    @lsylsy2 嗯,第一反应是 TCP 握手就阶段,后来想了想只要证书不发送即可
    julyclyde
        26
    julyclyde  
       2018-05-28 18:12:40 +08:00
    你的需求是 tcpwrapper
    但不知道 nginx 是否支持这个
    xuanyuanaosheng
        27
    xuanyuanaosheng  
       2018-05-28 18:17:31 +08:00
    楼主可以说下解决思路以及解决方法啊
    gesse
        28
    gesse  
       2018-05-28 18:22:10 +08:00
    还是计算机基础没有学好。
    zingl
        29
    zingl  
       2018-05-28 21:15:16 +08:00
    nginx 单独可能不行,deny、return 貌似都是证书验证以后才执行
    nginx 前面放 haproxy 之类的应 i 该可以解决
    LoliconInside
        30
    LoliconInside  
       2018-05-28 21:30:21 +08:00
    写一个 ssl 的 default server,里面配一个假证书,这样 nginx 在 SNI 过程中如果没有找到对应主机名的配置就会返回这个证书
    dndx
        31
    dndx  
       2018-05-29 01:54:10 +08:00
    @flyingfz 正解,这么简单的需求用 OpenResty 几行 Lua 代码就搞定了,可以在握手前就断开连接,也不会发送证书。

    https://github.com/openresty/lua-nginx-module#ssl_certificate_by_lua_block
    https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md#raw_client_addr
    0312birdzhang
        32
    0312birdzhang  
       2018-05-29 07:53:49 +08:00 via iPhone
    这么简单的话就不会这么多公司被 ddos 了
    wawehi
        33
    wawehi  
       2018-05-29 11:56:33 +08:00
    openResty 试试, 写点 LUA 脚本
    monbai
        34
    monbai  
       2018-06-11 05:08:44 +08:00 via Android
    据我所知 ddos 用 cdn 挡不住的,目前我们客户都是直接防火墙或者安全组做源站保护白名单地址,你源站 ip 直接在 4 层 deny 了怎么会有这个问题呢,莫非有其他需求,希望楼主解答一下
    monbai
        35
    monbai  
       2018-06-11 05:14:40 +08:00 via Android
    补充一下,目前就是做抗 d 和 cc,,就说网站业务,cdn 基本没用,要干你直接打到回源,也许根本没法跑,waf 和抗 d 基本都是网络创业的买路费,很多客户被打的莫名其妙的也没收到勒索
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2802 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:39 · PVG 22:39 · LAX 06:39 · JFK 09:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.