我在工作中有一个非常具体的用例,其中我有几个外部 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
目前,这非常适合我们的需要。我将保留这个问题,因为这种方法看起来很笨拙,而且我对替代方案感兴趣。