1

这是一个非常高级的问题,答案可能涉及一些系统和套接字级别的编码(我并不反对),因为今天似乎没有现成的东西可以做到这一点。我对所有解决方案(现成的或自己构建的)持开放态度。请提供您最好的建议。

我正在构建一个执行第三方提交的测试二进制文件的测试执行环境。测试二进制文件是针对一个善意的测试框架构建的,该框架连接到 HTTP 服务器,用于在浏览器和被测虚拟设备之间中继测试命令和测试结果。该框架使用户可以轻松地对其测试进行硬编码以连接到静态 IP 地址和端口号,但不提供外部覆盖机制。编写这些测试二进制文件的人并不总是最聪明的工具,因此要求他们做一些像获取动态 IP 地址和端口号这样基本的事情是不可能的。这将为这项免费服务增加太多的进入障碍。

一个测试二进制文件需要准确地附加到系统上可用的 1 个浏览器/设备主机 HTTP 服务器(系统上将有几十个可用。)只有一个测试二进制文件被允许连接到任何特定的浏览器/设备主机 HTTP 服务器时间。我从与二进制文件关联的上下文中知道它们需要附加到哪个设备。他们将尝试通过连接到默认 IP/端口来附加到它,其中默认 IP 是 localhost。那时,我想要一个软件,它可以根据连接过程的 PID 将该端口上的连接路由到动态端口。这很神奇,对吧?根据请求过程,实际将它们连接到不同的端口。这可以在用户模式下完成吗?今天是否有一些漂亮的实用程序服务器可用?

首选 Mac OS X (Lion) 的特定答案,但我很高兴尝试调整适用于其他操作系统的任何解决方案。

4

2 回答 2

0

你试过 charlesproxy (Mac) http://www.charlesproxy.com/documentation/或 Fiddler (Windows) http://www.fiddler2.com/fiddler2/

两者都允许重写 http 连接。我知道 Fiddler 是可编写脚本的,我相信 Charles 也是如此,但还没有尝试过

于 2013-03-21T21:17:09.367 回答
0

在基于 Linux 的操作系统上,我建议使用包装器启动器来设置来自应用程序的所有数据包中的服务类型位。然后,您可以使用 iptables 规则将具有该 ToS 位的所有数据包放在一个链中,并在那里进行您需要的任何操作。它不需要编写任何软件。

可以通过使用预加载策略来控制对系统调用的访问,例如socket在套接字上设置选项。服务类型只是一个套接字选项。有关该策略的示例,请参阅本文。我虽然过去曾使用过用户空间包装器,但现在找不到了。

但是我认为可能存在使用 iptables 的更简单的方法。owner匹配目标可以基于多个参数进行匹配,例如, uid, gid,pidsid。看起来在 SMP 内核上,pidandsid匹配不起作用,因此不存在。至少在我运行的 Linux 3.2 内核上,它们不存在。如果您以单独的用户身份运行测试二进制文件,这仍然是从测试程序中捕获所有数据包并重新路由的有效方法。您可以在 OUTPUT nat 表中捕获它们并将它们重定向到 DNAT 目标的任何位置。这是一个假设的规则

iptables -t nat -I OUTPUT -m owner --uid-owner softwaretesting -j DNAT --to-destination 192.168.1.1

在这里,运行测试的用户被命名softwaretesting,该用户启动的程序的所有 IP 流量都被重定向到 192.168.1.1。这可能会产生一些意想不到的后果,例如使ssh该用户无法真正工作。既然您说测试框架是 HTTP,您可能只需通过查找端口 80 来匹配它的流量。

iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner softwaretesting -j DNAT --to-destination 192.168.1.1

显然,如果 HTTP 在非标准端口上运行,您必须将其调整80为正在使用的任何端口。

于 2013-03-21T23:55:12.373 回答