我的 squid 笔记

发布时间:2019-10-17编辑:脚本学堂
squid 笔记,详述了squid的安装、配置,常用配置选项说明,访问控制及应用实例,供大家学习参考。

squid 笔记,详述了squid的安装、配置,常用配置选项说明,访问控制及应用实例,供大家学习参考。

1)因为squid的工作方式,文件描述符的限制可能会极大的影响性能。当squid用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket被关闭,squid不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。

大多数情况下,1024个文件描述符足够了。非常忙的cache可能需要4096或更多。
sh$ ulimit -n   查看文件描述符的限制
4096

如果你不能确认文件描述符限制,squid的./configure脚本能替你做到。当你运行./configure时,请见3.4章节,观察末尾这样的输出:
checking Maximum number of file descriptors we can open... 4096
假如其他的limit,ulimit,或者./configure报告这个值少于1024,

linux用户可能在启动squid之前需要设置文件描述符限制。例如:
echo 8192 > /proc/sys/fs/file-max
limit -HSn 8192
在Linux上配置文件描述符有点复杂。在编译squid之前,你必须编辑系统include文件中的一个,然后执行一些shell命令。请首先编辑/usr/include/bits/types.h文件,改变_ _FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用这个命令增加内核文件描述符的限制:
# echo 8192 > /proc/sys/fs/file-max
最后,增加进程文件描述符的限制,在你即将编译squid的同一个shell里执行:
sh# ulimit -Hn 8192
该命令必须以root运行,仅仅运行在bash shell。不必重启机器。
使用这个技术,你必须在每一次系统启动后执行上述echo和ulimit命令,或者至少在squid启动之前。假如你使用某个rc.d脚本来启动squid,那是一个放置这些命令的好地方

2)安装
 

复制代码 代码如下:
./configure --prefix=/usr/web/squid --enable-arp-acl --enable-err-languages="Simplify_Chinese"  --enable-default-err-languages="Simplify_Chinese" --enable-linux-netfilter  --enable-underscore --enable-async-io --enable-storeio=aufs


跑squid碰到一个问题
运行程序的时候报:
FATAL: Bungled squid.conf line xxx:  cache_dir ufs /path/cache  256 16 256
Squid Cache (Version 2.5.STABLE13-xxxxxxxx):: Terminated abnormally.
结果发现是因为存储缓存用的是ufs

启用这种格式必须在编译squid的时候加上async-io的支持

在于是重新编译squid,加上async-io支持
./configure –enable-async-io
这里如果cache_dir不是设的ufs而是aufs的话,还需要加上参数–enable-storeio=aufs
然后再
make;make install
再启动squid
就OK了

3)squid运行命令参数:
squid -a port     制定新的http_port 值,覆盖了配置文件的值。
squid -d level    记录调试日志(cache.log,syslog)信息的等级。

squid  -f file    指定一个配置文件
squid  -k function   只是squid执行不同的管理功能,包括:
    reconfigure,rotate,shutdown,interrupt,kill,debug,parse。
    reconfigure: 重新加载配置squid.conf
    rotate:      滚动日志,包括关闭日志,重命名。
    shutdown:    关闭squid进程的信号
    interrupt:   立刻关闭squid
    kill:       发送kill信号给squid。
    debug:       将squid设置成完全的调试模式。
    check:       简单的检查运行中的squid进程。
    parse:       简单的解析squid.conf文件。

squid -s   激活将日志记录的syslog进程。
squid   -u port   指定另一个icp端口号,覆盖掉squid.conf文件里的icp_port
squid -z   初始化cache,或者交换,目录。首次运行squid是要执行此参数。
squid  -D   禁止启动时验证dns。
squid  -X   强迫完整调试模式。

4)访问控制参数;
基本acl类型

 IP地址
   使用对象:src,dst,myip
   myip类型指Squid的IP地址,它被客户连接,大部分squid安装不使用该类型。
   通常所有的客户连接到同一个IP地址,所以该ACL元素仅仅当系统有多个IP地址时才有用。

   例如:情况下的squid有三个网络接口:一个连接子网1,一个连接子网2,第三个连接到外部因特网。
    
    acl Eng myip 172.16.1.5
    acl Admin myip 172.16.2.5
 
   例:acl localnetwork  src 172.16.100.0/24  172.16.103.0/24
              acl bar src  192.168.1.0-192.168.200.0/24
       acl outnetwork    dst  219.143.48.0/24
 域名

   当ACL域名以"."开头,squid将它作为通配符,它匹配在该域的任何主机名,甚至域名自身。
   相反的,如果ACL域名不以"."开头,squid使用精确的字符串比较,主机名同样必须被严格检查

   使用对象:srcdomain,dstdomain,和cache_host_domain
  
   例:acl a  dstdomain .sohu.com .163.com
            
 用户名:
   使用对象:ident,proxy_auth
 
 正则表达式: 使用对大小写不敏感的参数:-i
 
   使用对象:   
    srcdom_regex,dstdom_regex, url_regex, urlpath_regex, browser,
    referer_regex, ident_regex, proxy_auth_regex, req_mime_type, rep_mime_type
        
   例:acl Foo url_regex -i ^http://www
       acl badurl1 url_regex -i ^http://www.s

 端口号:
   使用对象:port,myport
 
   例:acl Bar port 1-1024

