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

2023-10-17 01:22:53 +08:00
 mikewang

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

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


我的环境:

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

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


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

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

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


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

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

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

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

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

[Definition]
failregex = ^<HOST>.*"(GET|POST).*" (404|444|403|400) .*$
ignoreregex =
dzdh
2023-10-17 09:29:23 +08:00
@mikewang #10 和 ssl_reject_handshake 有啥区别吗
shijingshijing
2023-10-17 09:29:42 +08:00
@dann73580 哪里能下载 idc 段 ip 列表的?或者有什么规则可以自定义?
awalkingman
2023-10-17 09:45:22 +08:00
我是把后缀/wp-admin 之类的爆破路径直接重定向到测试网速下载 1000G 文件的链接
ysc3839
2023-10-17 13:23:53 +08:00
if ($public_ip) 应该能改用 deny 。
另外 error_page 有坑,在其中一个 server block 配置了 400 =444 ,其他 server block 也会继承,想要域名访问时正常返回 400 就不行了。
mikewang
2023-10-17 14:56:23 +08:00
@ysc3839 deny 应该是可以的。关于 400 ,确实存在这个问题。但是目前没能找到更好的方法,因为客户端发送的可能就是垃圾数据,nginx 不能判断站点,只能一并切断。
echo 123 | nc example.com 12345
nginx 返回一个 400 响应就暴露了
sn0wdr1am
97 天前
听说 nginx 返回 444 ,效果比较好。

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

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

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

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

© 2021 V2EX