即时修改 HTTP url

问题描述 投票:0回答:3

是否可以将用户的HTTP请求修改为

www.example.com/options

而不是

www.example.com/options_and_params

我的场景是大约 30000 个用户连接到我公司的网络主干,我想在主干交换机和 Radware LoadProof 之间添加一台或多台服务器(使用我当前正在处理的代码)来完成这项工作。

整夜谷歌搜索后,我没有任何线索,但还有一些问题:

  1. 我不需要拦截通过网络的每个数据包。借助 iptables 等帮助,我可以过滤出我想要的包。我在使用iptables之前已经做过了。然而,数据包不等于HTTP流。我需要重新构建 HTTP 吗?
  2. 如果我成功找到修改 HTTP 请求 URL 内容的方法,我仍然应该将其放回网络流。据我所知,TCP数据包有一个校验和,我修改内容后肯定是错误的。如何计算新的校验和并将数据包放回网络?

这是我第一次做网络编程或数据包处理开发。任何建议表示赞赏。

network-programming packet-injection
3个回答
1
投票

这取决于您正在执行 HTTP/1.0 还是 HTTP/1.1,以及您需要修改的是初始请求还是单个 HTTP 1.1 会话中的所有请求。

如果您有数据包并且可以在发送之前对其进行修改,并且您尝试仅修改请求,则给定典型数据包的长度以及 HTTP 请求流中 URL 的位置(非常接近开头)并且事实上,它将是 TCP 流中发送的第一件事,我认为您可以相当安全地假设它将出现在发送的第一个数据包的前 N 个字节中,因此不会被拆分为多个数据包。

但是,如果这是 HTTP/1.1 流,则将通过同一 TCP 连接发送多个请求,在这种情况下,将来的请求 URL 很可能会拆分为两个 TCP 数据包。

如果您可以强制使用 HTTP/1.0,或者如果您将初始或所有请求修改为 HTTP/1.0,那么您可以非常确定第一个数据包将对应于 TCP 流的第一个数据包,并且您不太可能查看 URL 拆分为多个数据包,这意味着无需重建并且能够仅进行替换。

然而,这将以新的 TCP 连接为代价,效率相当低。

如果您不这样做并将其保留为 HTTP/1.1,则 URL 可能位于任何未来请求中的任何随机点,因此会拆分为多个 TCP 数据包(实际上给定 URL 的大小为两个数据包)。


0
投票

如果我的问题是正确的,那么这可能可以通过像 nginx 这样的快速反向代理来完成。


0
投票

如果您能够运行自己的代理实例,它将有所帮助:

docker run -p8080:80 \
-e REMOTE_URI='https://www.example.com' \
-e TRANSFORM_REQUEST_URL_SED='s|options_and_params|options|g' \
mgerasimchuk/protty:v0.4.6

在此之后,如果您执行下一个请求

curl localhost:8080/options_and_params

代理实例将从

https://www.example.com/options

返回内容

您还可以使用其他自定义标志和环境变量修改请求和响应正文,请参阅文档:https://github.com/mgerasimchuk/protty

© www.soinside.com 2019 - 2024. All rights reserved.