#!/usr/bin/perl
# usage in squid.conf :
# url_rewrite_program /usr/local/bin/squidredirect.pl
# maybe you have to allow this in apparmour
# choose your fighter, e.g. this one: http://www.surbl.org/lists#multi
# define the $redir
use strict;
use File::Temp qw/ tempfile tempdir /;
use Net::DNS;
use Sys::Syslog;
my $bl = '.multi.surbl.org'; # DNSBL to use
my $ns = '127.0.0.1'; # NameServer to use, preferably your local caching named
my $redir = your replacement URL ; # Block-URL to use, maybe a PNG just in case its just a pic that's blocked
my $res = Net::DNS::Resolver->new; # resolver
my $url; # URL to check, later stripped down to hostname
my $rest; # not needed other infos we get from Squid
my $question; # question to DNS
my $query; # query-result from DNS
my $answer; # answer to Squid
openlog('squidredir', 'pid', 'local0'); # incude PID because Squid starts a bunch of us
$res->nameservers($ns); # contact NameServer
$| = 1; # line buffered
syslog("info", "starting");
while (<>){ # for evey request from Squid
chomp;
syslog("debug", $_);
($url, $rest) = split(/ /, $_); # first column is the requested target URL
$url =~ s/^https?:// ; # drop scheme
$url =~ s:^[/]{2}:: ; # drop / slashes
$url =~ s:/.*$:: ; # drop path
$url =~ s/:.*$// ; # drop port
$answer = "OK"; # set default answer to Squid
$question = $url . $bl; # define the questions to DNS
$query = $res->search($question); # ask DNSBL
if ($query) { # we got an answer
foreach my $rr ($query->answer) { # go through all parts
next unless $rr->type eq "A"; # skip all but A-entris (normal IPv4)
$answer = "OK status=301 url=\"$redir\""; # all other answers mean 'is a bad host' -> Redirect
}
}
syslog("info", "$question $answer");
print "$answer\n"; # send answer back to Squid
}
syslog("info", "stopping");
Comments
0 B
|👍
/👎