squid + dansguardian + iptable 实现网页过滤

dansguardian 能真正实现内容过滤, 不仅能过滤网站, URL ,还能过滤网页里包含的一些词、还有 mime 类型等。 DansGuardian 中有一些鉴别文档,类似黑白名单,可以向相应的文档里输入所要控制的相应内容,再重启 DansGuardian 即可生效。

工作 原理

dansguardian 默认监听 8080 端口,默认的 squid 代理端口为 3128 dansguardian 将得到的 http 请求转发给 squid ,然后再从 squid 将响应转发给用户 ,在这个过程 中进行过滤

1.下好squid和dansguardian 源码

./configure ;make;make install

安装好后squid应该在/usr/local/squid/ 下

dansguardian在/usr/local/etc下( 如果觉得这个目录不舒服可以在用./configure --prefix= 替代./ configure ,此时, 会改装到/etc /dansguardian/ 下)

2.运行Squid

2.1 squid命令行选项

在开始其他事情之前,让我们先看一下squid的命令行选项。这里的许多选项你从不会使用,另外有些仅仅在调试问题时有用。

-a port

指定新的http_port值。该选项覆盖了来自squid.conf的值。然而请注意,你能在squid.conf里指定多个值。-a选项仅仅覆盖配置 文件里的第一个值。(该选项使用字母a是因为在Harvest cache里,HTTP端口被叫做ASCII端口)

-d level

让squid将它的调试信息写到标准错误(假如配置了,就是cache.log和syslog)。level参数指定了显示在标准错误里的消息的最大等 级。在多数情况下,d1工作良好。请见16.2章关于调试等级的描述。

-f file

指定另一个配置文件。

-h

显示用法。

-k function

指 示squid执行不同的管理功能。功能参数是下列之一:reconfigure, rotate, shutdown, interrupt, kill, debug, check, or parse. reconfigure导致运行中的squid重新读取配置文件。rotate导致squid滚动它的日志,这包括了关闭日志,重命名,和再次打开它们。 shutdown发送关闭squid进程的信号。interrupt立刻关闭squid,不必等待活动会话完成。kill发送KILL信号给squid, 这是关闭squid的最后保证。debug将squid设置成完全的调试模式,假如你的cache很忙,它能迅速的用完你的磁盘空间。check简单的检 查运行中的squid进程,返回的值显示squid是否在运行。最后,parse简单的解析squid.conf文件,如果配置文件包含错误,进程返回非 零值。

-s

激活将日志记录到syslog进程。squid使用LOCAL4 syslog设备。0级别调试信息以优先级LOG_WARNING被记录,1级别消息以LOG_NOTICE被记录。更高级的调试信息不会被发送到 syslogd.你可以在/etc/syslogd.conf文件里使用如下接口:

local4.warning                     /var/log/squid.log

-u port

指定另一个ICP端口号,覆盖掉squid.conf文件里的icp_port。

-v

打印版本信息。

-z

初始化cache,或者交换,目录。在首次运行squid,或者增加新的cache目录时,你必须使用该选项。

-C

阻止安装某些信号句柄,它们捕获特定的致命信号例如SIGBUS和SIGSEGV。正常的,这些信号被squid捕获,以便它能干净的关闭。然而,捕获这 些信号可能让以后调试问题困难。使用该选项,致命的信号导致它们的默认动作,通常是coredump。

-D

禁止初始化DNS测试。正常情况下,squid直到验证它的DNS可用才能启动。该选项阻止了这样的检测。你也能在squid.conf文件里改变或删除 dns_testnames选项。

-F

让squid拒绝所有的请求,直到它重新建立起存储元数据。假如你的系统很忙,该选项可以减短重建存储元数据的时间。然而,如果你的cache很大,重建 过程可能会花费很长的时间。

-N

阻止squid变成后台服务进程。

-R

阻止squid在绑定HTTP端口之前使用SO_REUSEADDR选项。

-V

激活虚拟主机加速模式。类似于squid.conf文件里的httpd_accel_host virtual指令。

-X

强迫完整调试模式,如你在squid.conf文件里指定debug_options ALL,9一样。

-Y

在重建存储元数据时,返回ICP_MISS_NOFETCH代替ICP_MISS.忙碌的父cache在重建时,该选项可以导致最少的负载。请见 10.6.1.2章。

 

2.2 对配置文件查错

在开启squid之前,你应该谨慎的验证配置文件。这点容易做到,运行如下命令即可:

%squid -k parse

假如你看不到输出,配置文件有效,你能继续后面的步骤。然而,如果配置文件包含错误,squid会告诉你:

squid.conf line 62: http_access allow okay2

aclParseAccessLine: ACL name 'okay2' not found.

这里你可以看到,62行的http_access指令指向的ACL不存在。有时候错误信息很少:

FATAL: Bungled squid.conf line 76: memory_pools

在这个情形里,我们忘记了在76行的memory_pools指令后放置on或off. 建议你养成习惯:在每次修改配置文件后,使用squid -k parse。假如你不愿麻烦,并且你的配置文件有错误,squid会告诉你关于它们而且拒绝启动。假如你管理着大量的cache,也许你会编辑脚本来自动 启动,停止和重配置squid。你能在脚本里使用该功能,来确认配置文件是有效的。

 

2.3 初始化cache目录

在初次运行squid之前,或者无论何时你增加了新的cache_dir,你必须初始化cache目录。命令很简单:

%squid -z

对UFS相关的存储机制(ufs,aufs,and diskd;见第8章),该命令在每个cache_dir下面创建了所需的子目录。你不必担心squid会破坏你的当前cache目录(如果有的话)。

在该阶段属主和许可权是通常遇到的问题。squid在特定的用户ID下运行,这在squid.conf文件里的cache_effective_user 里指定。用户ID必须对每个cache_dir目录有读和写权限。否则,你将看到如下信息:

Creating Swap Directories

FATAL: Failed to make swap directory /usr/local/squid/var/cache/00:

(13) Permission denied

在这样的情形下,你该确认/usr/local/squid/var/cache目录的所有组成都可被squid.conf给定的用户ID访问。最终的组 件--cache目录--必须对该用户ID可写。

cache目录初始化可能花费一些时间,依赖于cache目录的大小和数量,以及磁盘驱动器的速度。假如你想观察这个过程,请使用-X选项:

%squid -zX

 

2.4 在终端窗口里测试squid

一旦你已经初始化cache目录,就可以在终端窗口里运行squid,将日志记录到标准错误。这样,你能轻易的定位任何错误或问题,并且确认squid是 否成功启动。使用-N选项来保持squid在前台运行,-d1选项在标准错误里显示1级别的调试信息。

%squid -N -d1

你将看到类似于以下的输出:

2003/09/29 12:57:52| Starting Squid Cache 

version 2.5.STABLE4 for i386-unknown-freebsd4.8...

2003/09/29 12:57:52| Process ID 294

2003/09/29 12:57:52| With 1064 file descriptors available

2003/09/29 12:57:52| DNS Socket created on FD 4

2003/09/29 12:57:52| Adding nameserver 206.107.176.2 from /etc/resolv.conf

2003/09/29 12:57:52| Adding nameserver 205.162.184.2 from /etc/resolv.conf

2003/09/29 12:57:52| Unlinkd pipe opened on FD 9

2003/09/29 12:57:52| Swap maxSize 102400 KB, estimated 7876 objects

2003/09/29 12:57:52| Target number of buckets: 393

2003/09/29 12:57:52| Using 8192 Store buckets

2003/09/29 12:57:52| Max Mem size: 8192 KB

2003/09/29 12:57:52| Max Swap size: 102400 KB

2003/09/29 12:57:52| Rebuilding storage in /usr/local/squid/var/cache (DIRTY)

2003/09/29 12:57:52| Using Least Load store dir selection

2003/09/29 12:57:52| Set Current Directory to /usr/local/squid/var/cache

2003/09/29 12:57:52| Loaded Icons.

2003/09/29 12:57:52| Accepting HTTP connections at 0.0.0.0, port 3128, FD 11.

2003/09/29 12:57:52| Accepting ICP messages at 0.0.0.0, port 3130, FD 12.

2003/09/29 12:57:52| WCCP Disabled.

2003/09/29 12:57:52| Ready to serve reques

假如你看到错误消息,你该首先修正它。请检查输出信息的开始几行以发现警告信息。最普通的错误是文件/目录许可问题,和配置文件语法错误。假如你看到一条 不引起注意的错误消息,请见16章中关于squid故障处理的建议和信息。如果还不行,请检查squid FAQ,或查找邮件列表来获得解释。

一 旦你见到"Ready to serve requests"消息,就可用一些HTTP请求来测试squid。配置你的浏览器使用squid作为代理,然后打开某个web页面。假如squid工作 正常,页面被迅速载入,就象没使用squid一样。另外,你可以使用squidclient程序,它随squid发布:

