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

关于 NGINX 防止主动探测 / 爬虫扫描 HTTPS 的配置方法

  •  
  •   mikewang ·
    MikeWang000000 · 2023-10-17 01:22:53 +08:00 · 3496 次点击
    这是一个创建于 413 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公网上暴露 https 端口,难免会被扫到,有些爬虫还会顺藤摸瓜根据证书找到域名,然后接着扫,在日志里留下 /wp-admin 等等记录。

    虽然这些扫描对我服务影响不大,但是看到还是有点烦,因此想利用 NGINX 配置彻底隐藏我的 https 服务。


    我的环境:

    • 内网正常提供 80 / 443 端口服务,
    • 公网仅开放高位端口,转发至 443 ( https )。

    我的配置 (篇幅原因,放到 pastebin 里了):

    [ https://pastebin.com/embed_iframe/bSBarvY8 ]


    也就是说,这样的配置,在 [ https://域名:端口/路径 ] 里:

    1. https 、指定域名、端口,三者完全匹配才能完成 TLS 握手;
    2. 正确路径才有 HTTP 响应;
    3. 其他情况都是直接关闭 TCP 连接。

    即使网络链路中存在中间人,截获了 SNI 域名,由于没有正确路径,依然不能获得响应。中间人只能判定其中有 TLS 流量,但不能扫描到 HTTPS 。


    我想,这样应该能很好的隐蔽起我的 https 服务,只有知晓全路径的人才能访问得到。不知道这样的配置是不是还存在漏洞,欢迎大家指点讨论~

    18 条回复    2024-09-16 05:00:15 +08:00
    ellermister
        1
    ellermister  
       2023-10-17 02:32:42 +08:00 via Android
    高位端口不常用,我的很多公网服务都被扫描,扫描爬虫都比正常访客要高,日志看的烦。用脚本怕 access.log 拉黑 ip ,也拉不完,感觉没啥面对公网环境完美的办法。
    dann73580
        2
    dann73580  
       2023-10-17 02:44:14 +08:00   ❤️ 1
    我用的办法是直接把常见 idc 段 ip 拉黑名单,简单粗暴疗效好。如百度阿里腾讯层峰的全都 ban 了。
    Conantv2
        3
    Conantv2  
       2023-10-17 02:51:12 +08:00 via iPhone
    我记录 SNI 的同时也记录端口,阁下又该如何应对?
    mikewang
        4
    mikewang  
    OP
       2023-10-17 03:13:31 +08:00 via iPhone
    @Conantv2 还有最后一道路径呀,路径不匹配还是直接 444 关闭连接,没有响应的。
    miyuki
        5
    miyuki  
       2023-10-17 07:14:47 +08:00 via iPhone
    我是 default server 也配置一张随便写域名的证书,iptables 443 白名单 cf 段
    hefish
        6
    hefish  
       2023-10-17 07:21:10 +08:00
    那还转发啥啊,直接在高位端口用就是了。
    grittiness
        7
    grittiness  
       2023-10-17 08:49:51 +08:00
    这和 nginx 直接配置`ssl_reject_handshake on;`有什么区别吗?
    dode
        8
    dode  
       2023-10-17 09:00:57 +08:00
    单独配置一个自行生成的证书作为默认网站,真实网站再独立创建一个 server 跑服务
    dzdh
        9
    dzdh  
       2023-10-17 09:02:57 +08:00
    @mikewang 那你直接 443 访问不存在的路径直接 444 一样的效果啊
    mikewang
        10
    mikewang  
    OP
       2023-10-17 09:15:49 +08:00 via iPhone
    #6 @hefish 可以理解为是 /t/966348 [Nginx 的 444 命令(强制切断 TCP 连接),用于对抗运营商检测家宽开服务是否有帮助?] 的增强实现,我也是受这一贴的启发写的配置。

    #7 @ grittiness 额外加上了路径匹配等规则,404 等情况会直接关闭连接。

    #9 @dzdh 加上了 TLS 拒绝握手,可以避免域名探测。
    ryd994
        11
    ryd994  
       2023-10-17 09:17:22 +08:00
    你想更进一步安全的话可以自己签客户端证书,搞 TLS 双向验证。
    greenskinmonster
        12
    greenskinmonster  
       2023-10-17 09:24:04 +08:00   ❤️ 2
    fail2ban 把短时间内产生大量 4xx 错误码的 IP 都 ban 了

    cat /etc/fail2ban/filter.d/nginx-4xx.conf

    [Definition]
    failregex = ^<HOST>.*"(GET|POST).*" (404|444|403|400) .*$
    ignoreregex =
    dzdh
        13
    dzdh  
       2023-10-17 09:29:23 +08:00
    @mikewang #10 和 ssl_reject_handshake 有啥区别吗
    shijingshijing
        14
    shijingshijing  
       2023-10-17 09:29:42 +08:00
    @dann73580 哪里能下载 idc 段 ip 列表的?或者有什么规则可以自定义?
    awalkingman
        15
    awalkingman  
       2023-10-17 09:45:22 +08:00
    我是把后缀/wp-admin 之类的爆破路径直接重定向到测试网速下载 1000G 文件的链接
    ysc3839
        16
    ysc3839  
       2023-10-17 13:23:53 +08:00 via Android
    if ($public_ip) 应该能改用 deny 。
    另外 error_page 有坑,在其中一个 server block 配置了 400 =444 ,其他 server block 也会继承,想要域名访问时正常返回 400 就不行了。
    mikewang
        17
    mikewang  
    OP
       2023-10-17 14:56:23 +08:00 via iPhone
    @ysc3839 deny 应该是可以的。关于 400 ,确实存在这个问题。但是目前没能找到更好的方法,因为客户端发送的可能就是垃圾数据,nginx 不能判断站点,只能一并切断。
    echo 123 | nc example.com 12345
    nginx 返回一个 400 响应就暴露了
    sn0wdr1am
        18
    sn0wdr1am  
       77 天前
    听说 nginx 返回 444 ,效果比较好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1011 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 20:04 · PVG 04:04 · LAX 12:04 · JFK 15:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.