我们接管了一个无法修改的旧版 Web 应用程序(源代码已损坏,部署失败),最终将重写。理想情况下,我们会一步一步地迁移它,但这是不可能的,因为我们无法有效地修改应用程序。
我负责重写应用程序,并且我想针对发布到当前 API 的数据测试一些复杂的同步算法。
什么是最容易和最安全捕获传入 HTTP 请求及其所有相关数据的方法是什么?解决方案必须对 API 用户透明。服务器在 Ubuntu Linux 上运行,我们可以通过 SSH 访问它。Web 应用程序在 Ruby 上的 Apache 2 上运行。
- 使用某种数据包嗅探器来捕获传入流量。我必须想办法在我自己的服务器上重放这些请求。
- 将 DNS 更改为指向另一个 IP,该 IP 将捕获并记录请求数据,然后将请求重定向到生产服务器。我认为我们无法访问网络基础设施,因此我认为这必须作为 Web 服务执行,该服务会将带有重定向标头的请求返回到真实服务器。这似乎很脆弱,可能会给浏览器带来安全问题?
- 使用某种 Apache 模块来执行此操作。
上述解决方案在以下方面有何比较:
- 服务器和/或网站瘫痪的风险
- 实施的简易性
请随时建议任何进一步/更好的替代方案。
答案1
我会使用tcpdump
或ngrep
,如果交换机上的端口连接到镜像的 Web 服务器就好了,但如果没有,您可以在服务器本身上运行ngrep
或。tcpdump
您需要超级用户权限才能运行其中任何一个程序。
您将需要阅读一点,因为您显然知道您在流量中寻找什么,ngrep 确实允许您通过正则表达式选择流量,这可能使您能够更准确地挑选出数据包。
ngrep -l -q -d eth0 "^POST " tcp and port 80 -O dump.file
这将获取发送到 eth0 上端口 80 的任何 HTTP 数据。您可能能够挑选出更具体的内容。如果您要直接从文件中读取流量,您可能需要添加,-W byline
因为它使数据包更具可读性,因为它尊重换行符,因此您可以更合乎逻辑地(对人类而言)查看数据包。-O dump.file
将把数据包捕获的输出写入文件。输出可以尽可能详细,要重放数据包,请查看tcpreplay
答案2
最简单、最安全的捕获方法是运行数据包嗅探器,正如您所建议的那样。如果您简单地在网上搜索“重放 http 请求”,您将获得许多可以捕获然后重放您的请求的程序。也有专业的工具可以做到这一点,例如我在工作中使用的“LoadRunner”。
如果您不想安装任何额外的软件,您可以使用它tcpdump -s0 -w /path/to/output.file
来捕获流量。这将为您提供一个文件,您可以使用“tcpdump -A -r /path/to/output.file”读取该文件,大概使用诸如“dst=ip.to.webserver”之类的过滤器。但随后您需要一些东西来重放它。
下面是我在本地主机上使用 tcpdump 的一个例子:
$ tcpdump -i lo0 -s0 -w /tmp/tcpdump.out
同时,我从另一个窗口访问本地主机上的网站;完成后,我将按 ctrl-c 停止 tcpdump
$ sudo tcpdump -r /tmp/tcpdump.out -t -q -n -A 'tcp dst port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
reading from file /tmp/tcpdump.out, link-type EN10MB (Ethernet)
IP 127.0.0.1.57499 > 127.0.0.1.http: tcp 122
E.....@[email protected]................
.9...9..GET /~dyho01/ HTTP/1.0
User-Agent: Wget/1.11.4 Red Hat modified
Accept: */*
Host: localhost
Connection: Keep-Alive
您可能可以通过在 Windows 程序(例如 wireshark)中打开原始 tcpdump 文件来获取相同的信息。
答案3
只要连接没有加密,数据包嗅探器选项就很好,那么您就没救了。在这种情况下,您需要一个代理模型来进行捕获,用户使用 SSL 连接到代理,接受代理证书,然后再次通过 SSL 与代理建立到目标主机的连接。LoadRunner、Jmeter 等测试工具非常适合捕获单个用户的代理对话,以便您检查传递的信息的结构,但对于多个用户的生产使用来说,这并不实用。
我会寻找一个代理服务器包,您可以在其中配置代理以将请求转储到日志以供分析。这样,您就可以在 SSL 之外获得原始请求视图,而无需从数据包级别跟踪中重新组装数据包。