V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dust0522
V2EX  ›  程序员

真没见过这种问题,求帮助

  •  
  •   dust0522 · 2023-07-17 08:29:19 +08:00 · 4077 次点击
    这是一个创建于 487 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前提:公司有两台转发服务器,一台 nginx ,一个 IIS 服务,有一个用户信息图片上传接口,已经稳定运行 2 年。
    现在有一个用户上传的报文,发到哪个服务器上,哪个服务器就会断连大概 3-5 分钟左右。
    报文格式就是 JSON 加 base64 ,因为图片涉及用户身份证信息没法发。
    服务器端没有错误日志。
    抓包的看了下,上面是正常 tcp 分片的报文,下面突然是客户端突然没应答了?但是服务端已经收不了请求了。
    请求第一次响应 read ECONNRESET 然后再请求响应啥都是 connect ECONNREFUSED
    整崩溃了。
    [Imgur]( )
    29 条回复    2023-07-18 08:39:06 +08:00
    dust0522
        1
    dust0522  
    OP
       2023-07-17 08:35:41 +08:00
    报文也不大就 214KB
    leaves615
        2
    leaves615  
       2023-07-17 08:36:51 +08:00   ❤️ 1
    模拟测试下的 json 不同包大小,找临界点。有可能是网络 cache 或者什么参数超出。导致无法处理请求。
    dust0522
        3
    dust0522  
    OP
       2023-07-17 08:44:33 +08:00
    对了,nginx 会报这个,[info] 407539#0: *6273 recv() failed (104: Connection reset by peer), client: 客户端地址, server: localhost, request: "POST /hk/bms-front/agentMerchantUploadImage HTTP/1.1", host: "服务端地址"
    dust0522
        4
    dust0522  
    OP
       2023-07-17 08:46:38 +08:00
    @leaves615 我试试,找不到有用的日志,很头疼
    wuruorocks
        5
    wuruorocks  
       2023-07-17 08:50:04 +08:00
    也许服务程序有 bug ,处理这种请求时挂掉了? 能复现就还好办
    dust0522
        6
    dust0522  
    OP
       2023-07-17 08:52:43 +08:00
    跳过转发服务器,直接请求程序是没问题的,现在在测试上还复现不了,还在搭环境
    leaves615
        7
    leaves615  
       2023-07-17 08:55:17 +08:00
    @dust0522 #3
    上游服务器/应用的问题。 一般有以下情况问题:
    应用 tcp 队列满了,未及时释放。
    应用 tcp 缓冲区满了,未及时释放。
    系统 tcp 队列满了,未及时释放。
    系统 tcp 缓冲区满了,未及时释放。

    调优相关参数。 一个一个测试。 这种问题,除非把网络 debug 日志开启来查询,在应用层是看不出具体问题。


    -------
    前段时间处理过 服务器间歇性无法连接( rst )。 最终定位就是 linux tcp 队列满了未及时释放导致的。
    liuidetmks
        8
    liuidetmks  
       2023-07-17 09:11:21 +08:00
    有没可能那个用户在攻击?屏蔽即可,别费脑子了
    vainl1
        9
    vainl1  
       2023-07-17 09:18:44 +08:00   ❤️ 1
    换另外一个用户上传该报文,是否复现?
    该用户上传其他报文,是否复现?
    如果第一个答案为是,第二个为否,可能为触发了某防火墙规则,链接被重置了。
    之前在某 cms 后台上传模板文件,网站模板中包含边境区域地名,出现类似情况,删除模板中该地区后模板即可正常上传。其中服务器位于北京,网站域名也已经备案过。
    dust0522
        10
    dust0522  
    OP
       2023-07-17 09:22:36 +08:00
    是,否。报文都是 base64 的图片数据 @vainl1
    dust0522
        11
    dust0522  
    OP
       2023-07-17 09:23:19 +08:00
    @liuidetmks 我也想给他 ban 了,但是在领导那说不过去啊,base 的图片也能植入攻击吗
    nenseso
        12
    nenseso  
       2023-07-17 09:37:07 +08:00
    mark 一下,如果测试环境不能复现,会不会是那个客户的网络问题,上传图片过程中自己掐断的呢?
    yulgang
        13
    yulgang  
       2023-07-17 09:37:44 +08:00
    Nginx 是不是设置了 proxy_buffering ,把内存耗光了。
    vainl1
        14
    vainl1  
       2023-07-17 09:40:34 +08:00
    @dust0522 那基本可以确定为触发了某防火墙规则,可能的话在上传之前对数据再做其他形式的编码或加密,接收后再解码或解密。
    另外顺带一提,利用此规则直接发送此类的数据包,可以很容易制造 DOS 攻击,而且直接单个发包即可达成攻击。
    littlefishcc
        15
    littlefishcc  
       2023-07-17 09:42:16 +08:00
    能复现的问题都不是问题。
    构建一模一样的数据包发给服务器看是否能复现,如果能复现,那么不断屏蔽业务功能,不断缩小范围,总能找到问题。

    如果不能复现,那就只能要用户帮忙测试了,先确定大的方向,再不断排查。
    sadfQED2
        16
    sadfQED2  
       2023-07-17 10:06:02 +08:00 via Android
    把请求录制下来?只要能够稳定复现,那就很好调试了
    dust0522
        17
    dust0522  
    OP
       2023-07-17 10:11:13 +08:00
    @vainl1 感谢,中间防火墙给拒绝了
    dust0522
        18
    dust0522  
    OP
       2023-07-17 10:11:27 +08:00
    @nenseso 防火墙干的
    dust0522
        19
    dust0522  
    OP
       2023-07-17 10:16:54 +08:00
    @vainl1 防火墙这个规则咋触发的,真离谱啊。。。
    Pythoner666666
        20
    Pythoner666666  
       2023-07-17 13:00:43 +08:00
    有点意思啊,base64 之后 怎么能够处罚防火墙的的规则
    hopingtop
        21
    hopingtop  
       2023-07-17 13:56:06 +08:00
    有没有大佬,继续讨论一下 触发防火墙的规则的问题?

    是因为 base64 中的某段数据假设 '3122ABC' = '我是恶意的'
    防火墙规则 base64('我是恶意的') ,然后 base64(image).Match(base64(Rule)) ?
    防火墙发现是 base64 的编码,就用规则 base64 之后再去匹配?
    tool2d
        22
    tool2d  
       2023-07-17 14:13:07 +08:00
    你包都抓下来了,回测一下就可以了。

    你这防火墙估计有点水。
    kkkbbb
        23
    kkkbbb  
       2023-07-17 15:18:37 +08:00
    怎么能看下是防火墙的什么规则导致触发这种情况,还有它的处理行为具体是什么怎么查看呢,我也挺好奇的
    kkkbbb
        24
    kkkbbb  
       2023-07-17 16:43:15 +08:00
    @hopingtop 我比较好奇的是触发防火墙规则导致当前客户端无法访问能理解,但还能导致服务器断连?把其他所有正常的请求也给拒绝了?
    Pythoner666666
        25
    Pythoner666666  
       2023-07-17 18:30:36 +08:00
    有没有大佬出来解释下 这个很费解啊
    documentzhangx66
        26
    documentzhangx66  
       2023-07-17 18:50:23 +08:00   ❤️ 1
    1.楼主基础不牢。这种提问,至少需要提供网络拓扑图与系统架构图。

    排查过程也很简单,先抓用户报文。nginx 报错抓不到,把 ningx 停了,改用 Client 跑 postman + Server 用 socat 监听,如果有其他用户请求干扰调试,用 iptables 筛选用户 IP 。通过这方式,试图把流量导入到 socat ,会发现 socat 也抓不到,继续考虑系统被破坏,或者用户到 Server 的链路有问题。拿一个干净系统过来 socat ,也会报错,那肯定是链路有问题。然后整个链路一环一环旁通,最后很容易定位到防火墙。

    2.建议楼主认真补习一下计算机专业本科的网络原理与设计一课。 如果不喜欢学院派风格的课程方式,推荐 B 站视频教程:
    https://www.bilibili.com/video/BV1th4y1d7kR
    dust0522
        27
    dust0522  
    OP
       2023-07-18 08:35:17 +08:00
    @documentzhangx66 感谢,确实网络基础很差
    dust0522
        28
    dust0522  
    OP
       2023-07-18 08:37:52 +08:00
    @kkkbbb 这个跟公司网络架构有关
    dust0522
        29
    dust0522  
    OP
       2023-07-18 08:39:06 +08:00
    防火墙规则确实看不了,我们没权限,但确定是防火墙的问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5713 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 03:12 · PVG 11:12 · LAX 19:12 · JFK 22:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.