提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

之前有 一篇文章 介绍如何在树莓派(Raspberry Pi)上架构基于Squid3的透明代理。在文章后面讲到了如何利用广告黑名单进行广告过滤,但是这个方法比较局限,特别是没有分类要过滤的网页类型。

我今天要讲解的是利用Squid的一个插件(姑且这么称呼吧,因为这个软件是随Squid启动而启动的) SquidGuard ,该软件会在Squid3处理请求的时候检查SquidGuard所管理的网站分类数据库,并根据自定义的规则进行转向(Redirect)拦截。

今天我们实验的平台依旧是树莓派(Raspberry Pi)的Raspbian,首先用 apt-get 先安装:

sudo apt-get install squidguard

安装后数据库所在位置为 /var/lib/squidguard/db ,然后我们需要下载黑名单,SquidGuard官方为我们提供了几个黑名单的数据库( 注意: 严格意义上来说这边也不能称作“黑名单”,只能说是一个网站分类数据库):

我这里选择URLBlacklist.com提供的网站分类数据库,通过下面的命令下载数据库压缩包到 /tmp 路径:

wget -q -c "http://urlblacklist.com/cgi-bin/commercialdownload.pl?type=download&file=bigblacklist" -O /tmp/bigblacklist.tar.gz

注意: URLBlacklist.com对于下载次数有限制,不要使用迅雷等多线程下载工具,一旦超过下载限制就会封锁IP至第二天。

然后解压数据库并拷贝至squidguard的数据库路径 /var/lib/squidguard/db

cd /tmp
tar zxvf bigblacklist.tar.gz
cd blacklists
mv * /var/lib/squidguard/db

修改SquidGuard配置文件 /etc/squidguard/squidGuard.conf

dbhome /var/lib/squidguard/db
logdir /var/log/squidguard

source clients {              # 接入客户端的IP段
  ip 192.168.1.0/24
}

dest ads {                    # 定义一条规则,这里主要针对ads目录下的
  domainlist ads/domains      # 定义域名列表所在位置
  urllist ads/urls            # 定义url列表所在位置
}

dest whitelist {
  domainlist whitelist/domains
  urllist whitelist/urls
}

acl {
  default {
    pass     whitelist !ads all     # 定义规则列表     
    redirect http://192.168.1.1/cgi-bin/block.cgi?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&url=%u
  }
}

这里我简单解释一下, dest 节点指示的是要定义的规则,对应的你可以使用命令 ls /var/lib/squidguard/db 查阅一下你所在的数据库路径的文件夹名字,然后 domainlist 指示的是文件夹下面存放待匹配的域名列表, urllist 则存放URL列表,最后是一条acl控制规则,pass是要通过的规则,按优先级别排序,要拦截的在前面加上感叹号,全部放行则使用 all 指示。如果访问请求被拦截,则转向redirect所指示的URL,建议本地服务器架设个WEB服务,然后对被拦截的请求进行处理,当然可以获取 clientaddr 等客户端信息以便于进一步分析。

注意: 这里最好不要拦截ads规则,因为国内很多正常的门户网站都在这个规则里,这里仅作为讲解演示用。

SquidGuard还有一些有用的特性比如上网时间控制等等,限于篇幅我这里就不一一介绍了,好了,我们配置还没结束,下面接着配置。

将SquidGuard附加到Squid3上面去,以便于Squid3启动SquidGuard并将请求转给其过滤,修改Squid3的配置文件 /etc/squid3/squid.conf ,查找 url_rewrite_program 节,并添加下面一条,具体路径可以通过命令 which squidGuard 获取:

url_rewrite_program /usr/bin/squidGuard

设置好相应文件夹的权限,这里需要注意的是SquidGuard相关资源的用户及组最好和Squid3一致,默认安装的情况下Squid3的用户和组都是proxy,所以我们这里的命令如下:

#  以管理员权限运行
chown -R proxy:proxy /var/log/squidguard
find /var/lib/squidguard/db -type f | xargs chmod 644
find /var/lib/squidguard/db -type d | xargs chmod 755
chown -R proxy:proxy /var/lib/squidguard/db

好了,到这里基本上就结束了,出于性能的考虑,我们还要为规则库生成数据库格式的文档,便于快速索引,通过下面的命令进行:

sudo -u proxy squidGuard -C all

注意:如果你在 squidGuard.conf 配置文件引入的规则比较多的话数据库生成会消耗相应的时间,请耐心等待。

检查日志文件 /var/log/squidguard/squidGuard.log 看是否有错误。

通过下面两条命令之一重新配置Squid3,使得SquidGuard可以正常工作:

sudo squid3 reload
sudo squid3 -k reconfigure

再次检查日志文件 /var/log/squidguard/squidGuard.log 看是否启动成功。也可以观察进程确保SquidGuard顺利启动:

ps aux | grep squid

测试SquidGuard是否正常工作,因为我们使用的是URLBlackList建议到其 查询网站 上找一个在你屏蔽范围内的网站域名或者地址进行测试。

我自己搭建的效果如下:

SquidGuard拦截转向页面

至此我已经介绍完了,Good Luck!

参考来源: SquidGuard-Proxy Server Filter