牛仔在端口 80 上丢弃一些数据包

Posted

技术标签:

【中文标题】牛仔在端口 80 上丢弃一些数据包【英文标题】:Cowboy drop some packets on port 80 【发布时间】:2017-03-11 06:28:57 【问题描述】:

我在 elixir 插件中运行应用程序,当我在端口 80 上运行这个 api 应用程序时,它会丢弃一些数据包并直接从牛仔响应 400 错误请求,它甚至没有记录或其他任何东西。当我们调试它时,我们发现,在获取牛仔请求处理程序时,一些标头值被丢弃了。

我们在 AWS 负载均衡器下运行,当我们都在 8080 上运行时,一切都很完美,但是当我们放入 80 数据包开始丢弃时,有人知道解决方法吗?

我们提出了第一个请求:

"POST /ver2/user/update_token HTTP/1.1\r\nhost: int.oktalk.com\r\nAccept: /\r\nAccept-Encoding: gzip, deflate\r\ nAccept-Language: en-GB,en;q=0.8,en-US;q=0.6,it;q=0.4\r\nCache-Control: no-cache\r\nContent-Type: application/json\r\ nOrigin:铬扩展:// fhbjgbiflinjbdggehcddcbncdddomop \ r \ nPostman令牌:05f463a4-db55-6025-5cc1-f62b83db7c93 \ r \ ntoken:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxNH0.Ind - phmd5saXMjBVjgRKNcCEL60qZoCbHggu-iAqY8 \ r \ n用户代理:Mozilla的/ 5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/54.0.2840.71 Safari/537.36\r\nX-Forwarded-For: 27.34.245.42\r\nX-Forwarded-Port: 80\r \nX-Forwarded-Proto: http\r\nContent-Length: 103\r\nConnection: keep-alive\r\n\r\n"

第一个请求的响应:200 OK

我们再次发出了相同的 API 调用作为第二个请求。我们看到的是前一个数据包的内容长度是 103,而前 103 个字节在下一个数据包中看不到。我猜系统认为前 103 个字节属于前一个数据包本身。

"e\r\nAccept-Language: en-GB,en;q=0.8,en-US;q=0.6,it;q=0.4\r\nCache-Control: no-cache\r\nContent-类型:application / JSON \ r \ nOrigin:铬扩展:// fhbjgbiflinjbdggehcddcbncdddomop \ r \ nPostman令牌:0e52f1b6-120a-c321-2ba4-d6d20d5eb479 \ r \ ntoken:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxNH0.Ind - phmd5saXMjBVjgRKNcCEL60qZoCbHggu-iAqY8 \ r \nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36\r\nX-Forwarded-For: 27.34.245.42\r\nX -Forwarded-Port: 80\r\nX-Forwarded-Proto: http\r\nContent-Length: 103\r\nConnection: keep-alive\r\n\r\n"

对此的响应:我看到的 400 bad Request 是因为缺少第一个露水字节。

我们正在使用 Elixir.Plug 和牛仔

【问题讨论】:

"当我们调试它时,我们发现,在获取牛仔请求处理程序时,一些标头值被丢弃了"哪些值被丢弃了?你能扩展一下吗? @Dogbert 请检查问题,我已编辑 【参考方案1】:

对于发现此问题的其他人(如我),请确保您没有忽略任何从 Plug.Conn 函数返回的 conn 结构。

this issue 中对这个问题进行了完整的概述,并附有一个 gif 来说明这是如何出错的。

【讨论】:

以上是关于牛仔在端口 80 上丢弃一些数据包的主要内容,如果未能解决你的问题,请参考以下文章

C#多播UDP数据包丢弃,同时存储对象

如果您将 dst 端口为 80 的 TCP 数据包发送到在端口 80 处提供 http 请求的主机,会发生啥?

Ensp配置Trunk接口

在 Linux 上模拟延迟和丢弃的数据包

iptables 添加80端口规则

浅谈ACL(访问控制列表)