Transparent squid proxy for specific domain, normal proxy for others, same port?

时间:2019-01-18 18:34:44

标签: proxy squid

I have a Squid proxy running on IP 10.x.y.z:3128. The configuration is below. It works correctly on browsers configured to access it.

Now I need for a specific server (ServerA) to be able to access a specific external domain (www.example2.com) using the proxy but without using the proxy for any other requests... I'm not able to use any kind of proxy scripts or do any additional configuration on that server.

I already tried using a redirect_program for that specific domain (shown below).

I configured the following entry on ServerA' hosts file:

10.x.y.z        www.example.com

I was expecting that every time an application on ServerA would need to talk to www.example.com it would go through the proxy. And then the redirect program would rewrite the request for the www.example2.com.

But instead I get:

Invalid URL

Some aspect of the requested URL is incorrect.

Some possible problems are:

•Missing or incorrect access protocol (should be “http://” or similar)
•Missing hostname
•Illegal double-escape in the URL-Path
•Illegal character in hostname; underscores are not allowed.

Your cache administrator is root.

What am I doing wrong?

Here's the /etc/squid/squid.conf

#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
acl allow_whitelist dstdomain .windows.net
acl allow_whitelist dstdomain .cloudapp.net



# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
#http_access allow localhost
http_access allow allow_whitelist

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

dns_nameservers 8.8.8.8 8.8.4.4


redirect_program /usr/local/bin/redirect_test.pl

Here's the /usr/local/bin/redirect_test.pl

#!/usr/bin/perl
use strict;

# Turn off buffering to STDOUT
$| = 1;

# Read from STDIN
while (<>) {

    my @elems = split; # splits $_ on whitespace by default

    # The URL is the first whitespace-separated element.
    my $url = $elems[0];

    # Handle local IP links and translate them to https://hooks.slack.com
    # with the rest of the URL intact (if present) and ignore warnings.
    # 192.168.1.220:3128
    if ($url =~ m#^http://www\.example\.com:3128(/.*)?#i) {

        $url = "https://www.example2.com${1}";

        print "$url\n";

    }

    else {

        # Unmodified URL
        print "$url\n";

    }
}

0 个答案:

没有答案