Rewrite

squid 在使用 url_rewrite_program 時在查詢中添加 LAN IP、squid 使用者名和 squid 埠

  • September 13, 2017

我使用 squid 作為帶有 SSL Bump 攔截的透明代理。

Squid HTTP 和 HTTPS 埠配置為:

http_port 3127 transparent
https_port 3129 intercept ssl-bump generate-host-certificates=on cert=/opt/squid/ssl_cert/cert.crt key=/opt/squid/ssl_cert/cert.key options=NO_SSLv2,NO_SSLv3

我編寫了以下 URL 程序來強制安全搜尋 Google 和 duckduckgo :

#!/usr/bin/perl
use strict;
use URI::URL;

# Turn off buffering to STDOUT
$| = 1;

# Read from STDIN
while (<STDIN>) {
   # Do some trimming
   s/^\s*//;
   s/\s*$//;

       my $string = $_;

   # Google Safe search
       if ($string =~ m/^http(s?)\:\/\/([a-z]+\.)?google\.([a-z]{2,3})(\.[a-z]{2,3})?\/.*(\?(as_)?q=)|(\#(as_)?q=)|(\&(as_)?q=)/) {
               #print "OK rewrite-url=\"$string", "&safe=active\"";
               if ($string !~ m/&safe=active/) {
                       print "OK url=\"$string", "&safe=active\"";
                       print "\n";
               } else {
                       print "OK\n";
               }
       }

       # Duckduckgo safe search
       elsif ($string =~ m/^http(s?)\:\/\/([a-z]+\.)?duckduckgo\.([a-z]{2,3})(\.[a-z]{2,3})?/) {
               #print "OK rewrite-url=\"$string", "&kp=1\"";
               if ($string !~ m/&kp=1/) {
                       print "OK url=\"$string", "&kp=1\"";
                       print "\n";
               } else {
                       print "OK\n";
               }
       }

       # If no one match, url still intact
       else {
               print "ERR\n";
       }
}

在 squid 配置中,我添加以下行:

url_rewrite_program /opt/squid/bin/url_rewriter

url_rewriter 在 CLI 中測試時重寫 URL:

./url_rewriter
https://www.google.fr/?q=test
OK url="https://www.google.fr/?q=test&safe=active"
https://www.duckduckgo.com/
OK url="https://www.duckduckgo.com/&kp=1"

它在瀏覽器中完美執行,只是 squid 總是在查詢中添加 LAN IP、使用者名和 squid 埠。例如,它在 Query 中添加:

"%20192.168.1.18/192.168.1.18%20benoit%20GET%20myip=-%20myport=3129"

對於Google我得到這個:

https://www.google.fr/?q=test%20192.168.1.18/192.168.1.18%20benoit%20GET%20myip=-%20myport=3129&safe=active

代替 :

https://www.google.fr/?q=test&safe=active

對於duckduckgo,我得到

https://duckduckgo.com/%20192.168.1.18/192.168.1.18%20benoit%20GET%20myip=-%20myport=3127&kp=1

代替 :

https://duckduckgo.com/&kp=1

為什麼我會有這種行為?我錯過了什麼 ?如果需要,我可以發布更多配置。

我自己找到了解決方案。

是的,我錯過了提供 Squid 的版本,這對我來說是一個重要資訊。我使用版本 3.5.20

squid 3.5中有一個名為url_rewrite_extras的新指令

http://www.squid-cache.org/Doc/config/url_rewrite_extras/

預設情況下,當使用 URL-rewriter/redirector 幫助程序時,它會在每個查詢中添加: “%>a/%>A %un %>rm myip=%la myport=%lp” 。

所以我添加了覆蓋這個值的選項。我不得不設置一個空格作為值,因為**url_rewrite_extras “”**添加一個破折號 “-” 來查詢。

url_rewrite_extras " "
url_rewrite_program /opt/squid/bin/url_rewriter

是的,你錯過了一個小細節。Squid 稍後不會添加 myip= 等內容,而是在將 url 發送到您的重寫器之前。這意味著您必須在將其交還給 squid 之前將其移除。

並非所有版本的 squid 都這樣做,但它記錄在 3.4 版之前

湯姆湯姆湯姆

引用自:https://serverfault.com/questions/872084