我们在Load Impact上经常遇到这个问题,所以我想我会将它添加到Stack Overflow社区,以便更容易找到。
问:我有一个无法从Internet访问但位于防火墙后面的站点。我想对它运行Load Impact负载测试,从云端生成流量,但我想确保在负载测试运行时没有其他人可以访问该站点。如何配置防火墙,以便仅将“负载影响”流量转发到我的站点?答案 0 :(得分:1)
由于Load Impact从云提供商(如Amazon AWS和Rackspace)动态分配负载生成器实例,因此您不知道测试中的负载生成器将使用哪些源IP地址。
如果您需要配置防火墙,以便让Load Impact流量通过,则可以执行以下操作之一:
将防火墙打开到您要从中运行负载测试的加载区所使用的所有AWS IP地址。请注意,Rackspace不会透露其IP范围,因此如果您想使用Rackspace加载区进行测试,很遗憾无法知道负载生成器将使用的IP范围。这种方法的缺点是,即使您使用AWS生成流量,您也必须将防火墙打开到相当大的IP范围。
使用HTTP标头,网址查询参数或其他有关您生成的流量的内容来发送标识流量属于负载测试的唯一数据(即某种令牌),然后配置防火墙以查找传入流量中的此数据。请注意,这要求您的防火墙支持扫描应用程序有效内容数据,并根据找到的内容应用规则。它还要求您的防火墙终止SSL连接或使用未加密的HTTP,否则防火墙将无法检查流量。
在您知道测试使用的IP地址后,在开始测试后立即添加防火墙规则。
以下是有关如何执行每种不同备选方案的更详细说明
在这里,您需要查看您正在使用的AWS加载区,然后查找这些AWS数据中心托管的IP地址范围。有关AWS使用的IP范围的更多信息,请参阅http://support.loadimpact.com/knowledgebase/articles/174262-what-ip-addresses-do-load-impact-use-to-generate-l。
您可以将自定义HTTP标头添加到用户方案代码中的任何请求中,如下所示:
http.request_batch({
{"GET", "http://test.loadimpact.com/", headers={ ["X-Myheader"]="TOKEN_STRING"} }
}
您需要在每个请求中添加“headers =”参数。
如果您不依赖于负载测试中的模拟用户假装是某个用户代理,您还可以使用http.set_user_agent_string()函数为所有后续请求设置“User-Agent”标头。然后,该标头可以包含您的令牌值,您不必修改用户场景中的每个HTTP请求。
如果查询参数不会干扰应用程序的功能,您也可以使用查询参数:
http.request_batch({
{"GET", "http://test.loadimpact.com/?firewall_token=TOKEN_STRING" }
}
另一个选项可能是请求来自DNS中不在的某个主机名的内容,但您的站点当然需要配置为响应对该主机名的请求。这就是你在Load Impact方面的做法:
-- Map a secret hostname to the IP of our server (need to do this if the hostname is not in the public DNS)
util.dns_remap('very_difficult.to.guess.hostname.com', '44.55.66.77')
-- Make all your requests go to this hostname
http.request_batch({
{"GET", "https://very_difficult.to.guess.hostname.com" }
}
这会将Host:标头设置为包含字符串“very_difficult.to.guess.hostname.com”
当然,除非您的防火墙终止SSL流量或流量未加密,否则任何依赖于您的防火墙能够检查HTTP标头或类似信息的解决方案都将无效。
在许多情况下,这可能是最好的方法,因为它非常简单,几乎在所有情况下都可以使用,而且相当安全。缺点是您需要为运行的每个负载测试重新配置一次防火墙。这意味着您开始测试然后找出负载生成器正在使用哪些IP,然后快速设置允许来自这些IP的传入流量的防火墙规则。为了方便这种方法,您可能希望设计用户场景,以便它们执行以下操作:
if client.get_id() == 1 then
log.info('Load generator IP address: ' .. client.get_load_generator_ip())
end
client.sleep(300)
...
[rest of user scenario]
这将导致每个负载生成器使客户端/ VU线程#1在测试结果页面的“日志”窗口中打印出负载生成器的IP地址。在开始执行之前,所有线程都会等待300秒(5分钟),让您花5分钟更新防火墙规则,让流量从发生器使用的所有IP地址开始。
请注意,在这种情况下,每个客户端将通过休眠300秒开始,因此测试增加将延迟那么长。 “客户端活动”图表会有点误导,因为它还会显示仍在执行初始睡眠的客户端。如果你想避免这种情况,你可以跳过sleep()语句,如果你不关心测试期间的第一分钟左右测试结果是否正确(当VU因为防火墙阻塞他们而遇到连接问题时)。