这是一个非常高级的问题,答案可能涉及一些系统和套接字级编码(我并不反对),因为现在似乎没有任何现成的功能。我对所有解决方案持开放态度(现成或自行构建。)请提供最好的建议。
我正在构建一个执行第三方提交的测试二进制文件的测试执行环境。测试二进制文件是针对一个善意的测试框架构建的,该框架连接到HTTP服务器,用于在浏览器和被测虚拟设备之间中继测试命令和测试结果。该框架使用户可以轻松地对其测试进行硬编码以连接到静态IP地址和端口号,但不提供外部覆盖机制。编写这些测试二进制文件的人并不总是最流行的工具,因此要求他们做一些基本的操作,如采用动态IP地址和端口号是不可能的。这将为这项免费服务增加太大的障碍。
单个测试二进制文件需要连接到系统上可用的1个浏览器/设备主机HTTP服务器(系统上将有数十个可用。)只允许一个测试二进制文件连接到任何特定的浏览器/设备主机HTTP服务器一次。我从与二进制相关的上下文中知道他们需要连接哪个设备。他们将尝试通过连接到默认IP /端口来连接到它,默认IP是localhost。那时,我想要一个软件坐在那里,根据连接过程的PID将该端口上的连接路由到动态端口。这太神奇了吧?根据请求进程,实际将它们连接到不同的端口。这可以在用户模式下完成吗?是否有一些漂亮的实用程序服务器可用于今天呢?
首选特定于Mac OS X(Lion)的答案,但我很乐意尝试调整适用于其他操作系统的任何解决方案。
答案 0 :(得分:0)
您是否尝试过charlesproxy(Mac)http://www.charlesproxy.com/documentation/或Fiddler(Windows)http://www.fiddler2.com/fiddler2/
两者都允许重写http连接。我知道Fiddler是可编写脚本的,我相信Charles也是如此,但还没有尝试过它
答案 1 :(得分:0)
在基于Linux的操作系统上,我建议使用包装器启动器在应用程序的所有数据包中设置服务类型位。然后,您可以使用iptables规则将带有ToS位的所有数据包放入链中,并执行您需要的任何操作。它不应该要求编写任何软件。
可以通过使用预加载策略来控制对socket
等系统调用的访问,并在套接字上设置选项。服务类型只是一个套接字选项。有关策略的示例,请参阅this paper。我虽然过去曾使用过用户空间包装器,但我现在找不到它。
但是我认为可能使用iptables存在一种更简单的方法。 owner
匹配目标可以根据许多参数进行匹配,例如uid
,gid
,pid
,sid
等。它看起来像是在SMP内核上pid
和sid
匹配不起作用,因此不存在。至少在我运行的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
调整为正在使用的任何端口。