V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
black11black
V2EX  ›  问与答

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

  •  
  •   black11black · 2020-10-16 01:16:02 +08:00 · 1446 次点击
    这是一个创建于 1287 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    ======

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

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

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

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

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

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

    看一下 kong 的功能列表
    sugars
        11
    sugars  
       2020-10-16 08:56:56 +08:00
    Cloudflare ?
    msg7086
        12
    msg7086  
       2020-10-16 13:01:50 +08:00 via Android
    @black11black f2b 读 Nginx 日志然后动态加减 ban 列表。这和 ssh 读 authlog 是一样的原理。
    black11black
        13
    black11black  
    OP
       2020-10-17 00:54:57 +08:00
    @msg7086 大佬讲下 ssh 读 authlog 是啥操作,ssh 不是写 authlog 么,为什么要读
    black11black
        14
    black11black  
    OP
       2020-10-17 00:59:40 +08:00
    @msg7086 而且想了一下 f2b 维护访问计数这个方案还是不是很好,因为理论上你还是希望对方被 ban 后收到的是被 ban 信息,而不是直接把封包吞了,所以应该还是 nginx 那边的方案更好。f2b 可能是比较适合做防火墙啥的,但是大规模 ddos 感觉更复杂一些,跟普通这些防爬虫和灌水机器人的不太一样,不是我能探索的领域了
    msg7086
        15
    msg7086  
       2020-10-17 04:35:30 +08:00
    @black11black 我的意思是 fail2ban 的 SSH jail 会去读 auth.log 。
    同理 fail2ban 的 Nginx jail 可以去读 Nginx 的 access log 。
    fail2ban 就是拿来当防火墙用的,主要是应对攻击。我这边的话还要稍微封一下不太合适的爬虫。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3141 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:57 · PVG 22:57 · LAX 07:57 · JFK 10:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.