常用的配置选项
因为缺省的配置文件有问题,所以我们必须首先修改该配置文件的有关内容,以便让squid跑起来。
下面我们来看一看squid.conf文件的结构以及一些常用的选项:
squid.conf配置文件的可以分为十三个部分,这十三个部分分别是:
1.NETWORK OPTIONS (有关的网络选项)
2.OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM (作用于邻居选择算 法的有关选项)
3.OPTIONS WHICH AFFECT THE CACHE SIZE (定义cache大小的有关选项)
4.LOGFILE PATHNAMES AND CACHE DIRECTORIES (定义日志文件的路径及cache的目录)
5.OPTIONS FOR EXTERNAL SUPPORT PROGRAMS (外部支持程序选项)
6.OPTIONS FOR TUNING THE CACHE (调整cache的选项)
7.TIMEOUTS (超时)
8.ACCESS CONTROLS (访问控制)
9.ADMINISTRATIVE PARAMETERS (管理参数)
10.OPTIONS FOR THE CACHE REGISTRATION SERVICE (cache注册服务选项)
11.HTTPD-ACCELERATOR OPTIONS (HTTPD加速选项)
12.MISCELLANEOUS (杂项)
13.DELAY POOL PARAMETERS (延时池参数)

虽然squid的配置文件很庞大,但是如果你只是为一个中小型网络提供代理服务,并且只准备使用一台服务器,那么,你只需要修改配置文件中的几个选项。这些几个常用选项分别是:
1.http_port
说明:定义squid监听HTTP客户连接请求的端口。缺省是3128,如果使用HTTPD加速模式 则为80。你可以指定多个端口,但是所有指定的端口都必须在一条命令行上。
2.cache_mem (bytes)
说明:该选项用于指定squid可以使用的内存的理想值。这部分内存被用来存储以下对象 :
In-Transit objects (传入的对象)
Hot Objects (热对象,即用户常访问的对象)
Negative-Cached objects (消极存储的对象)
需要注意的是,这并没有指明squid所使用的内存一定不能超过该值,其实,该选项只 定义了squid所使用的内存的一个方面,squid还在其他方面使用内存。所以squid实际 使用的内存可能超过该值。缺省值为8MB。

3.cache_dir Directory-Name Mbytes Level-1 Level2
说明:指定squid用来存储对象的交换空间的大小及其目录结构。可以用多个cache_dir命令来定义多个这样的交换空间,并且这些交换空间可以分布不同的磁盘分区。"directory "指明了该交换空间的顶级目录。如果你想用整个磁盘来作为交换空间,那么你可以将该目录作为装载点将整个磁盘mount上去。缺省值为/var/spool/squid。“Mbytes”定义了可用的空间总量。需要注意的是,squid进程必须拥有对该目录的读写权力。“Level-1”是可以在该顶级目录下建立的第一级子目录的数目,缺省值为16。同理,“Level-2”是可以建立的第二级子目录的数目,缺省值为256。为什么要定义这么多子目录呢?这是因为如果子目录太少,则存储在一个子目录下的文件数目将大大增加,这也会导致系统寻找某一个文件的时间大大增加,从而使系统的整体性能急剧降低。所以,为了减少每个目录下的文件数量,我们必须增加所使用的目录的数量。如果仅仅使用一级子目录则顶级目录下的子目录数目太大了,所以我们使用两级子目录结构。
那么,怎么来确定你的系统所需要的子目录数目呢?我们可以用下面的公式来估算。
已知量:
DS = 可用交换空间总量(单位KB)/ 交换空间数目
OS = 平均每个对象的大小= 20k
NO = 平均每个二级子目录所存储的对象数目 = 256
未知量:
L1 = 一级子目录的数量
L2 = 二级子目录的数量
计算公式:
L1 x L2 = DS / OS / NO
注意这是个不定方程,可以有多个解。
 
4.acl
说明:定义访问控制列表。

定义语法为:

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

当使用文件时,该文件的格式为每行包含一个条目。
acltype 可以是 src dst srcdomain dstdomain url_pattern urlpath_pattern time port proto method browser user 中的一种。

分别说明如下:

src 指明源地址。可以用以下的方法指定:

acl aclname src ip-address/netmask ... (客户ip地址)
acl aclname src addr1-addr2/netmask ... (地址范围)

dst 指明目标地址。语法为:

acl aclname dst ip-address/netmask ... (即客户请求的服务器的ip地址)

srcdomain 指明客户所属的域。语法为:
acl aclname srcdomain foo.com ... squid将根据客户ip反向查询DNS。
 
dstdomain 指明请求服务器所属的域。语法为:
acl aclname dstdomain foo.com ... 由客户请求的URL决定。
注意,如果用户使用服务器ip而非完整的域名时,squid将进行反向的DNS解析来确 定其完整域名,如果失败就记录为“none”。

