Routing
Http代理根據主機頭選擇外部介面
我在工作中有一個非常具體的案例,我有幾個外部 IP 地址(完整的 C 類),我需要選擇我正在使用的出站 IP 地址。請求是http,應用伺服器是內網不同的機器。為簡單起見,我想將其保留為 http 代理,這樣我就不必更改我的應用程式碼。
要求:
- 代理查找像“External-Ip: xyza”這樣的標頭,並通過具有該外部 IP 地址的介面發送流量。我可以輕鬆地修改標頭,所以如果我需要發送介面名稱就可以了。
- 如果標頭不存在,代理將隨機選擇一個,然後返回它用作 http 標頭的介面。
實現這一目標的最簡單方法是什麼?
對於它的價值,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
目前,這非常適合我們的需要。我會保持這個問題的開放性,因為這種方法看起來很笨拙,而且我對替代方案很感興趣。