HTTP代理根据主机头选择外部接口

HTTP代理根据主机头选择外部接口

我在工作中有一个非常具体的用例,其中我有几个外部 IP 地址(完整的 C 类),并且我需要选择我正在使用的出站 IP 地址。请求是http,应用服务器是内网的另一台机器。为简单起见,我想将其保留为 http 代理,这样我就不必更改我的应用程序代码。

要求:

  • 代理查找类似“External-Ip: xyza”的标头,并通过具有该外部 IP 地址的接口发送流量。我可以轻松修改标头,因此如果我需要发送接口名称也没关系。
  • 如果标头不存在,代理将随机选择一个标头,然后返回它用作 http 标头的接口。

实现这一目标的最简单方法是什么?

答案1

无论如何,Squid 本身就内置了这个功能。

我使用“acl outbound0 req_header .2$”将名为“outbound0”的 ACL 设置为 .2 外部 IP。我使用脚本生成了剩余的 ACL,并将它们硬编码到配置文件中。

然后,我将它与 tcp_outgoing_address 结合起来,后者根据 ACL 选择外部 IP。结果如下:

acl outbound0 req_header TS-Outbound-IP \.20$
acl outbound1 req_header TS-Outbound-IP \.21$
acl outbound2 req_header TS-Outbound-IP \.22$
acl outbound3 req_header TS-Outbound-IP \.23$
acl outbound4 req_header TS-Outbound-IP \.24$
acl outbound5 req_header TS-Outbound-IP \.25$

tcp_outgoing_address 192.168.1.20 outbound0
tcp_outgoing_address 192.168.1.21 outbound1
tcp_outgoing_address 192.168.1.22 outbound2
tcp_outgoing_address 192.168.1.23 outbound3
tcp_outgoing_address 192.168.1.24 outbound4
tcp_outgoing_address 192.168.1.25 outbound5

目前,这非常适合我们的需要。我将保留这个问题,因为这种方法看起来很笨拙,而且我对替代方案感兴趣。

相关内容