time 指明访问时间。

语法如下:
acl aclname time [day-abbrevs] [h1:m1-h2][hh:mm-hh]
day-abbrevs:
S - Sunday
M - Monday
T - Tuesday
W - Wednesday
H - Thursday
F - Friday
A - Saturday
h1:m1 必须小于 h2:m2,表达示为[hh:mm-hh]。
 
port 指定访问端口。可以指定多个端口,比如:

acl aclname port 80 70 21 ...
acl aclname port 0-1024 ... (指定一个端口范围)
proto 指定使用协议。可以指定多个协议:
acl aclname proto HTTP FTP ...
method 指定请求方法。比如:
acl aclname method GET POST ...

5.http_access

说明:根据访问控制列表允许或禁止某一类用户访问。
如果某个访问没有相符合的项目,则缺省为应用最后一条项目的“非”。比如最后一条为允许,则缺省就是禁止。所以,通常应该把最后的条目设为"deny all" 或 "allow all" 来避免安全性隐患。

4.2 应用实例
假想情景:某公司用squid作代理服务器,该代理服务器配置为PII450/256M/8.4G,公司所用ip段为1.2.3.0/24,并且想用8080作为代理端口。
则相应的squid配置选项为:
1.http_port
http_port 8080
2.cache_mem
思路:由于该服务器只提供代理服务,所以该值可以尽量设得大一些。
cache_mem 194M
3.cache_dir Directory-Name Mbytes Level-1 Level2
思路:硬盘为8.4G的,在安装系统时应该做好规划,为不同的文件系统划分可用空间。在本例中,我们可以这样来划分:
/cache1 3.5G
/cache2 3.5G
/var 400M
swap 127M
/ 剩余部分
并且,在安装时,我们尽量不安装不必要的包。这样在节约空间的同时可以提高系统的安全性和稳定性。下面我们来计算所需的第一级和第二级子目录数。
已知量:
DS = 可用交换空间总量(单位KB)/ 交换空间数目=7G/2=3500000KB
OS = 平均每个对象的大小= 20k
NO = 平均每个二级子目录所存储的对象数目 = 256
未知量:
L1 = 一级子目录的数量
L2 = 二级子目录的数量
计算公式:
L1 x L2 = DS / OS / NO=3500000/20/256=684
我们取
L1=16
L2=43
所以,我们的cache_dir语句为:
cache_dir /cache1 3500M 16 43
cache_dir /cache2 3500M 16 43
4.acl
思路:通过src来定义acl.
acl allow_ip src 1.2.3.4/255.255.255.0
5.http_access
http_access allow allow_ip

4.3启动、停止squid。
配置并保存好squid.conf后,可以用以下命令启动squid。
squid
或者,使用redhat的启动脚本来启动squid.
/etc/rc.d/init.d/squid start
同样地,你也可以用下列脚本停止运行squid或重启动squid.
/etc/rc.d/init.d/squid stop
/etc/rc.d/init.d/squid restart

4、acl详解
说明:定义访问控制列表。
定义语法为:
acl aclname acltype string1 ...
acl aclname acltype "file" ...
当使用文件时,该文件的格式为每行包含一个条目。
acltype可以是src dst srcdomain dstdomain url_pattern urlpath_pattern time port proto method browser user中的一种。
分别说明如下:
src指明源地址。可以用以下的方法指定:
acl aclname src ip-address/netmask ... (客户ip地址)
acl aclname src addr1-addr2/netmask ... (地址范围)
dst指明目标地址。语法为:
acl aclname dst ip-address/netmask ... (即客户请求的服务器的ip地址)
srcdomain指明客户所属的域。语法为:
acl aclname srcdomain foo.com ... squid将根据客户ip反向查询DNS。
dstdomain指明请求服务器所属的域。语法为:
acl aclname dstdomain foo.com ...由客户请求的URL决定。
注意,如果用户使用服务器ip而非完整的域名时,squid将进行反向的DNS解析来确定其完整域名,如果失败就记录为“none”。
time指明访问时间。语法如下:
acl aclname time [day-abbrevs] [h1:m1-h2][hh:mm-hh]
day-abbrevs:
S - Sunday
M - Monday
T - Tuesday
W - Wednesday
H - Thursday
F - Friday
A - Saturday
h1:m1必须小于h2:m2,表达示为[hh:mm-hh]。
port指定访问端口。可以指定多个端口,比如:
acl aclname port 80 70 21 ...
acl aclname port 0-1024 ...(指定一个端口范围)
proto指定使用协议。可以指定多个协议:
acl aclname proto HTTP FTP ...
method指定请求方法。比如:
acl aclname method GET POST ...
5.http_access
说明:根据访问控制列表允许或禁止某一类用户访问。
如果某个访问没有相符合的项目,则缺省为应用最后一条项目的“非”。比如最后一条为允许,则缺省就是禁止。所以,通常应该把最后的条目设为"deny all"或"allow all"来避免安全性隐患。