#!/bin/bash
DNS_SERVER=8.8.8.8
BLACKLIST_URL="http://antizapret.prostovpn.org/iplist.txt"
#куда класть файл proxy.pac
PACDIR=/var/www/html
TMPLIST=/tmp/iplist.txt
#домены, которые нужно пускать через прокси независимо от содержимого iplist.txt
DOMAINS=(\
rutracker.org \
facebook.com \
facebook.net \
fbcdn.net \
twitter.com \
twitter.co \
t.co \
twimg.com \
twitpic.com \
periscope.tv \
pscp.tv \
)
#качаем чёрный список
wget -q --tries=10 -O "$TMPLIST" "$BLACKLIST_URL"
# вытаскиваем IP наших прописанных доменов
declare -a EXTRAIPS=()
for domain in "${DOMAINS[@]}"
do
dig A "$domain" +short @$DNS_SERVER | grep -v '\.$' >>"$TMPLIST"
done
#в чёрном списке есть отдельные IP и есть подсети
#также чёрный список очень длинный, поэтому кодируем его более компактно.
IPLIST=`grep -Ex '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' "$TMPLIST" | awk '/^[0-9]+/ {split($1,b,/\./); printf("0x%02x%02x%02x%02x,", b[1],b[2],b[3],b[4]);}'`
SUBNETLIST=`awk '/[0-9.]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+/ {split($1,p,/\//); printf("[\"%s\", %s], ", p[1], p[2]);}' <"$TMPLIST"`
#генерируем proxy.pac по шаблону
#он проверяет домен на вхождение в фиксированные домены, а потом IP по списку.
function templatePAC {
NAME=$1
shift
DMNLIST=("$@")
cat >"$PACDIR/$NAME" <<EOF
function FindProxyForURL(url, host) {
var domainblacklist = [
EOF
for d in "${DMNLIST[@]}"
do
echo " '$d'," >>"$PACDIR/$NAME"
done
cat >>"$PACDIR/$NAME" <<EOF
];
var ipblacklist = [ $IPLIST ];
var subnetblacklist = [ $SUBNETLIST ];
function endsWith(str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
function numberToMask(n) {
var m=[0,128,192,224,240,248,252,254,255];
var r=[];
for (var i=0; i<4; i++) {
var p = (n > 8) ? 8 : n;
r[i] = m[p];
n -= p;
}
return r.join(".");
}
function maskMatch(ip, mask) {
var m = numberToMask(mask[1]);
return isInNet(ip, mask[0], m);
}
var blocked = false;
for (var i=0; !blocked && (i<domainblacklist.length); i++)
blocked = blocked || ((host == domainblacklist[i]) || endsWith(host, '.'+domainblacklist[i]));
if (!blocked) {
var ip = dnsResolve(host);
for (var i=0; !blocked && (i<subnetblacklist.length); i++)
blocked = blocked || maskMatch(ip, subnetblacklist[i]);
blocked = blocked || (ipblacklist.indexOf(convert_addr(ip)) != -1);
}
if (blocked)
return "PROXY ТУТ_ТВОЙ_ПРОКСИ:ПОРТ";
else
return "DIRECT";
}
EOF
}
# генерируем файл
templatePAC proxy.pac "${DOMAINS[@]}"
rm -f "$TMPLIST"