% squidclient http://www.squid-cache.org/

假如它正常工作,squid的主页html文件会在你的终端窗口里滚动。一旦确认squid工作正常,你能中断squid进程(例如使用ctrl-c)并 且在后台运行squid。

 

2.5 将squid作为服务进程运行

正常情况下你想将squid以后台进程运行(不出现在终端窗口里)。最容易的方法是简单执行如下命令:

%squid -s

-s 选项导致squid将重要的状态和警告信息写到syslogd。squid使用LOCAL4设备,和LOG_WARNING和LOG_NOTICE优先 权。syslog进程实际可能会或不会记录squid的消息,这依赖于它被如何配置。同样的消息被写进cache.log文件,所以假如你愿意,忽略-s 选项也是安全的。

当你不使用-N选项来启动squid,squid自动在后台运行并且创建父/子进程对。子进程做所有的实际工作。父进程确 认子进程总在运行。这样,假如子进程意外终止,父进程启动另外一个子进程以使squid正常工作。通过观察syslog消息,你能看到父/子进程交互作 用。

Jul 31 14:58:35 zapp squid[294]: Squid Parent: child process 296 started

这里显示的父进程ID是294,子进程是296。当你查看ps的输出,你可以看到子进程以(squid)形式出现:

% ps ax | grep squid
294 ?? Is 0:00.01 squid -sD
296 ?? S 0:00.27 (squid) -sD (squid)

假如squid进程意外终止,父进程启动另一个。例如:

Jul 31 15:02:53 zapp squid[294]: Squid Parent: child process 296 exited due to signal 6
Jul 31 15:02:56 zapp squid[294]: Squid Parent: child process 359 started

在某些情形下,squid子进程可能立即终止。为了防止频繁的启动子进程,假如子进程连续5次没有运行至少10秒钟,父进程会放弃。

Jul 31 15:13:48 zapp squid[455]: Squid Parent: child process 474 exited with status 1
Jul 31 15:13:48 zapp squid[455]: Exiting due to repeated, frequent failures

如果发生这样的事,请检查syslog和squid的cache.log以发现错误。

 

2.5.1 squid_start脚本

当 squid以后台进程运行时,它查找squid执行程序目录下的名为squid_start的文件。假如发现,该程序在父进程创建子进程之前被执行。你能 使用该脚本完成特定的管理任务,例如通知某人squid在运行,管理日志文件等。除非squid_start程序存在,squid不会创建子进程。

squid_start脚本在你使用绝对或相对路径启动squid时才开始工作。换句话说,squid不使用PATH环境变量来定位 squid_start.这样,你应该养成习惯这样启动squid:

% /usr/local/squid/sbin/squid -sD

而不要这样:

%squid -sD

 

2.6 启动脚本

通常你希望squid在每次计算机重启后自动启动。对不同的操作系统,它们的启动脚本如何工作也很不同。我在这里描述一些通用的环境,但对你自己的特殊操 作系统,也许该有特殊的处理方法。

 

2.6.1 /etc/rc.local

最容易的机制之一是/etc/rc.local脚本。这是个简单的shell脚本,在每次系统启动时以root运行。使用该脚本来启动squid非常容 易,增加一行如下:

/usr/local/squid/sbin/squid -s

当然你的安装位置可能不同,还有你可能要使用其他命令行选项。不要在这里使用-N选项。

假如因为某些理由,你没有使用cache_effective_user指令,你可以尝试使用su来让squid以非root用户运行:

/usr/bin/su nobody -c '/usr/local/squid/sbin/squid -s'

 

2.6.2 init.d和rc.d

init.d和rc.d机制使用独立的shell脚本来启动不同的服务。这些脚本通常在下列目录之中:/sbin/init.d, /etc/init.d, /usr/local/etc/rc.d.脚本通常获取单一命令行参数,是start或stop。某些系统仅仅使用start参数。如下是启动squid 的基本脚本:

#!/bin/sh
# this script starts and stops Squid
case "$1" in
start)
/usr/local/squid/sbin/squid -s
echo -n ' Squid'
;;
stop)
/usr/local/squid/sbin/squid -k shutdown
;;
esac

Linux用户可能在启动squid之前需要设置文件描述符限制。例如:

echo 8192 > /proc/sys/fs/file-max
limit -HSn 8192

