Nginx 能否做到基于 IP 防止攻击?对于无状态服务呢?

2020-10-16 01:16:02 +08:00
 black11black

最近有一个想法,是要做一个主播声音分享网站,类似于过去那种按某个按钮,就播出某句卢本伟经典语录那种的

整个网站构建倒是没什么好考虑的,唯一需要考虑到一个问题就是防止攻击,因为这种自娱自乐的需求肯定都是挂在小型服务器上,一旦受到攻击我感觉非常脆弱。

甚至也不用到 DDOS 的程度,就单纯假设说有一个坏东西,通过各种方式实现以每秒 10 次的频率请求我网站的资源,应该就会占满我小鸡的全部带宽,导致服务不可用。

所以一个想法是假设一个带有 ban 功能的服务器,比如限制单 IP 每分钟访问频次之类的。有没有 Nginx 大佬指点一下能不能做到,应该如何实现。

======

第二个问题纯粹是个人好奇,如果第一个问题的答案是可以实现的话,它是一种有状态服务还是无状态服务?(理论上应该是有状态吧),那么是否它不能支持多节点假设,那么现在那么多商业网站的多节点防护是怎么完成的呢?

(我个人假设的时候肯定是后端无状态,然后统一经过 nginx 代理之类的这种架法,应该不会多节点 nginx,所以这个问题纯粹是技术上的好奇)

1449 次点击
所在节点    问与答
15 条回复
Daylight1993
2020-10-16 01:17:30 +08:00
限制单 IP 每分钟访问频次,nginx 最基本的东西。你确定百度过 nginx 的相关资料吗?
masker
2020-10-16 01:59:44 +08:00
老伸手党了
icy37785
2020-10-16 02:03:23 +08:00
百度一下就有无数方案任君选择
black11black
2020-10-16 02:20:31 +08:00
@Daylight1993 没搜就先问了,后来搜了一下似乎不难配置。那关于状态呢?单个 Nginx 单独维护自己的并发数吗?
msg7086
2020-10-16 06:04:48 +08:00
内部会维护访问计数。如果要长期 ban 可以用 fail2ban 去读 nginx 的 ban IP 记录,然后放在防火墙上。
594duck
2020-10-16 06:05:41 +08:00
你需要的是 api gw,比如 kong
Jat001
2020-10-16 06:06:46 +08:00
black11black
2020-10-16 06:36:57 +08:00
@msg7086 有意思,这也可以,f2b 还能这么玩。所以具体实现手段是写一个第三方程序,定期同步两边的 ban 列表,还是怎么说,f2b 自带从外部同步功能吗。如果是第三方程序,加入简单,释放怎么办
black11black
2020-10-16 06:40:49 +08:00
@594duck 搜了一下,apigw 我理解上应该还是一层程序,只不过单独把权鉴的部分抽出来做成服务,这样的话其实还是离不开传统做法的步骤,不知道我理解的对不对。或者说已经有人把这部分做成成熟服务了?这样增加整个系统复杂度的话不知道可用性怎么样,不知道大型商业公司用的都是什么方案
594duck
2020-10-16 07:18:10 +08:00
@black11black

你可以理解为 nginx +LUA +redis 就是最基本的 api gw

举个例子 nginx + Lua 热动态更新规则,你的跨服务器就是 Lua 规则放在 redis 里,达到多机共享。

他有什么呢。黑白名单,根据 IP 的访问频率动作,oath 等等等等

看一下 kong 的功能列表
sugars
2020-10-16 08:56:56 +08:00
Cloudflare ?
msg7086
2020-10-16 13:01:50 +08:00
@black11black f2b 读 Nginx 日志然后动态加减 ban 列表。这和 ssh 读 authlog 是一样的原理。
black11black
2020-10-17 00:54:57 +08:00
@msg7086 大佬讲下 ssh 读 authlog 是啥操作,ssh 不是写 authlog 么,为什么要读
black11black
2020-10-17 00:59:40 +08:00
@msg7086 而且想了一下 f2b 维护访问计数这个方案还是不是很好,因为理论上你还是希望对方被 ban 后收到的是被 ban 信息,而不是直接把封包吞了,所以应该还是 nginx 那边的方案更好。f2b 可能是比较适合做防火墙啥的,但是大规模 ddos 感觉更复杂一些,跟普通这些防爬虫和灌水机器人的不太一样,不是我能探索的领域了
msg7086
2020-10-17 04:35:30 +08:00
@black11black 我的意思是 fail2ban 的 SSH jail 会去读 auth.log 。
同理 fail2ban 的 Nginx jail 可以去读 Nginx 的 access log 。
fail2ban 就是拿来当防火墙用的,主要是应对攻击。我这边的话还要稍微封一下不太合适的爬虫。

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

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

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

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

© 2021 V2EX