我们接pipe了一个我们无法修改的遗留Web应用程序(源代码被破坏,部署失败),最终我们将重写。 理想情况下,我们会一步一步地迁移它,但这是不可能的,因为我们不能有效地修改应用程序。
我负责重写应用程序,并且还有一些复杂的同步algorithm,我想根据当前API发布的数据进行testing。
用所有相关数据捕获传入HTTP请求的最简单和最安全的方法是什么? 该解决scheme必须对API用户透明。 服务器在Ubuntu Linux上运行,我们可以通过SSH访问它。 Web应用程序在Ruby上运行在Apache 2上。
上述解决scheme如何比较:
请随时提出任何进一步/更好的select。
我将使用tcpdump或ngrep ,将交换机上的端口连接到Web服务器镜像将会很好,但是如果没有,您可以在服务器上运行ngrep或tcpdump 。
您将需要超级用户访问权限才能运行这些程序。
你会想要读一下,因为你显然知道你在找什么stream量,ngrep确实允许你select正则expression式的stream量,这可能允许你select更准确的数据包。
ngrep -l -q -d eth0 "^POST " tcp and port 80 -O dump.file
这会让你把任何HTTP数据发送到eth0上的端口80。 你可能能够挑出更具体的东西。 如果您要直接从文件中读取stream量,则可能需要添加-W byline因为它使得数据包更具可读性,因为它遵守换行符,因此您可以看到更多的逻辑写出的数据包)。 -O dump.file将把数据包捕获的输出写入文件。 输出可以像你想的那样详细,重放数据包,看看tcpreplay
捕获它的最简单和最安全的方法是简单地运行一个数据包嗅探器,正如你所build议的。 如果你只是做一个“重放http请求”的网页search,你会得到任何数量的程序,可以捕捉然后重播你的请求。 还有专业的工具,例如在我的工作中使用的“LoadRunner”。
如果你不想安装任何额外的软件,你可以使用tcpdump -s0 -w /path/to/output.file来捕获stream量。 这会给你一个你可以读取的文件,使用“tcpdump -A -r /path/to/output.file”,大概使用诸如“dst = ip.to.webserver”之类的filter。重播它的东西。
这里是我在localhost上使用tcpdump的一个例子:
$ tcpdump -i lo0 -s0 -w /tmp/tcpdump.out
同时我从另一个窗口访问localhost上的一个网站; 一旦完成,我将按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文件来获得相同的信息。
数据包嗅探器选项是一个很好的select,只要连接没有encryption就行,那么你将是SOL。 在这种情况下,您将需要一个捕获的代理模型,其中用户使用SSL连接到代理,接受代理证书,然后到代理的连接再次在目标主机的SSL下。 诸如LoadRunner,Jmeter之类的testing工具对于为单个用户捕获代理对话是很好的,以允许你检查被传递的信息的结构,但是对于多个用户的生产使用是不切实际的。
我会寻找一个代理服务器软件包,你可以configuration代理将请求转储到日志进行分析。 通过这种方式,您可以在SSL之外获得原始请求的视图,并且必须从数据包级跟踪中重新组合数据包。