为了使用该脚本,先找到脚本存放的目录。给它一个有意义的名字,类似于其他的系统启动脚本。可以是S98squid或squid.sh。通过重启计算机来 测试该脚本,而不要假想它会正常工作。

 

2.6.3 /etc/inittab

某些操作系统支持另一种机制,是/etc/inittab文件。在这些系统中,init进程启动和停止基于运行等级的服务。典型的inittab接口类似 如此:

sq:2345:once:/usr/local/squid/sbin/squid -s

使用该接口,init进程启动squid一次并且随后忘记它。squid确认它驻留在运行状态,象前面描述的一样。或者,你能这样做:

sq:2345:respawn:/usr/local/squid/sbin/squid -Ns

这里我们使用了respawn选项,假如进程不存在init会重启squid。假如使用respawn,请确认使用-N选项。

在编辑完inittab文件后,使用下面的命令来使init重新读取它的配置文件和启动squid:

# init q

 

2.7 chroot环境

某 些人喜欢在chroot环境运行squid。这是unix的功能,给予进程新的root文件系统目录。在squid受安全威胁时,它提供额外等级的安全保 护。假如攻击者在某种程度上通过squid获取了对操作系统的访问权,她仅仅能访问在chroot文件系统中的文件。在chroot树之外的系统文件,她 不可访问。

最容易在chroot环境里运行squid的方法是,在squid.conf文件里指定新的root目录,如下:

chroot /new/root/directory

chroot()系统调用需要超级用户权限,所以你必须以root来启动squid。

chroot 环境不是为unix新手准备的。它有点麻烦,因为你必须在新的root目录里重复放置大量的文件。例如,假如默认的配置文件正常在/usr/local /squid/etc/squid.conf,并且你使用chroot指令,那么文件必须位于/new/root/directory/usr /local/squid/etc/squid.conf.你必须将位于$prefix/etc,$prefix/share,$prefix /libexec下的所有文件拷贝到chroot目录。请确认$prefix/var和cache目录在chroot目录中存在和可写。

同 样的,你的操作系统需要将大量的文件放在chroot目录里,例如/etc/resolv.conf和/dev/null.假如你使用外部辅助程序,例如 重定向器(见11章)或者验证器(见12章),你也需要来自/usr/lib的某些共享库。你可以使用ldd工具来查找给定的程序需要哪些共享库:

% ldd /usr/local/squid/libexec/ncsa_auth
/usr/local/squid/libexec/ncsa_auth:

libcrypt.so.2 => /usr/lib/libcrypt.so.2 (0x28067000)

libm.so.2 => /usr/lib/libm.so.2 (0x28080000)

libc.so.4 => /usr/lib/libc.so.4 (0x28098000)

你可以使用chroot命令来测试辅助程序:

# chroot /new/root/directory /usr/local/squid/libexec/ncsa_auth

/usr/libexec/ld-elf.so.1: Shared object "libcrypt.so.2" not found

更多的关于chroot的信息,请见你系统中chroot()的manpage.

 

2.8 停止squid

最安全的停止squid的方法是使用squid -k shutdown命令:

%squid -k shutdown

该命令发送TERM信号到运行中的squid进程。在接受到TERM信号后,squid关闭进来的套接字以拒收新请求。然后它等待一段时间,用以完成外出 请求。默认时间是30秒,你可以在shutdown_lifetime指令里更改它。

假如因为某些理由,squid.pid文件丢失或不可读,squid -k命令会失败。在此情形下,你可以用ps找到squid的进程ID,然后手工杀死squid。例如:

%ps ax |grep squid

假如你看到不止一个squid进程,请杀死以(squid)显示的那个。例如:

% ps ax | grep squid

294 ?? Is 0:00.01 squid -sD

296 ?? S 0:00.27 (squid) -sD (squid)

% kill -TERM 296

在发送TERM信号后,你也许想查看日志,以确认squid已关闭:

% tail -f logs/cache.log

2003/09/29 21:49:30| Preparing for shutdown after 9316 requests

2003/09/29 21:49:30| Waiting 10 seconds for active connections to finish

2003/09/29 21:49:30| FD 11 Closing HTTP connection

2003/09/29 21:49:31| Shutting down...

2003/09/29 21:49:31| FD 12 Closing ICP connection

2003/09/29 21:49:31| Closing unlinkd pipe on FD 9

2003/09/29 21:49:31| storeDirWriteCleanLogs: Starting...

