squid

Squid 介绍
Squid工作原理:
Squid 启动之后,会在 RAM 建立一个 Hash Table,记录硬盘中 object 配置的情形。
Squid 又会在 RAM 中建立一个 Digest Table(摘要表) ,其功能是和其他有合作关的 Squid (Sibling)互相交换 Digest Table,万一用户端想要的资料自己没有时,可以很快的知道哪一部 Squid Server 有资料(Squid 也可以透过 ICP 向其他 Squid 查询,但速度较慢)。但是 Digest Table 本身不小,既记忆体又频宽,如果 Server 的内存不够,对外带宽不够,反而比 ICP 查询更慢。

Squid的种类【可能不太合适叫做种类,不过没有更好的词。语文太差^_^】
child、sibling、parent。

关系如下:
Squid Server 之间的第一种关系是:Child 和 Parent。当 Child Squid Server 没有资料时,会直接向 Parent Squid Server 要资料,然後一直等,直到 Parent 给它资料为止。
Squid Server 之间的第二种关系是:Sibling 和 Sibling。当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它直接向 Parent 要或上 internet 去拿。

一般 Squid Server 运作的模式是:
1. 当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它直接向 Parent 要。
2. 向 Parent 要资料,然後一直等,直到 Parent 给它资料为止(Parent 自己有的资料或上 internet 去拿)。
3. 没有 Parent 时,就自己上 internet 去拿。
4. 如果这三者都拿不到资料,才向用户端回报拿不到资料。

编译安装Squid:
./configure --prefix=/usr/local/squid[-ip] --enable-async-io=160 --enable-icmp --enable-kill-parent-hack --enable-cache-digests --enable-default-err-language=Simplify_Chinese --enable-poll && make && make install
--enable-async-io=160:这项主要是设置async模式来运行 squid,我的理解是设置用线程来运行squid,如果服务器很强劲,有1G以上内存,cpu使用SMP的方式的话可以考虑设成160或者更高。如果服务器比较糟糕就根据实际情况设了(不要太贪心哦^_^)。
--enable-icmp:加入icmp。默认不加。
--enbale-kill-parent-hack:当kill掉nobody的squid进程的时候会同时杀死它的父进程。
--enable-cache-digests:【。。。】
--enable-default-err-language=Simplify_Chinese:当有错误的时候在页面中显示简体中文。【不过squid还是会无情的把所有语言都装上,看的不顺的话手工删咯】
--enable-poll:可以提升效能。

Squid的结构介绍:
安装好的目录在/usr/local/squid-10 (这里假设我的主ip最后一段是10)
结构是:
bin/:放置squid默认写好的启动脚本。有RunAccel;RunCache;squidclient;前2个启动Squid可以使用,因为当 squid进程死了后,这个脚本可以自动检测到。 RunAccel是用于web 加速用的脚本,而RunCache是用于做squid代理用的,squidclient是用本机做squid测试的。
etc/:squid.conf在这个目录中
libexec/:函数库;
man/:帮助文件。不用说了吧。。。
sbin/ :squid命令所在目录。一般如果我用来测试就启动squid命令。或者用这个命令创建swap,或者加-k参数重启之类的操作。
share/ :一些错误显示的html都在里面;
var/ :log,pid,swap都在这个目录中!

隔了很久才有空可以写这个经验体会,前一段时间一直在搞qmail,头大中,终于可以空下来了:)

先看squid的一个重要的,对我来说也是唯一需要配置的一个配置文件。选项非常多,当然,默认的squid.conf文件中对于每一个选项都有比较详细的说明,但是我还是想把我理解的以及必须要进行配置的选项罗列出来,以免过段时间自己都忘了^_^

以下的配置我是要向sina,sohu,163学习的web server的架构,试着自己去搭建一个这样的环境来看看效果到底如何。因此这里的squid不是用来做代理的,而是反向作为网站高速缓存。其实原理差不多,只是方向反一反而已,相信都能理解这点的。

使用的测试服务器为Dell 2650 双CPU至强2.4G 内存DDR 2G。OS为Freebsd 5.2.1(这里需要说明的是,从实际使用情况来看,squid跑在freebsd上的效果是最快最好的。这是由os的文件系统所决定的,千万不能用, solaris,感觉solaris的文件系统实在太慢,虽然非常稳定,而且跑多线程的效果是最好的。linux嘛~~~没有进行测试,不过感觉在 freebsd之下,solaris之上。)

Squid.conf的几个重要参数的配置说明:

http_port 61.155.143.54:80 #Squid Server侦听的端口。假设我的主页的dns server 指到61.155.143.54上的,因此我必须让squid来侦听这个IP的这个端口。

cache_mem 32 MB #要额外提供多少内存给squid使用,这里的额外是指squid会将最常用的一些缓存放到这块内存中。这个指令也是我看了官方文档后才理解的。因为一开始从实际使用情况来看,我这边设32M的话,用top命令来查看一般会达到100M左右。这点让我让我很想不通,呵呵。然后就去看官方文档,发觉 squid是这样来计算使用多少内存的:squid本身的进程大概10M-20M,然后下面我设的cache目录的大小是500M的话,那他放在内存里的 hash索引大概需要20M左右,然后再加上这里设置的cache_mem的值。官方文档建议你的实际内存大小应该是这个squid所需要总内存的2倍以上。自己量力而为吧。cache_mem当然是越大越好了。

cache_dir ufs /usr/local/squid-54/var/cache 500 16 256 #设置squid存放cache目录的位置以及大小。第一个数字500是指目录的总大小为500M(默认为100M),第二个数字16是指第一级目录为 16个,第三个数字256是指第二级目录为256个我个人觉得如果网站访问量大,并且内容很多的话,可以考虑将默认的100M改大一点,否则会报错。我就经历过,错误我忘了记录了(该死!)大致就是说超过Max的极限了,当时查了半天才找到罪魁祸首是这条指令,惭愧~~~。

cache_access_log none
cache_log none

cache_store_log none #我是将这些log记录都关了, 有需要的可以将它们打开。

acl managerIP src 10.10.10.10
acl ipcanbrows dst 10.10.10.0/24 #acl应该是squid配置里面最难理解也最需要花时间的地方了。应该说只需要修改很小的一部分就可以了,像这里我只是在原来的基础上加了2条记录,前面一条的意思是我定义了10.10.10.10为源路径,另外一条是指目的端是10.10.10.0/24这个网段。而managerIP, ipcanbrows随便取得名字。具体的规则需要下面的语句来定义。10.10.10.10就是本服务器的内网ip,而apache server的ip就在10.10.10.0/24这个网段里,不需要用外网ip,一定程度上节约了ip地址。

http_access allow manager managerIP ipcanbrows localhost #加上2个允许就可以了。高深的配置我觉得我也不需要,用户可以访问就达到目的了:)

httpd_accel_host virtual #由于我后面的apache server是基于ip来做虚拟主机的,因此这里需要设置成virtual。

httpd_accel_port 80 #http加速的端口,因为习惯等原因,还是将后面的apache server监听80端口。

httpd_accel_uses_host_header on #如果选了virtual的话,这里必须设置成on。

这里最多只列出了5%左右的选项,但是我配置的时候就只是用到了这些,因此,如果做网站加速的话,基本设置就是这些。当然需要更强劲的功能的话就需要好好读读squid的配置文件的文档了。

最后的步骤:

