如何通過同一台機器上的 squid 代理強制來自 webserver/PHP 的傳出請求?
我有一個配置為 nginx Web 伺服器的 Debian Squeeze VPS。出於安全原因,我已經阻止了所有傳出連接,除了那些到 Debian 更新伺服器的連接(這可以阻止壞腳本呼叫 home)。PHP 也可以在單獨的使用者下執行。我的問題如下:
各種 CMS-s 和 PHP/Perl/Python 應用程序需要訪問其他伺服器上的 Web 服務(即進行傳出 HTTP 連接)。我已經在同一個VPS上安裝了 squid,並希望通過將允許的域列入白名單,將其用作透明過濾器/代理。
我知道如何通過代理強制所有傳出埠 80 連接,但這會導致代理自己的請求被重定向到自身(即無限循環)。我也不能將 ipt_owner 模組用於 iptables,因為 VPS 公司明確告訴我他們不會安裝它。
是否有另一種巧妙的方法來強制所有其他 HTTP 傳出請求通過同一台機器上的 squid 代理,同時允許代理自己的請求傳出?
如果有幫助,我還安裝了 csf。
謝謝!
好的,回答我自己的問題:
Squid 允許您在其傳出數據包上設置 TOS。設置是 tcp_outgoing_tos 。因此,使用允許的 IP 或域創建一個 acl 並設置,例如,
tcp_outgoing_tos 0x10 whitelist
來自其他應用程序的數據包通常具有 TOS 0x0。
現在按照 squid 自己的教程http://wiki.squid-cache.org/ConfigExamples/Intercept/LinuxLocalhost#iptables_configuration中的步驟進行操作,但不是匹配數據包的所有者,而是匹配 TOS。
# handle connections on the same box (SQUIDIP is a loopback instance) iptables -t nat -A OUTPUT -p tcp --dport 80 -m tos --tos 0x10 -j ACCEPT iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination SQUIDIP:3127
使用 csf 時,我們可能還需要在過濾表的 OUTPUT 鏈上接受這些數據包。將規則放在鏈的開頭。
iptables -I OUTPUT -p tcp --dport 80 -m tos --tos 0x10 -j ACCEPT