2003/09/29 21:49:32| Finished. Wrote 253 entries.

2003/09/29 21:49:32| Took 0.1 seconds (1957.6 entries/sec).

2003/09/29 21:49:32| Squid Cache (Version 2.5.STABLE4): Exiting normally.

假如你使用squid -k interrupt命令,squid立即关闭,不用等待完成活动请求。这与在kill里发送INT信号相同。

 

2.9 重配置运行中的squid进程

在你了解了更多关于squid的知识后,你会发现对squid.conf文件做了许多改动。为了让新设置生效,你可以关闭和重启squid,或者在 squid运行时,重配置它。

重配置运行中的squid最好的方法是使用squid -k reconfigure命令:

%squid -k reconfigure

当你运行该命令时,HUP信号被发送到运行中的squid进程。然后squid读取和解析squid.conf文件。假如操作成功,你可以在 cache.log里看到这些:

2003/09/29 22:02:25| Restarting Squid Cache (version 2.5.STABLE4)...

2003/09/29 22:02:25| FD 12 Closing HTTP connection

2003/09/29 22:02:25| FD 13 Closing ICP connection

2003/09/29 22:02:25| Cache dir '/usr/local/squid/var/cache' size remains unchanged

at 102400 KB

2003/09/29 22:02:25| DNS Socket created on FD 5

2003/09/29 22:02:25| Adding nameserver 10.0.0.1 from /etc/resolv.conf

2003/09/29 22:02:25| Accepting HTTP connections at 0.0.0.0, port 3128, FD 9.

2003/09/29 22:02:25| Accepting ICP messages at 0.0.0.0, port 3130, FD 11.

2003/09/29 22:02:25| WCCP Disabled.

2003/09/29 22:02:25| Loaded Icons.

2003/09/29 22:02:25| Ready to serve requests.

在使用reconfigure选项时你须谨慎,因为所做的改变可能会导致致命错误。例如,请注意squid关闭和重新打开进来的HTTP和ICP套接字; 假如你将http_port改变为squid不能打开的端口,它会发生致命错误并退出。

在squid运行时,某些指令和和选项不能改变,包括:

  • 删除cache目录(cache_dir指令)
  • 改变store_log指令
  • 改变coss cache_dir的块大小数值。事实上,无论何时你改变了该值,你必须重新初始化coss cache_dir.
  • coredump_dir指令在重配置过程中不被检查。所以,在squid已经启动了后,你不能让squid改变它的当前目录。

solaris 用户在重配置squid过程中可能遇到其他问题。solaris的stdio执行组件里的fopen()调用要求使用小于256的未用文件描述符。 FILE结构以8位值存储该文件描述符。正常情况下这不构成问题,因为squid使用底层I/O(例如open())来打开cache文件。然而,在重配 置过程中的某些任务使用fopen(),这就有可能失败,因为前面的256个文件描述符已被分配出去。

 

2.10 滚动日志文件

除非你在squid.conf里禁止,squid会写大量的日志文件。你必须周期性的滚动日志文件,以阻止它们变得太大。squid将大量的重要信息写入 日志,假如写不进去了,squid会发生错误并退出。为了合理控制磁盘空间消耗,在cron里使用如下命令:

%squid -k rotate

例如,如下任务接口在每天的早上4点滚动日志:

0 4 * * * /usr/local/squid/sbin/squid -k rotate

该 命令做两件事。首先,它关闭当前打开的日志文件。然后,通过在文件名后加数字扩展名,它重命名cache.log,store.log,和 access.log。例如,cache.log变成cache.log.0,cache.log.0变成cache.log.1,如此继续,滚动到 logfile_rotate选项指定的值。

squid仅仅保存每个日志文件的最后logfile_rotate版本。更老的版本在重命名过程中被删除。假如你想保存更多的拷贝,你需要增加 logfile_rotate限制,或者编写脚本用于将日志文件移动到其他位置。 请见13.7章关于滚动日志的其他信息。

 

3.运行dansguardian

网上看到的这2种启动方式,自己试了下,没用

1)  手工启动: service dansguardian start

2) 系统 启动: chkconfig dansguardian on

看了dansguardian 的INSTALL文件后搞定了,方法如下:

1)直接运行/usr/local/sbin/dansguardian

dansguardian -q 退出

2)/usr/local/share/dansguardian/scripts下是几个在各个系统下的启动脚本:

bsd-init  dansguardian  logrotation  solaris-init  systemv-init

systemv-init是linux版的:

