欺骗HTTP请求的始发IP地址

时间:2009-07-25 01:11:25

标签: python http networking sockets urllib2

这只需要在单个子网上工作,不得恶意使用。

我有一个用Python编写的负载测试工具,它基本上会在URL上发出HTTP请求。我需要针对基于IP的负载均衡器运行性能测试,因此请求必须来自一系列IP。大多数商业性能工具都提供此功能,但我想将其构建为我自己的。

该工具使用Python的urllib2进行传输。是否可以为构成请求的数据包发送带有欺骗IP地址的HTTP请求?

5 个答案:

答案 0 :(得分:44)

这是对HTTP的误解。 HTTP协议基于TCP。 TCP协议依赖于3次握手来初始化请求。

alt text http://upload.wikimedia.org/wikipedia/commons/archive/c/c7/20051221162333!300px-Tcp-handshake.png

毋庸置疑,如果您欺骗原始IP地址,您将永远不会超过同步阶段,也不会发送任何HTTP信息(服务器无法将其发送给合法主机)。

如果您需要测试IP负载均衡器,则无法实现此目的。

答案 1 :(得分:5)

您想要设置用于连接的源地址。谷歌搜索“urllib2源地址”给出http://bugs.python.org/file9988/urllib2_util.py。我没有尝试过。

您运行的系统需要配置您正在测试的IP。

答案 2 :(得分:5)

快速记录,正如我昨天刚刚学到的那样:

我认为您已暗示您已经知道这一点,但对HTTP请求的任何响应都会转到标头中显示的IP地址。因此,如果您想要查看这些响应,则需要控制路由器并进行设置,以便将欺骗性IP路由回用于查看响应的IP。

答案 3 :(得分:1)

您可以在Linux机器上使用IP别名,并根据需要设置多个IP地址。问题在于,除非将其设置为其他网络并为该网络设置显式路由,否则无法预测IP标头中将标记哪些IP。即 -

current client address on eth0 = 192.168.1.10/24

server-side:
ifconfig eth0:1 172.16.1.1 netmask 255.255.255.0

client-side:
ifconfig eth0:1 172.16.1.2 netmask 255.255.255.0 
route add -net 172.16.1.0/24 gw 172.16.1.1 metric 0

根据需要重复多个子网。重新启动apache以在所有新别名接口上设置侦听器,然后关闭并运行。

答案 4 :(得分:1)

我建议您查看是否可以配置负载均衡器以根据X-Forwarded-For标头做出决定,而不是包含HTTP请求的数据包的源IP。我知道大多数重要的商业负载平衡器都具备这种能力。

如果你不能这样做,那么我建议你可能需要配置一个带有一堆二级IP的linux盒子 - 不要在LB上配置静态路由,只需将你的linux盒子作为默认网关LB设备。