1. 改变var目录的权限:chown -R nobody var

2. 创建缓存目录:sbin/squid -z

3. 启动squid:bin/RunAccel & (这边我使用squid附带的启动脚本来启动squid,有个好处就是,如果squid的进程死了的话,这个脚本会自动启动squid,对于运行在线上的服务器来说,这点太重要了。

一些使用体会:

1. squid使用时间长了,速度会变慢,我的建议是每2小时kill掉squid 进程,RunAccel脚本会自动再启动的它。

2. 写一脚本,放进crontab中,每天凌晨4点左右把cache目录清空。

#!/bin/sh
# squid clean swap and restart script by marco lu
SQUID_DIR=/usr/local/squid-54/
PID_FILE=${SQUID_DIR}var/logs/squid.pid
CACHE_DIR=${SQUID_DIR}var/cache
PPID=`ps aux | grep -i squid-54 | grep -v grep|awk '{print $2}'`
kill -9 ${PPID} > /dev/null
kill -9 `cat ${PID_FILE}` > /dev/null
rm -rf $CACHE_DIR/*
${SQUID_DIR}sbin/squid -z > /dev/null
if [ $? -eq 0 ]
then
${SQUID_DIR}bin/RunAccel & > /dev/null
fi

现有网络情况:

我校校园网通过光缆已将31座建筑物连通,光缆总长度约15Km,绝大多数楼中实现结构化布线,连入校园网的网络多媒体教室、教学基地、实验室、机房等约有数十个,连网计算机达3000多台 。我校目前出口有2个,一条速率为10M bps,通过光纤接入中国教育科研网CERNET,另一条速率为4M bps连入中国电信。

用户的需求:

我校校园网的使用者主体为在校学生及老师。根据统计,约80%的用户使用WWW、FTP等资源。我校现有Chinanet ip 126个,不可能分给所有的用户使用。通过架设代理服务器来实现让所有用户使用网络资源是最简单并且相对安全和可靠的方法。通过架设专门的WWW (FTP)代理来满足用户的主要需求,通过架设socks5代理来满足用户的其他需求。

二、硬件及软件的选择

硬件

Cache Server可以是一台普通的PC服务器加上cache软件(如Squid、Inktomi)构成,也可以是软硬件系统和一台专门的cache服务器。根据Chinanet出口的实际情况,4Mbps速率的出口,每秒最大传入数据量为约500K/s。我校主干网节点间为双千兆连接,到达部分实验室是百兆,到达宿舍为10M。送出的最大数据量为约12M/s。传送的数据量不是很大,使用传统的IA32构架服务器既可满足需求。我校网络中心主机房使用机柜来存放服务器。惠普公司的LH6000服务器,具有很强的扩展性,是新型的六路服务器。代理服务器的运算负荷不是很重,对于IO的要求较高。LH6000通过自定义配置可以达到这个要求。通过使用raid可以提高磁盘性能,增加数据的可靠性。代理服务器软件占用内存较大。LH6000可以支持8GB内存。最终选择配置如下:

配置

处理器:1个100MHz系统总线的Intel Pentium III Xeon 700MHz处理器
内存:1G PC-133 ECC SDRAM
磁盘控制器:集成具有32MB高速缓存双通道Ultra3 SCSI HP NetRAID控制器
附加单通道:Ultra Wide SCSI控制器
内置存储:热插拔5x18G半高驱动器
网卡:内置INTEL 82559 100M网卡
电源:3个热插拔电源

RAID使用了RAID5模式,这个模式是向阵列中的磁盘写数据,奇偶校验数据存放在阵列中的各个盘上,允许单个磁盘出错。RAID 5也是以数据的校验位来保证数据的安全,但它不是以单独硬盘来存放数据的校验位,而是将数据段的校验位交互存放于各个硬盘上。这样,任何一个硬盘损坏,都可以根据其它硬盘上的校验位来重建损坏的数据。

软件

Squid Internet Object Cache (Harvest Project的後续版本) 是美国政府大力助的一项研究计划。Squid是一个开放源代码的代理服务器软件。它是一个为UNIX系统下运行的全功能的代理服务器软件。它可以为 HTTP协议、FTP协议以及其他使用URL方式定位的协议作缓存。它支持客户端使用SSL协议进行数据传送。它可以使用ICP, HTCP, CARP, Cache Digests等协议和方式和其他运行squid的服务器进行协同。它支持SNMP协议,可以用相应的软件来做协调和管理。并且能配置详细的访问控制列表(acl)。

操作系统

以前学校的代理服务器使用linux作为操作系统。这是因为以前的代理服务器通常还兼作其他的服务器。很多服务器软件是专门为linux开发的,或者在linux上运行的效率最高。Squid本身是为unix-like操作系统开发的。本身对系统没有太多的要求。目前我校Chinanet代理服务器使用的是FreeBSD作为操作系统。

没有选择Linux有下面几点原因:

Linux的核心部分开发相对比较开放,FreeBSD的核心是由一个严格的core team来完成的。相对检查更加严格。从核心部分比较BSD的内核更加稳定。

Linux对高负荷的承载能力不如FreeBSD。对于高负荷下程序出错的容忍力,BSD远强于Linux。
许多著名的网站,如:yahoo, netease 等著名的商业网站使用的就是freebsd,稳定性和性能早已通过很多专家的评测,远远强于Linux。

在著名的文章“Linux vs BSD: A Tale of Two System”中,是这样评价Freebsd的: FreeBSD focuses on the Intel Architecture PC and server platforms, and on providing the best performance and stability possible. The DEC/Compaq Alpha is also supported.

但是Freebsd也有不如Linux的弱点。主要表现在磁盘IO的性能上。这主要是因为Freebsd使用的文件系统—UFS的性能不如 linux上使用的ext2/ext3。但是在加上softupdate之后会有很大的改进。而且出国代理上配置的使用raid5模式,磁盘使用高转速 scsi硬盘,在上述硬件配置的情况下,读取squid cache的数k大小的小文件使用ext2和ufs+softupdate的效率的差别在万分之一以下。对于负载数千用户的代理服务器来说,可以忽略这样的效率差别。

基于以上原因,最终选用Freebsd作为代理服务器的操作系统。

三、代理服务器软件的安装

squid的安装

freebsd本身的ports程序带有squid的稳定版本。目前squid的最新版本是2.4.STABLE6。在freebsd的 /usr/ports/www/squid 目录下执行make;make install就会将最新版本的squid代码下载、编译并最终安装到/usr中的相应路径中。

Squid本身会被安装到/usr/local/sbin下
Squid的cache目录默认为/usr/local/squid/cache
Squid的log目录默认为/usr/local/squid/logs
squid的配置文件目录默认为/usr/local/etc/squid

这样的安装方式比直接使用二进制的package安装要好。因为二进制的package不能保证在自定义的系统上稳定运行。下载源代码代码在本地进行编译之前,首先会校验源代码的MD5 checksum,这样能保证我得到的源代码是未经修改过的版本。然后再在本地进行编译。最后安装到相应目录。

Squid的配置

Squid的配置文件是squid.conf

部分参数的配置如下:(为保证代理服务器安全,部分参数用*代替)

http_port 8080 设置http代理端口为8080
cache_peer pa.us.ircache.net sibling 3128 3130 login=*:*
cache_peer sj.us.ircache.net sibling 3128 3130 login=*:*
cache_peer * parent 13280 4827 htcp *:*

这几行是使用squid可以和其他几台机器进行协同工作的特性,同几台组成cache_peer。具体设置在后面的优化部分会解释。

cache_peer_domain * .edu.cn设置.edu.cn的域名使用某个cache_peer访问
cache_mem 400 MB设定内存cache的大小为400M
cache_swap_low 80
cache_swap_high 97这两行是设置cache进行替换的闸值。当占用到97%的cache后,cache中的内容将被清空20%。
maximum_object_size 20000 KB 最大对象大小为20M.
maximum_object_size_in_memory 10000 KB 内存中最大的对象大小为10M
ipcache_size 4096 ip对应cache的大小为4096
fqdncache_size 4096 域名全称cache的大小为4096
cache_replacement_policy heap LFUDA cache替换策略
memory_replacement_policy heap LRU 内存替换策略
cache_dir ufs /usr/local/squid/cache 25000 16 256 cache存放的路径大小及具体配置
dns_nameservers * * * * * 内部指定dns服务器
authenticate_program * * 身份认证程序
authenticate_children 32 身份认证程序启动的进程数目
request_body_max_size 5 MB 最大请求的body大小
reply_body_max_size 20 MB 最大回应的body大小
acl all src 0.0.0.0/0.0.0.0
acl dorm proxy_auth 192.168.0.0/255.255.0.0 REQUIRED
acl bjpu proxy_auth 202.112.64.0/255.255.240.0 REQUIRED
acl bjpu2 proxy_auth 211.71.80.0/255.255.240.0 REQUIRED

访问控制列表

acl banned_sites {过滤的关键字}
http_access deny banned_sites
deny_info ERR_BANNED_SITE banned_sites

禁止访问违禁站点的设置

acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
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

设置可以连接的端口

http_access allow dorm
http_access allow bjpu
http_access allow bjpu2
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all

允许http访问

icp_access allow *允许cache_peer使用ICP协议访问
proxy_auth_realm BJPU proxy-caching web server 验证框提示的banner
cache_mgr [email protected] cache管理员的电子邮件地址
cache_effective_user *
cache_effective_group * 执行cache程序的用户uid和gid
visible_hostname cnproxy.bjpu.edu.cn cache服务的机器名
memory_pools on 内存池设置为打开。
memory_pools_limit 50 MB 内存池的大小

Socks5代理的安装

出国代理上选用的socks5代理软件是NEC公司制作的软件。它实际上是一个商业版软件。但是根据它的license文件所述,在非商业用途上使用这个软件是免费的。在RFC-1928对socks5如何运行做了详细的描述。这个标准就是NEC公司的“Ying-Da Lee”和HP及IBM公司制定的。在相应的测试中,NEC公司的这个socks5代理软件的性能是较好的。虽然它有一些安全上的漏洞,但是使用 freebsd的ports方式安装,将会自动对源代码打补丁,修正安全隐患。

在/usr/ports/net/socks5下执行make;make install就能安装好该程序。相应的文件将被安装在下列目录:

socks5可执行文件被放在/usr/local/bin
socks5.conf文件被放在/usr/local/etc下

bugtraq上曾经提到socks5的密码验证部分有安全隐患,因此没有使用该功能。

Socks5代理的配置

Socks5代理的配置文件是socks5.conf,内容如下:

set SOCKS5_MAXCHILD 8000
permit - - 192.168. - (1024,65535) -
permit - - 202.112.64.0/255.255.240.0 - (1024,65535) -
permit - - 211.71.80.0/255.255.240.0 - (1024,65535) –

限制工大可以使用该socks5代理,限制目标端口为1024-65535。设置最多可以有8000个进程运行。

配置文件的切换

为了避免带宽的浪费,出国代理设置为夜间取消最大下载对象限制。这是是使用crontab来做到的。每天夜间23:30将配置文件切换为没有最大下载对象限制的。每天上午7:30切换回有最大下载对象限制的。

四、使用情况分析

单位时间内流量

input (total) output
packets errs bytes packets errs bytes colls
917 0 646248 1015 0 767928 0
941 0 667858 1287 0 1548180 0
832 0 673330 897 0 836839 0
895 0 655289 1067 0 878449 0

*以上数据为出国代理负载中等时的数据。

Chinanet出口已经被占满,经过cache的作用,送出数据大于进入数据

CPU负荷

使用top命令看到的CPU的负荷: load averages: 0.72, 0.86, 0.86(1mi,5min,15min),此数据为出国代理负载中等时的数据。

Hourly usage

[img:01091db545]http://www.frontfree.net/articles/pages/0000000597/hourlyusage.gif[/img:01091db545]

通过这张图可以清晰的了解出国代理的使用情况。

早6时,宿舍通电。出国代理的使用频度增加数倍。
早8时,机房、实验室开始开放,出国代理的使用频度近一步增多。
上午11时,课程结束,部分学生离开机房、实验室,午餐时间使用频度略微减少。
中午13时,下午课程开始,学生离开宿舍,使用频度减少。
下午15时,机房和实验室用户增多。
下午17时,部分机房、实验室关闭,教师离开学校,造成使用频度减少。
晚18-20时,学生去上自习或选修课,使用频度呈减少趋势
晚21时-22时,选修课结束,学生回到宿舍,使用频度急剧增加,并且达到每天的最高点。
晚23时,部分宿舍断电,实验室断电。使用频度进一步减少。
0时-5时,宿舍学生大多已经休息,使用频度程减少趋势。

Daily usage

[img:01091db545]http://www.frontfree.net/articles/pages/0000000597/dailyusage.gif  [/img:01091db545]

通过上面可以看出我校Chinanet线路代理服务器每天的使用情况。出国代理的日访问日志在约600M。图中显示出周末,尤其是周日访问量很大。这是由于周末我校宿舍不断电,作为用户主体的学生的使用网络的时间大大增加。对此称为“周末效应”。

五、安全保障

物理安全的保护

供电:该服务器放在我校网络中心主机房,有双路供电。UPS可以保证在没有市电供应下5小时不中断服务。

物理隔离:网络中心24小时有专人值班,进入主机房需要登记。

服务器软件安全保护

操作系统选用了FreeBSD。Freebsd本身几乎没有任何安全漏洞。根据服务最少化原则,出国代理上目前使用的服务有ssh ntp socks5 squid几种。其中ssh没有使用freebsd自带的openssh,而是使用了ssh.com出的非商业版的ssh服务器软件。这个版本的ssh服务器软件相对openssh有更安全效率更高的优势。而且对于非商业应用是免费的。服务器通过ntp服务与某网络时间服务器进行时间同步,这是为了保证日志文件记录事件发生时间的准确性。另2个为必须提供的代理服务。其余服务没有打开。执行ps命令确认没有任何多余进程。

对SYN-Flood及扫描的防护

SYN Flood是当前最流行的DoS(拒绝服务攻击)与DdoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。

[img:01091db545]http://www.frontfree.net/articles/pages/0000000597/tcpconnection.gif[/img:01091db545]

TCP协议的三次握手过程是这样的:

首先,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;
第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。
第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送 SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。
实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃。即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),从而造成DoS。

在freebsd的可以调整的内核参数中有下面2项:net.inet.tcp.blackhole和 net.inet.udp.blackhole。相应的描述如下:The blackhole sysctl MIB is used to control system behaviour when connection requests are received on TCP or UDP ports where there is no socket listening. Normal behaviour, when a TCP SYN segment is received on a port where there is no socket accepting connections, is for the system to return a RST segment, and drop the connection. The connecting system will see this as a "Connection reset by peer". By setting the TCP blackhole MIB to a numeric value of one, the incoming SYN segment is merely dropped, and no RST is sent, making the system appear as a blackhole. By setting the MIB value to two, any segment arriving on a closed port is dropped without returning a RST. This provides some degree of protection against stealth port scans.In the UDP instance, enabling blackhole behaviour turns off the sending of an ICMP port unreachable message in response to a UDP datagram which arrives on a port where there is no socket listening. It must be noted that this behaviour will prevent remote systems from running traceroute to a system. The blackhole behaviour is useful to slow down anyone who is port scanning a system, attempting to detect vulnerable services on a system. It could potentially also slow down someone who is attempting a denial of service attack.

根据上面描述可以将net.inet.tcp.blackhole和net.inet.udp.blackhole设置为2和1,这样将防止半开式的端口扫描,并且能对syn-flood有初步的防护。

在内核的配置文件中有options TCP_DROP_SYNFIN这个选项。通过加入这个参数,可以防止通过TCP/IP堆栈对操作系统进行识别。可以将安全问题中的”information gathering”解决 。

六、优化

内核的优化

FreeBSD有很丰富的可以自定义的内核的参数。默认的内核为了保证通用性和稳定性,有大量优化性能的参数没有加入。

我校Chinanet代理服务器操作系统内核部分优化参数如下:

options MAXDSIZ="(1024*1024*1024)"
options MAXSSIZ="(1024*1024*1024)"
options DFLDSIZ="(1024*1024*1024)"
options CPU_ENABLE_SSE
options PANIC_REBOOT_WAIT_TIME=16

前三行是对freebsd下运行的应用程序可以使用的最大的内存资源作限制,默认为128M。由于出国代理服务器软件squid占用内存巨大,默认的配置显然不能满足要求,所以要使用自定义的配置。这个配置允许单一进程占用1G的内存资源。

第四行是打开对SSE/MMX2指令集的支持。通过加入这一参数,出国代理的性能提高了约1%。即单位时间内吞吐量增加了1%。

第5行是在内核发生严重错误的时候自动重新启动的时间。这个参数保证了服务器出现严重的软件错误后能自动恢复。

Cache policy
在本文的第三部分中提到了出国代理使用的cache policy。

cache_replacement_policy heap LFUDA cache替换策略
memory_replacement_policy heap LRU 内存替换策略

HP公司曾经对squid作过详细的测试。

参考该文档,对我校出国代理作了相应的调整。默认的cache_replacement_policy 和memory_replacement_policy都是LRU。这个算法用在cache上效率相对较低。经过实际测试,使用LFUDA(Least Frequently Used with Dynamic Aging)作为cache replacement policy,cache的命中率最高。使用heap LRU作为memory replacement policy,memory cache命中率最高。使用工具测得加入出国代理后,对使用代理的用户来说,Chinanet的出口带宽达到了5-7M,已经远远高于4M的实际带宽。确实起到了cache的作用。

对于磁盘IO的优化

前文提到freebsd的磁盘性能不佳。除使用raid技术之外,squid本身有unlinkd 和diskd两个子进程来专门负责对磁盘作操作。配置文件中的cache_dir ufs /usr/local/squid/cache 25000 16 256 这行指定了squid可以使用25G的硬盘空间来作为缓存。Ufs指定了使用unlinkd作为对磁盘做操作的进程。Unlinkd只负责删除文件的操作,diskd负责所有的操作。Squid的相应文档上建议使用diskd。但是经过测试,使用diskd虽然能提高系统的性能,但是会使squid进程变得不稳定。基于保证稳定性的考虑,选择使用unlinkd作为对磁盘操作的进程。

Cache peer

Squid支持多台服务器进行协同工作,组成cache peer。美国的National Laboratory for Applied Network Research、UCSD、The National Science Foundation建立了相应的cache peer组织(http://www.ircache.net)。我校Chinanet代理服务器将该组织中的2台服务器设置为slibing模式来调用,将我校另外一台cernet线路上的服务器设置为域名以.edu.cn结尾的parent模式。访问过程是这样的:如果客户端提交来的请求是以. edu.cn结尾的,首先查询cache中是否有,如果没有则请求cernet线路上的服务器去读取相应资源。

对于其他的域名,则首先查询本身的cache,如果没有则查询slibing的cache,如果还没有,则自己主动去获取该资源。与 ircache的协调使用ICP(Internet Cache Protoclol),与cernet线路服务器协调使用HTCP(Hypertext Caching Protocol)。对ICP的描述在RFC2186、RFC2187,对HTCP的描述在http: //icp.ircache.net/htcp.txt。HTCP更有利于提高cache的性能,但是对系统的配置有要求,ICP相对简单。所以,选择使用ICP与ircache的服务器协同工作,使用HTCP与学校cernet服务器协同工作。

#vi /etc/squid/squid.conf
http_port 192.168.0.1:60080
icp_port 0
cache_dir ufs /var/squid
cache_mem 32MB
cache_swap_low 90
cache_swap_high 95
cache_access_log /var/squid/access.log
cache_log /var/squid/cache.log
cache_store_log none
emulate_httpd_log on
pid_filename /var/run/squid.pid
httpd_accel_port 80
httpd_accel_host virtual
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
cache_log /var/log/squid/cache.log
cache_store_log none
acl zzvcom src 192.168.0.0/24
http_access allow zzvcom
visible_hostname proxy
#squid -z
#/etc/rc.d/init.d/squid start &
#touch /etc/rc.d/firewall
#chmod 755 /etc/rc.d/firewall
#vi /etc/rc.d/firewall
LAN_IP_RANGE="192.168.0.0/24"
STARIC_IP="229.143.34.38"
TRUSTED_PORT="22 25 53 80 110"

#开放以下端口:22 25 53 80 110
/sbin/iptables -N services
for PORT in $TRUSTED_PORT; do
/sbin/iptables -A services -i eth0 -p tcp --dport $PORT -j ACCEPT
done

echo "1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP
#状态检测
/sbin/iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
/sbin/iptables -A FORWARD -p tcp ! --syn -m state --state NEW,INVALID -j DROP
/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#DROP掉受怀疑的扫描
/sbin/iptables -A FORWARD -p tcp --destination-port 1080 -j DROP
/sbin/iptables -A FORWARD -p tcp --destination-port 8080 -j DROP
/sbin/iptables -A FORWARD -p tcp --destination-port 8000 -j DROP
/sbin/iptables -A FORWARD -p tcp --destination-port 8081 -j DROP
#防止IP欺骗
/sbin/iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
/sbin/iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
/sbin/iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
#只开启内部机器PING通代理
/sbin/iptables -A FORWARD -i eth1 -p icmp --icmp-type 0/0 -j ACCEPT
/sbin/iptables -A FORWARD -p icmp --icmp-type 0/0 -j DROP
#对于内部WWW服务,则转至SQUID
/sbin/iptables -t nat -A PREROUTING -i eth1 -p tcp -s $LAN_IP_RANGE --dport 80 -j REDIRECT --to-ports 60080
#使内网机器其它服务用SNAT
/sbin/iptables -t nat -A POSTROUTING -o eth0 -s $LAN_IP_RANGE -j SNAT --to $STATIC_IP
#开放主机的SSH服务
/sbin/iptables -A OUTPUT -o eth0 -p tcp -s $STATIC_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 22 -d $STATIC_IP --dport 1024:65535 -j ACCEPT
#使内部192.168.0.2开放WWW至外部
/sbin/iptables -t nat -A PREROUTING -p tcp -d $STATIC_IP -dport 80 -j DNAT --to 192.168.0.2:80
#允许要转向的包
/sbin/iptables -A FORWARD -i eth1 -j ACCEPT
#ip碎片进行控制
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
#允许udp服务
/sbin/iptables -A FORWARD -i eth0 -p udp -d $LAN_IP_RANGE -j ACCEPT
#防止DOS,FLOOD攻击
/sbin/iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
/sbin/iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#vi /etc/rc.d/rc.local
/etc/rc.d/init.d/squid start
/etc/rc.d/firewall

01、允许全部可以访问Internet;

02、允许部分人有权限的人可以下载;

03、允许部分人完全没有限制(管理员组、经理组);

04、允许全体人员在固定时间,有部分限制,不在此时间之内,撤除限制;

05、不允许下载的特定url字符:exe/zip/mp3等等;

06、不允许访问特定的站点;

07、透明代理与用户认证共存可提供选择;

08、允许部分人员只能浏览指定网站;

09、允许收发邮件(所有域名邮件(smtp,pop3))和只能收某域名收发某域名邮件;

10、IP/MAC绑定用户名认证上网;

11、三种认证方式(mysql,samba,ncsa);

实施环境:
PII350 , 512MB , 40GB ,双网卡

固定IP 1M带宽

子网: 192.168.168.0 192.168.1.0 ,网关 192.168.168.201 192.168.1.201

软件:RedHat9,光盘自定义安装方式。

所有软件以自带方式。

试试:
首先本人认为01 是不可能实现的,而11我又不会SQL和SAMBA认证只会基本认证,除此之外其余均能实现
假设子网192.168.1.0/24,某个域名为www.163.com通过PING 的其IP为202.108.36.196,通过其IP限制收发该域名邮件(可在iptables中实现)
外网网卡为eth0内网网卡为eht1,为eth1绑定192.168.1.201和192.168.0.201
cp eth1 eth1:1
修改eht1:1
没有限制的用户为192.168.0.201以后的IP用MAC标志
由于AS3没有安装GCC而本身的SQUID里又没有NCSA文件,固重新安装GCC和SQUID,
tar zxvf squid-2.5.STABLE7.tar.gz
cd squid-2.5.STABLE7
./configure --prefix=/usr/local/squid
--sysconfdir=/etc/squid #配置文件位置
--enable-arp-acl #客户端的MAC地址进行管理
--enable-linux-netfilter #允许使用Linux的透明功能
--enable-pthreads
--enable-err-language="Simplify_Chinese"
--enable-default-err-language="Simplify_Chinese"
#上面两个选项告诉Squid编入并使用简体中文错误信息
--enable-storeio=ufs,null #可以不用缓冲
--enable-auth="basic" #认证方式
--enable-baisc-auth-helpers="NCSA" #认证程序为
--enable-underscore #允许解析的URL中出现下划线
make
make install
开始配置squid.conf
##################################################################################################
# 服务器配置
icp_port 0
cache_store_log none
cache_access_log /dev/null
cache_log /dev/null
http_port 3128
cache_mem 128 MB
cache_dir null /tmp

pid_filename none
client_netmask 255.255.255.255
half_closed_clients on

#用户分类
auth_param basic program /usr/bin/ncsa_auth /usr/etc/passwd
auth_param basic children 5
auth_param basic realm Tianfuming proxy-caching server
auth_param basic credentialsttl 2 hours
acl normal proxy_auth REQUIDE #用户认证
acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ... #10 IP/MAC绑定用户名认证上网;
acl lana src 192.168.1.0/24
acl lanb src 192.168.0.1-192.168.0.200/32

#行为分类
acl download urlpath_regex -i \.mp3$ \.exe$ \.avi$ \.rar$ \.rvmb$ \.jpg #禁止下载
#acl conncount maxconn 5 #最大连接数
acl worktime MTWHF 8:00-18:00 # 04、允许全体人员在固定时间,有部分限制,
#不在此时间之内,撤除限制(在http_access中限制)
acl qq dstdomain .snnu.edu.cn
acl badwords url_regex sex

acl localhost src 127.0.0.1/32
acl all src 0.0.0.0/0.0.0.0

http_access allow advance # 03 允许部分人完全没有限制;
http_access allow localhost
#http_access deny conncount normal
http_access deny !
http_access deny badwords worktime # 不允许访问特定url字符网站
http_access deny qq worktime # 06 不允许访问特定的站点
http_access allow lana # 02 允许部分人可以下载
http_access deny download worktime # 05 不允许下载的特定url字符:exe/zip等等;
http_access allowd lanb homepage #08、允许部分人员只能浏览指定网站;
http_access allow normal
http_access deny all #除这些,禁止所有
#结合透明代理 07、透明代理与用户认证共存
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
####################################################################################
iptables脚本
####################################################################################
#! /bin/sh

UPLINK="eth0"
UPIP="a.b.c.d"
LANLINK="eth1"
ROUTER="yes"
#NAT="UPIP/dynamic"
NAT="UPIP"
INTERFACES="lo eth0 eth1"
SERVICES="80 22 25 110 "
deny=""
case "$@" in
start)
echo -n "Starting firewall..."
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
iptables -P INPUT DROP
iptables -A INPUT -i ! ${UPLINK} -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD DROP
iptables -A FORWARD -p tcp -m multiport --dport 25 80 110 -j ACCEPT
iptables -A FORWARD -d !202.108.36.196 -p tcp -m multiport --dprot 25 110 -j DROP ##09、只允许收发邮件(所有域名邮件
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #(smtp,pop3))和只能收某域名收发某域名邮件
#iptables -P OUTPUT DROP
#enable public access to certain services
for x in ${SERVICES}
do
iptables -A INPUT -p tcp --dport ${x} -m state --state NEW -j ACCEPT
done

for y in ${deny}
do
iptables -A OUTPUT -p tcp --dport ${y} -j DROP
iptables -A OUTPUT -p udp --dport ${y} -j DROP
done

#enable system-log
#iptables -A INPUT -j LOG --log-prefix "bad input:"

iptables -A INPUT -p tcp -i ${UPLINK} -j REJECT --reject-with tcp-reset
#iptables -A INPUT -p udp -i ${UPLINK} -j REJECT --reject-with icmp-port-unreachable

#explicitly disable ECN
if [ -e /proc/sys/net/ipv4/tcp_ecn ]
then
echo 0 > /proc/sys/net/ipv4/tcp_ecn
fi

#disable spoofing on all interfaces
for x in ${INTERFACES}
do
echo 1 > /proc/sys/net/ipv4/conf/${x}/rp_filter
done

if [ "$ROUTER" = "yes" ]
then
#we're a router of some kind, enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
if [ "$NAT" = "dynamic" ]
then
#dynamic IP address, use masquerading
iptables -t nat -A POSTROUTING -o ${UPLINK} -j MASQUERADE
elif [ "$NAT" != "" ]
then
#static IP, use SNAT
iptables -t nat -A PREROUTING -i ${LANLINK} -d ! ${UPIP} -j DNAT --to-ports 3128
iptables -t nat -A POSTROUTING -o ${UPLINK} -j SNAT --to ${UPIP}
fi
fi
echo "OK!"
exit 0
;;
stop)
echo -n "Stopping firewall..."
iptables -F INPUT
iptables -P INPUT ACCEPT
iptables -F OUTPUT
iptables -P OUTPUT ACCEPT
#turn off NAT/masquerading, if any
#iptables -t nat -F POSTROUTING
echo "OK!"
exit 0
;;
restart)
$0 stop
$0 start

;;
show)
clear
echo ">-------------------------------------------------------------------"
iptables -L
echo ">-------------------------------------------------------------------"
iptables -t nat -L POSTROUTING
exit 0
;;
*)
echo "Usage: $0 {start|stop|restart|show}"
exit 1
esac

用Squid实现代理上网及计费

---- IP紧缺是高速发展的网络面临的现实问题,我们该如何解决这 一问题?将只有内
部IP的计算机通过一台具有标准IP作为代理服务器 的计算机连接到Internet上是解决此
问题的一种绝妙手段。代理服务 器是数据的中转站,它可以将经过代理服务器的数据记
录下来,为后 继的数据分析和计费提供服务与帮助。另外,借助代理服务器软件 (比
如Squid)可以建立访问站点的缓存,从而让再次访问的用户能 够直接从缓存中调用数据,
加快访问速度,减少重复的网络数据流 量。

---- 由于Squid具有权限管理灵活、性能高和效率快等特点,应用较 为广泛,因此,我
们将就代理服务器软件Squid在Linux、FreeBSD和 Unix应用中的认证问题进行讨论,同时
还将介绍关于利用Squid辅助 软件实现代理上网与计费的具体方法。

一、 获取Squid及相关的软件

---- 从http://squid-cache.org/上获取Squid软件,从http:// web.onda.com.br/orso/
上获取htpasswd_plus和SQMGRLOG,并将它们 保存在/tmp目录下。

二、在Linux下编译并安装Squid

---- 我们假设软件环境为Redhat Linux 7.x,编译和安装Squid的操 作步骤如下。

---- 1.下载最新版本的源文件Squid-2.3.STABLE4.src.tar.gz,并 将它放置在/tmp目
录下。

---- 2.以root身份创建用户squidadmin#adduser squidadmin

---- 在缺省的情况下,同名组squidadmin已经被建立。Squid因为考 虑到安全问题,不
能以root身份运行,所以从一开始就使用新建的用 户进行安装管理。

---- 3.以squidadmin登录,对Squid源文件解包和安装。

$cd /tmp
$tar -zxvf squid*
$cd squid*
$./configure --prefix=/usr/local/squid
进入Squid目录进行编译,考虑的选项是安装路径
--prefix=/usr/local/squid。
$make
$make install

---- 4.进入/usr/local/squid/bin目录,执行$./squid -z,创建 cache交换目录。至此,
Squid已经安装在用户的系统上了。然而,要 让Squid正常运转,用户还需要做一些基本设
置。Squid的运转只与/ usr/local/squid/etc/squid.conf有关,所有设置均在此文件中完
成。

三、Squid基本设置

#Defaults:
acl all src 0.0.0.0/0.0.0.0
设置的规则在此处加入。
http_access deny all

---- 在缺省的情况下,有以上2条规则。当有请求未能匹配任何一条 用户定义的规则时,
http_access deny all规则将被应用,这 样,http请求将被拒绝。

---- 那么如何在Linux中设置Squid的用户认证存取控制呢?Squid用 access control list
(缩写为acl)来管理规则。例如:

acl aclname acltype string1 ...
acl aclname acltype "file"

---- aclname为用户定义规则的名字,acltype是可被Squid识别的类 别(主要有src、
dst、proxy_auth、port和time...),string为用 户的设置,可以用"file"从外部文件
调入设置。

---- 1.如果用户喜欢弹出输入用户名及密码的方式,首先需要安装 认证程序。Squid
的源文件包自带了几种认证程序,都在/tmp/squid- 2.3.STABLE4/auth_modules目录下。

(1)$ cd /tmp/squid-2.3.STABLE4/auth_modules/NCSA
$ make ncsa_auth
(2)将生成的执行文件ncsa_auth拷贝到squid执行文件目录中。
$ cp ncsa_auth /usr/local/squid/bin
(3)用htpasswd_plus生成供Squid利用的用户名和密码认证数据文 件。
$htpasswd_plus -c /usr/local/squid/etc/passwd
passwd的格式如下。
username1:SilykvIBT46C.:977867617:*
username2:tV.8XcR8tgIqw:*:192.168.1.0
username3:密码:失效时间:可以登录的IP
若为*,则说明任何项都能与其匹配。另外还可以增加其他更多的用 户。
$ htpasswd_plus /usr/local/squid/etc/passwd newusername
(4)修改squid.conf设置
authenticate program /usr/local/squid/bin/ncsa_auth
/usr/local/squid/etc/passwd指定认证身份的内部程序。添加规则 如下。
acl alloweduer proxy_auth username1 username2或者
acl alloweduser proxy_auth REQUIRED http access allow alloweduser

---- 关键字REQUIRED意味着任何合法的用户都可以认证身份,在其 他的acltype中也
起同样的作用。

---- 2.用IP限制Squid proxy的使用,设置内容如下。

acl manager proto HTTP FTP …
acl safeports port 80 21 443 563 70 210 1025-65535 …
acl connect method CONNECT
acl allowedIP src 202.120.x.x/255.255.255.224
acl denyIP src 202.96.x.x/255.255.255.224
acl allowedusers proxy_auth REQUIRED
http_access deny !safeports
#禁止来自!safeports的HTTP请求。
http_access deny denyIP
http_access allow allowedIP
http_access allow allowedusers

---- 这样,除了拒绝及允许的IP,其他的请求都将通过输入用户名 及密码来认证。
如果用户不希望内部计算机访问某些网站(比如暴力 或色情网站),可以通过如下
设置屏蔽这些站点。

---- acl badip dst "/usr/local/squid/etc/somebadip"

---- http_access deny badip

---- 此处被拒绝的不是来源src的IP地址,而是目的dst的IP地址。 在文件somebadip
中存储如下格式的一批IP地址:

---- 24.244.192.0/255.255.240.0

---- 61.128.0.0/255.252.0.0

---- 请大家特别注意http语句的顺序,正是通过不同的次序,使得 我们可以进行灵活
的配置,得到相应的服务。

---- 3.其他的一些设置如下所示,其中的大多数可以不做修改,只 使用缺省值即可。

http port 3128
#HTTP协议的默认代理端口。
cache mem 42MB
#用一块内存作为缓冲。
cache dir ufs /home/squid/cache 1024 16 256

---- #硬盘缓冲区的大小,大小为1GB,一级目录16个,二级目录256 个。

---- cache access log /var/log/squid/access.log

---- #该log文件是用来描述每次客户请求HTTP内容时高速缓存命中 或未命中的项目,同
时还描述提出请求的主机身份及它们所需要的内 容,它是用SQMGRLOG等软件分析记费的
基础。

---- cache log /var/log/squid/cache.log

---- #用于描述当Squid守护进程启动时可以看到的内存容量、交换 空间的大小、高速缓
存目录的位置、所接受的连接类型以及接受连接 的端口。

---- cache_store_log /var/log/squid/store.log

---- #用于描述页面从高速缓存中被调入调出的情况。

pid filename /var/run/squid.pid
#Squid进程的进程号。
dns nameservers 192.x.x.1
#定义域名解析服务器的地址。
cache_mgr [email protected]
#cache管理员的邮件箱地址。
reference age 1 week
#设置缓冲区的更新周期。
maximum object size 4096 KB
#设置允许被缓存的一次性最大请求。
cache_effective_user squidadmin squidadmin
#以用户squidadmin的身份运行。

四、用SQMGRLOG实现计费

$cd /tmp
$tar -zxvf sqmlog*
$cd sqm*
$./configure --enable-config=/usr/local/squid/
的选项主要有以下2项。

---- 1. 语言

---- 该语言不包含中文。事实上,它的语言部分是由English.h控制 的,可以汉化后
对其进行编译和安装。

---- --enable-language=English, Bulgarian_windows1251, Czech, Dutch, French,
German, Hungarian, Indonesian, talian, apanese, Portuguese, Russian_Koi8,
Russian_windows1251, Serbian, Spanish, Turkish default: English

---- 2.安装目录

---- --enable-config=/usr/local/squid/etc

---- #笔者将SQMGRLOG的配置文件sqmgrlog.conf 放在与Squid的配 置文件相同的目录下。

--enable-prefix=/usr/local/squid/bin
#最终编译生成的运行文件sqmgrlog的放置目录。
$make
$make install
最后,我们还要配置sqmgrlog.conf。
access log /usr/local/squid/logs/access.log
#设置Squid的使用记录文件access.log的所在地。
output dir /home/squidadmin/public_html/squid-reports
#生成report的输出目录。
password /usr/local/squid/etc/passwd
#只生成此passwd文件中指明的用户report。
$./sqmgrlog

SARG这个软件,就download下来,装在我的代理服务器上,哇噻,功能真是很强大.上网的记录完全的展现在你的面前,你浏览过的网页,下载过的东东,你的访问量,流量.......很全呀,不过,我都害怕了,这么全,我的上网记录不是全都爆光了:)

安装:

sarg-2.0.2.tar.gz

#tar -zxvf sarg-2.0.2.tar.gz

#cd sarg-2.0.2

#./configure

#make;make install

#vi /usr/local/sarg/sarg.conf #根据你的实际情况修改了

#vi /etc/cron.daily/sarg.daily #包括/etc/cron.weekly/sarg.weekly,/etc/cron.monthly/sarg.monthly,这些就是你的 Squid proxy Server的日报表,周报表,月报表呀,不过如果你的流量很大的话,就不要做日报表了,太大了,很浪费你的硬盘空间.

以下是几个cron的说明档,大家可以根据自己的需求修改:

sarg.cron
# Please edit the following lines to match your requirements
# Also edit sarg.* scripts if you want to customize reports folder
# To enable report generation put last 3 lines into your /etc/crontab
# file.

30 23 * * * root /usr/sbin/sarg.daily
01 0 * * 1 root /usr/sbin/sarg.weekly
30 1 1 * * root /usr/sbin/sarg.monthly

sarg.monthly
#!/bin/bash

#Get yesterday date
YESTERDAY=$(date --date "1 day ago" +%d/%m/%Y)

#Get 1 month ago date
MONTHAGO=$(date --date "1 month ago" +%d/%m/%Y)

/usr/sbin/sarg -o /var/www/html/squid/monthly -d $MONTHAGO-$YESTERDAY
# > /dev/null 2>&1

/usr/sbin/squid -k rotate

exit 0

sarg.daily
#!/bin/bash

#Get yesterday date
YESTERDAY=$(date --date "1 day ago" +%d/%m/%Y)

/usr/sbin/sarg -o /var/www/html/squid/daily -d $YESTERDAY > /dev/null 2>&1

exit 0

sarg.weekly
#!/bin/bash

#Generate Access.log for correct weekly reports
cat /var/log/squid/access.log.0 /var/log/squid/access.log > /var/log/squid/access.log.week

#Get yesterday date
YESTERDAY=$(date --date "1 days ago" +%d/%m/%Y)

#Get one week ago date
WEEKAGO=$(date --date "7 days ago" +%d/%m/%Y)

/usr/sbin/sarg -l /var/log/squid/access.log.week -o /var/www/html/squid/weekly -d $WEEKAGO-$YESTERDAY > /dev/null 2>&1

exit 0
sarg默认的输出的目录/var/www/html/,所以要创建/var/www/html/daily,monthly,weekly三个目录,或手动执行上述shell命令,在IE中打开http://yourip/daily,出来了吧
大家可以这里看一下我的抓图

squid日志分析软件sarg的安装和使用

1、SARG介绍

SARG的全称是:Squid Analysis Report Generator
SARG作为一款Squid日志分析工具,它采用html格式,详细列出了每一位用户访问internet的站点信息,时间占用信息,排名,连接次数,访问量,访问量等。
软件的主页:http://www.sarg-squid.org/ 目前最新的版本是2.0.2

2、安装

下载了sarg的最新安装包以后,进入下载的目录,执行以下的操作进行安装:
解压缩安装软件包
#tar zxvf sarg-2.0.2.tar.gz
进入解压后的目录,
#cd sarg-2.0.2
#./configure
在这里,也可以用./configure --help看看可以使用的configure可以使用的参数,一般来说,使用默认的选项就可以了。
#make
#make install
这样,就完成了sarg的安装,如果安装过程中出现错误,可以看看有没有安装gcc,或者在安装系统是没有安装相应的开发库。如果使用默认的选项,可执行文件是/usr/bin/sarg,配置文件是/usr/local/sarg/sarg.conf,在 /usr/local/sarg目录下还有一些其他的文件和目录。

3、配置

安装成功后,在/usr/local/sarg/目录中,有一个配置文件为sarg.conf,我们通过修改配置文件的参数,来达到对日志进行有规则的分析。也可以通过命令行参数实现。
sarg配置文件的方法和squid配置文件的配置方法类似,只要修改带有关键字的行:
"language english"
指定网页报告文件的语言类型,很可惜不支持中文网页。
"access_log /usr/local/squid/logs/access.log"
指定squid日志文件绝对路径。
"title "squid user access reports"
指定网页标题,可以写中文网页,内核支持先。
"temporary_dir /var/tmp"
指定临时文件目录,请确认该目录所在的分区足够大先,1g以上。
"output_dir /var/www/html/squid-reports"
指定网页报告文件输出路径,推荐使用webmaster或其他非admin用户运行sarg。
"topuser_sort_field connect reverse bytes reverse"
在top排序中,指定连接次数(connect),访问字节数(bytes)采用降序排列,升序请使用normal替代reverse
"user_sort_field connect reverse"
对于每个用户的访问纪录,连接次数按降序排列
"exclude_hosts /usr/local/sarg/norecords"
指定不计入排序的站点列表文件名为/usr/local/sarg/norecords,对于客户端 访问的这些站点,将不会被top排序中,norecords文件样本:
google.com
csdn.net
microsoft.com
"date_format e"
启动sarg进程是如果使用日期参数-d时,请使用和配置文件一致的日期格:
e (europe=dd/mm/yy),
u (usa=mm/dd/yy),
w (weekly=yy.ww)
"topuser_fields num date_time userid connect bytes %bytes in-cache-out used_time milisec %time total average"
指定top排序的域,可以取掉一些不关紧要的域:in-cache-out used_time等
"weekdays 1-5"
指定top排序星期周期为星期一到星期五,0表示星期天
"hours 9-11,13-16"
指定top排序的时间周期为9:00-11:59,13:00-16:59,哈哈,差不多为上班时间

至此,sarg.conf文件的配置基本上over了,还有些不是太重要的配置一看就明白,在此就不耽误大家的时间了。

sarg的命令行解释如下:
# sarg -h
sarg: usage [options...]
-a hostname or ip address
指定不计入排序的主机名称或地址
-b useragent log
用户代理日志文件输出
-c exclude file
指定不计入排序的站点列表文件名为/usr/local/sarg/norecords,对于客户端访问的这
些站点,将不会被top排序中
-d date from-until dd/mm/yyyy-dd/mm/yyyy
指定日期范围
-e email address to send reports (stdout for console)
指定报告接收者邮件
-f config file (/usr/local/sarg/sarg.conf)
指定配置文件
-g date format [e=europe -> dd/mm/yy, u=usa -> mm/dd/yy]
指定输入的日期格式
-h help (this...)
列帮助信息
-i reports by user and ip address
指定客户端排序采用用户名或者ip地址
-l input log
指定squid日志文件绝对路径。
-o output dir
指定网页报告文件输出路径,推荐使用webmaster或其他非admin用户运行
sarg。
-p use ip address instead userid (reports)
使用ip地址作为userid域
-w temporary dir
指定临时文件目录,请确认该目录所在的分区足够大先,1g以上。

4、运行
一般来说,我们希望系统可以自动生成日志分析以后的结果。在这里,我们利用cron来实现,把以下的相应脚本放到cron里面去执行即可

日报告:
-------------------------------------
#!/bin/bash
#Get current date
TODAY=$(date +%d/%m/%Y)
#Get one week ago today
YESTERDAY=$(date --date "1 day ago" +%d/%m/%Y)
/usr/local/bin/sqmgrlog -l /usr/local/squid/logs/access.log -o /usr/local/apache/htdocs/reports/daily -z -d $YESTERDAY-$TODAY
exit 0

周报告:
-------------------------------------
#!/bin/bash
#Get current date
TODAY=$(date +%d/%m/%Y)
#Get one week ago today
YESTERDAY=$(date --date "1 week ago" +%d/%m/%Y)
/usr/local/bin/sqmgrlog -l /usr/local/squid/logs/access.log -o /usr/local/apache/htdocs/reports/weekly -z -d $YESTERDAY-$TODAY
exit 0

月报告:
-------------------------------------
#!/bin/bash
#Get current date
TODAY=$(date +%d/%m/%Y)
#Get one week ago today
YESTERDAY=$(date --date "1 month ago" +%d/%m/%Y)
/usr/local/bin/sqmgrlog -l /usr/local/squid/logs/access.log -o /usr/local/apache/htdocs/reports/monthly -z -d $YESTERDAY-$TODAY
/usr/local/squid/bin/squid -k rotate
exit 0

通过邮件发送报告:
#!/bin/bash
#Get current date
TODAY=$(date +%d/%m/%Y)
#Get one week ago today
YESTERDAY=$(date --date "1 day ago" +%d/%m/%Y)
/usr/local/bin/sqmgrlog -l /usr/local/squid/logs/access.log -e [email protected] -z -d $YESTERDAY-$TODAY

Linux做代理

环境:Linux ADV3.0

代理软件:Squid 2.5.6

主机:Proxy01 IP:132.147.165.235 端口:81/1080

实现目标:用户端使用合法的用户名和密码登入

步聚:

1、 下载最稳定、最新的Squid软件:squid-2.5.STABLE6.tar.gz,解压:

tar xzvf squid-2.5.STABLE6.tar.gz

2、 编辑:

make

make install

3、 确认ncsa_auth此程序是否存在,正常情况下会存在于/usr/lib/squid/目录下,将此文件Copy至/usr/bin 目录中(此种做法的意义在于已加入到了启动搜索的Path中)

4、 配置/etc/squid/squid.conf文件,

先将原文件做好备份,再做编辑

cp squid.conf squid.conf.bak

vi squid.conf

主要要修改的参数如下:

auth_param basic program /usr/bin/ncsa_auth /usr/bin/passwd

--指定使用此程序来进行用户认证的方式,在/usr/bin/passwd中,Passwd文件必须可以被普通用户能够读、执行,通行如下实现:

chmod 755 passwd

http_port 132.147.16 132.147.165.235:81 --设定Squid的代理端口,加上IP地址,Squid就不会监听外部的网络端口

cache_mgr [email protected] --配置管理员的E_mail

cache_access_log /var/log/squid/access.log --设定Client User访问代理的详细记录,包括用户名,IP地址,访问的网址等。

dns_nameservers 202.96.134.133 132.147.160.2 --设定DNS

visible_hostname proxy01 --设定标志的主机名称,也就是做代理的主机名称,必选

httpd_accel_with_proxy on --打开使用Squid代理本地的Web服务

cache_mem 20 MB --指定Squid可以使用的RAM

maximum_object_size 2048 KB --指定缓存文件的最大值

minimum_object_size 0 KB --指定缓存文件的最小值

cache_swap_low 85

cache_swap_high 90 --设定进行空间交换的空占比

cache_dir ufs /var/spool/squid 1000 16 256 --设定磁盘缓存目录

以上建缓存在磁盘上,如要建立高速缓存目录,可如下操作

mkdir /dev/shm/tmp

chmod 1777 /dev/shm/tmp

mount –bind /dev/shm/tmp /var/spool/squid --被Mount的目录为刚建立的磁盘缓存目录

将http_access deny all更改为http_access allow all

再加入如下语句:

acl our_network src 132.147.165.0/24 132.147.166.0/24 132.147.164.0/24 132.147.163.0/24

--建立规则,这个规则包括这么上些内容

acl our_user proxy_auth REQUIRED

--建用户认证的规则,所有合法的用户都可以通过认证

httpd_access allow our_network

--应用这个规则

httpd_access allow our_user

--应用这个规则

5、 最后一步,添加用户:

使用Apache中的一个程序来实现对用户添加,以配合ncsa_auth程序验证

htpasswd –c /usr/bin/passwd mis_wub

以上语句的意思为在Passwd文件建立一个Mis_wub的用户名,并保存它的密码。

6、 重启Squid或重起机器,以便得Squid生效

squid –k reconfigure

or

shutdown –rf now

日常工作维护:

1、 用户添加:htpasswd –c /usr/bin/passwd user_name

2、 查看日志:more /var/log/squid/access.log

3、 备份:/etc/squid/squid.conf

/usr/bin/passwd

/var/log/squid/access.log

4、 日志管理:

/var/log/squid 下所有

5、 用户管理:

A、 添加用户:htpasswd –b /usr/bin/passwd user_name user_passwd

B、 删除用户:htpasswd –D /usr/bin/passwd user_name

C、 更改密码:htpasswd –b /usr/bin/passwd user_name user_passwd

Socks5代理:

1、 安装

tar xvzf socks5-v1.0r11.tar.gz

cd socks5-v1.011

./configure

make

make install

2、 将配置文件Copy到/etc目录下,并改名

cd samples

cp socks5.conf.singlehomed socks5.conf

3、 默认情况下是对所有开放1080端口

4、 socks5 –t –运行Socks5的服务