Usage: ./systemv-init {start|stop|restart|status}

 

 

 配 置 文件

dansguardian 配置文件默认路 径: /etc/dansguardian

相关配置文件如 下:

bannedextensionlist        --     禁止的文件扩展名列表

bannediplist                   --     禁止的 ip 访问列表

bannedmimetypelist       --     禁止的 mime 类型列表

bannedphraselist            --     禁止的关键字列表 ( 整个页面 )

bannedregexpurllist        --     禁止带有关键字的 url 列表

bannedsitelist                --     禁止域名列表 ( 域名下所有的网页 )

bannedurllist                 --     禁止域名下的部分网页

banneduserlist               --     禁止代理认证中的用户

contentregexplist           --     关键字替换列表

dansguardian.conf         --     dansguardian 的配置文件

exceptioniplist               --     ip 白名单,不过滤

exceptionphraselist        --     关键字白名单

exceptionsitelist             --  站点白名单

exceptionurllist              --  url 白名单

exceptionuserlist            --  用户白名单

logrotation                    --  自调用文件

messages                      --  用于页面显示哪种阻止信息,在 dansguardian.conf 中调用

phraselists                    --  是供 weightedphraselist 等调用的文件夹

pics/                                --  PICS 过滤

template.html                --  dansguardian 的阻止页面信息

weightedphraselist         --  短语权重列表

 
# DansGuardian.conf
# 拒绝 Web 访问报告
# -1 = 做日记但不阻止-秘密模式
# 0 = 只是说“拒绝访问”
# 1 = 报告为什么但是不报告什么关键词阻止
# 2 = 完全报告
# 3 = 用 HTML 模式文件(突略拒绝访问地址)-推进
reportinglevel = 3
# 全局语言贮存的语言目录,只是用于reportinglevel=3时的HTML模式,
# 当被用,DansGuardian 将用html文件代替用perl cgi脚本来显示,这个
# 选项更快更清晰更容易让访问者访问被阻止的页面
# 语言文件用于没有问题的任何设置
languagedir = '/etc/dansguardian/languages'
# 从语言目录中运用的语言
language = 'ukenglish'
# 日记设定
# 0 = none  1 = just denied  2 = all text based  3 = all request
loglevel = 2
# 记录扩展命中
# 记录如扩展(用户、ip、URL、关键词)匹配因此让这个页面通过,非常有用于诊断
# 怎样的站点可以通过过滤器
# on | off
logexceptionhits = on
# 日记文件格式
# 1 = DansGuardian format        2 = CSV-style format
# 3 = Squid Log File Format      4 = Tab delimited
logfileformat = 1
# 本地日记文件
# 定义日记目录和文件名
loglocation = '/var/log/dansguardian/access.log'
# 网络设置
# DansGuardian 侦听的IP。保留空着DansGuardian将侦听所有的IPs。
# 通常你都会让你的防火墙保护这些,但是当你只是限制1个IP,单单时一。
filterip =
# DansGuardian 侦听的端口
filterport = 8080
# 代理服务器的IP(缺省是环回网卡ip-i.e. 这是服务器)
proxyip = 127.0.0.1
# DansGuardian 连接到代理服务器的端口
proxyport = 3128
# accessdeniedaddress是cgi dansguardian 报告脚本的web服务器的地址被拷贝
# 如果你不用到cgi就不要更改缺省
accessdeniedaddress = 'http://YOURSERVER.YOURDOMAIN/cgi-bin/dansguardian.pl'
# 非标准分隔符(仅用于accessdeniedaddress)
# 缺省是激活但可以返回用原始标准模式去disable
nonstandarddelimiter = on
# 禁止image交换
# Images 被禁止是由于domain/url/etc的原因包含了广告黑名单将被交换
# 例如,掩藏广告images和删除非法的image
# icons禁止域名
# 0 = off
# 1 = on (default)
usecustombannedimage = 1
custombannedimagefile = '/etc/dansguardian/transparent1x1.gif'
# 组过滤选项
# filtergroups设置组过滤器的数量。组过滤器是设置包含过滤器选项应用于这个组的用户。
# 这个参数变量必须是1或者更多
# DansGuardian 将自动查找dansguardianfN.conf 当N是这个过滤器的组。用filtergroupslist
# 选项来分配用户到组。所有的用户缺省是属于过滤器组1。你必须有一些鉴别分类能够让用
# 户到组的匹配。尽可能少的用更多的组过滤器更多的拷贝清单
filtergroups = 1
filtergroupslist = '/etc/dansguardian/filtergroupslist'
# 本地鉴别文件
bannediplist = '/etc/dansguardian/bannediplist'
exceptioniplist = '/etc/dansguardian/exceptioniplist'
banneduserlist = '/etc/dansguardian/banneduserlist'
exceptionuserlist = '/etc/dansguardian/exceptionuserlist'
# 展示有利的关键词建立
# 如果激活则只要报告的标准够高所有超越不规则限制关键词建立将被记录,
# on | off
showweightedfound = on
# 有利的关键词的模式
# 下边是3种可能模式的选项:
# 0 = off = 不用关键词的特征
# 1 = on, normal = 通用的关键词选项
# 2 = on, singular = 每个有用的关键词建立在一个页面中只是一次
weightedphrasemode = 2
# 真实报告caching的文本URLs
# 好的caches页面就不需要再次检测
# 0 = off (推荐用户不同的浏览ISPs)
# 1000 = 推荐多数用户
# 5000 = 暗示最多上限
urlcachenumber = 1000
# 在多少秒过期在他们不活动和将被突略
# 0 = never
# 900 = recommended = 15 mins
urlcacheage = 900
# 敏捷和未处理的关键词内容过滤选项
# Smart 是多样的空间和HTML将删除在关键词过滤之前
# Raw 是rew的HTML包含meta标记将过滤关键词
# 0 = raw only
# 1 = smart only
# 2 = both (default)
phrasefiltermode = 2
# 小写选项
# 为了比较关键词当文件中检查到大写字母时将更改为小写
# 然而这将违背Big5和16-bit文本,如果需要保护大小写
# 2.7.0版本的支持这个功能
# 0 = 强制更改为小写 (default)
# 1 = 不做任何改变
preservecase = 0
# 16进制解码选项
# 当文件检查到它会随意的更改%XX成chars
# 如果你发现文件在过滤关键词时让其通过是由于编码则enable
# 然而这将违背Big5和16-bit文本
# 0 = disabled (default)
# 1 = enabled
hexdecodecontent = 0
# Force Quick搜索好于DFA搜索算法
# 通常的DFA执行不是和16-bit字符完全一致,但是它作为缺省是因为它管理很大
# 关键词的列表时很快,如果你希望用很大数量的6-bit字符关键词则激活这选项
# 0 = off (default)
# 1 = on (Big5 compatible)
forcequicksearch = 0
# 反向查找禁止的设置和URLs
# 如果设置为on,DansGuardian 将为IP URL地址查找forward DNS和搜索禁止设置和URL列表
# 这将防止用户简单输入IP来访问禁止的地址,如果不是用本地的DNS服务器它将稍微降低查
# 找的速度,设置它为off,用Blanket IP Block选项的bannedsitelist文件来代替
reverseaddresslookups = off
# 反向查找禁止和扩张的IP列表
# 如果设置为on,DansGuardian 将为IP连接的计算机查找forward DNS,这就意味着
# 你可以输入hostname在exceptioniplist 和 bannediplist
# 如果不是用本地的DNS服务器它将稍微降低搜索的速度,设置为off
reverseclientiplookups = off
# 创建bannedsitelist和bannedurllist cache文件
# 这将比较列表文件日戳和cache的日戳,使其得到重新创建这是必须的
# 如果bsl或bul程序的文件存在,则将被用于代替,它将增加处理300%的速度
# 在很慢的计算机上这是很有用,在很快的计算机上就不需要这个选项
# on | off
createlistcachefiles = on
# POST保护(web 上传和窗体)
# 不阻止窗体没有任何文件上传,i.e. 这是只是为了阻止和限制上传
# kibibytes在MIME encoding和header bumph标准之后
# 用 0 表示完全阻止
# 用高些(e.g. 512 = 512Kbytes)来限制
# 用-1表示不阻止
#maxuploadsize = 512
#maxuploadsize = 0
maxuploadsize = -1
# 最大内容过滤页面大小
# 有时候web服务器的二进制文本文件非常大就会消耗巨大的内存和CPU资源
# 处理这些,你可以限制文件的大小来过滤,直接让它通过
# 这设置也同样应用正规的内容扩张修改
# 大小单位为Kibibytes - e.g. 2048 = 2Mb
# 用 0 表示不限制
maxcontentfiltersize = 256
# 用户名辨别算法(用于日记记录)
# 你可以有很多的算法不仅仅是这一个,第一当这被用虽然用户名没有建立,接着将很有用
# * proxyauth 是基本的代理辨别被用(对透明代理不是有用)
# * ntlm 是当代理支持MS NTLM辨认协议(只是工作于IE5.5 sp1或者更高版本)**NOT IMPLEMENTED**
# * ident 是当其他的算法不能用作时工作,它将连接来自连接的计算机和尝试接连到identd服务器和
# query,它是用户拥有的连接
usernameidmethodproxyauth = on
usernameidmethodntlm = off # **NOT IMPLEMENTED**
usernameidmethodident = off
# 优先禁止 - 这意味你激活代理辨别和用户访问设置禁止的URL,例如他们阻止直接外出没有
# 享有的请求和通过,这影响用户的需要访问一个干净的设置,第一需它知道他们是谁甚至可以
# 是管理员
# 这就是为什么DansGuardian总是起作用但有些情况下缺少完美的,所以你可以随便disable它
# 缺省是 on,众所周知这个设置像mime类型一样结果不能这作用AD image交换工作好
preemptivebanning = on

# Misc 设置
# 如果为on它增加一个X-Forwarded-For: HTTP请求头,这有帮助于一些设置问题
# 这需要知道源ip。on | off
forwardedfor = off
# 如果为on它用X-Forwarded-For: 确定客户端的IP,这作用于squid介于客户端和
# DansGuardian之间
# 警告-报头容易欺骗。on | off
usexforwardedfor = off
# 如果为on它记录一些调试信息关于fork()和accept(),通常试突略的,他们试用syslog来记录的
# 它安全的设置为on或者off
logconnectionhandlingerrors = on

# Fork pool 选项
# 设置最多的进程数fork来处理进来的连接,最大变量通常是250,依赖OS
# 最大设置你可以尝试180
maxchildren = 120
# 设置最小的进程数fork来处理进来的连接
# 最大设置你可以尝试32
minchildren = 8
# 设置最小的进程数fork来处理保持真正的连接
# 最大设置你可以尝试8
minsparechildren = 4
# 设置最小的进程数fork来运行
# 最大设置你可以尝试10
preforkchildren = 6
# 设置最大的进程数来不做任何东西
# 当有空间的时候可以精选他们一些
# 最大设置你可以尝试64
maxsparechildren = 32
# 设置最大的子进程croaks的age
# 这是在他们退出之前他们处理的连接数
# 最大设置你可以尝试10000
maxagechildren = 500

# 进程选项
# (更改他们只有你真正知道你自己在干什么)
# 这些选项允许你运行DansGuardian在多种场合在单个机器上
# 记住以你的意图编辑上面日记文件路径
# IPC 文件名
# 定义IPC 服务用于log进程通信的目录和文件名
ipcfilename = '/tmp/.dguardianipc'
# URL 列表 IPC 文件名
# 定义URL列表IPC服务用于URL cache进程通信的目录和文件名
urlipcfilename = '/tmp/.dguardianurlipc'
# PID 文件名
# 定义进程id的目录和文件名
pidfilename = '/var/run/dansguardian.pid'
# 不能守护
# 如果激活,进程将不会fork运行在后台
# 它不是通常有利去做这些
# on|off ( defaults to off )
nodaemon = off
# 不启动日记进程
# on|off ( defaults to off )
nologger = off
# 守护进程运行的用户和组
# 这是DansGuardian运行时的用户,通常 user/group nobody
# 不注释的用 缺省用户在编译时定义
# daemonuser = 'nobody'
# daemongroup = 'nobody'
# 软件重启
# 当on时不会强制的杀死所有同一进程组的进程
# 这不是很困惑运行时加上 -g 的选项 他们不是很有关系
# on|off ( defaults to off )
softrestart = off

 

4.设置IPtable

设定iptable的目的主要是防止用户绕过dansguardian,如果 dansguardian 和squid都已经运行,客户端可以直接 连3128端口来绕过dansguardian,我们可以通过把所有连向3128的 连接转向8080来防止用户绕过 dansguardian.
      iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3128 -j REDIRECT --to-port 8080

还搜集了一些其他的


iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080


iptables –t nat –A PREROUTING –s 192.168.0.xxx/32 –i eth1 –p tcp --dport 80 –j REDIRECT --to-dports 8080

这2个应该是在设置透明代理时把发到80的连接自动转到8080?

你可能感兴趣的:(linux)