Squid cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器。Squid有广泛的用途,从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度,到为一组人共享网络资源而缓存万维网,域名系统和其他网络搜索,到通过过滤流量帮助网络安全,到局域网通过代理上网。Squid主要设计用于在Unix一类系统运行。
Squid的发展历史相当悠久,功能也相当完善。除了HTTP外,对于FTP与HTTPS的支援也相当好,在3.0 测试版中也支援了IPv6。
你可以测试:curl -I www.163.com显示下面的X-Via .....(Cdn Cache Server v2.0 sxbj)显示其所用的代理服务器的名称。
实验1:(1)首先:Squid 基本配置
yum install squid -y
#使用 tmpfs 动态文件系统加速 squid
mkdir -m 1777 /dev/shm/squid
(或者是chown squid.squid squid 然后chmod 750 squid/ 只要是squid对/dev/shm/squid具有7的权限即可。)
mount --bind /dev/shm/squid /var/spool/squid
service squid start
(2) df -h 可以用来显示: /dev/shm。
ll /var/spool/squid是指的默认的缓存路径。
/etc/init.d/squid start
此时正常的来说:ll /var/spool/squid下面会有一些文件,如果没有则需要修改文件:vi /etc/squid/squid.conf
cache_dir ufs /var/spool/squid 100 16 256的注释打开。
正常你会在ll /var/spool/squid下发现16个目录,然后在每个目录下有256个子目录。
同样的在/dev/shm/squid 也是那样子的哦!
实验2:步骤(1)
[root@server40 shm]# /etc/init.d/squid status
squid (pid 2449) is running...
2011/11/20 19:05:42| WARNING cache_mem is larger than total disk cache space!
(2)vi /etc/squid/squid.conf
- #http_access allow localnet
- http_access allow localhost
- cache_mem 64 MB
([root@Desktop46 00]# squid -k reconfigure
2012/04/01 16:21:52| WARNING: No units on 'cache_mem 64MB ', assuming 64.00 bytes重启的过程中出现以上错误,是因为64和MB之间要有空格的,否则会有上述错误 64 MB!!!!!!!!!!!!!!!!!!)
/etc/init.d/squid restart(OR squid -k reconfigure不报错就是对的。)
(3)打开火狐:Edit-->Preferences-->Advance->Network-->Setting-->Manual proxy configuration:HTTP Proxy:192.168.0.140 post:3128(不用选择use this proxy server for all protocols )(假设以上设置全是在192.168.0.140上进行设置的。)
此时你输入网址:www.baidu.com
会出现:
Generated Sun, 20 Nov 2011 11:25:57 GMT by server40.example.com (squid/3.1.4)
着说明你拒绝成功!
实验三:
(1)在server40(192.168.0.140) 上:
vi /etc/squid/squid.conf
acl desktop38 src 192.168.0.38
http_access deny desktop38(用该句来替换下面的http_access deny all这一句话,大约在59行)
意思是你拒绝desktop38这台主机以140为代理服务器。
(2)squid -k reconfigure(重新读入文件)
(3)此时在desktop38(192.168.0.38主机上)打开火狐:Edit-->Preferences-->Network-->Setting-->Manual proxy configuration:HTTP Proxy:192.168.0.140
此时拒绝访问,而你如果将上述两条注释之后,那么你就可以访问了。
实验四:
(1)在server40(192.168.0.140) 上:
vi /etc/squid/squid.conf
acl desktop38 src 192.168.0.38
acl cleantime time MTWHF 15:00-18:00(意思在周一到周五的这段时间在15:00-18:00的时候要拒绝访问。MTWHF分别代表周一周二周三。。。。)
http_access deny desktop38 cleantime
意思是你拒绝desktop38这台主机以140为代理服务器。
(2)squid -k reconfigure(重新读入文件)
(3)此时在desktop38(192.168.0.38主机上)打开火狐:Edit-->Preferences-->Network-->Setting-->Manual proxy configuration:HTTP Proxy:192.168.0.140
倘若现在的时间是在:15:00-18:00之间的话,那么你不可以访问,倘若不在那个时间段,你是可以访问(另外要注意一点两个机子的时间必须是一致的。即192.168.0.140(部署squid的服务器)和192.168.0.38(以192.168.0.140为代理服务器的主机)上的时间应该是一致的,改动在/etc/ntp.conf中进行修改的哦!)
实验五:
#站点屏蔽
echo 151.11.56.58 > /etc/squid/sexip
echo .sex.com > /etc/squid/sexdn
echo www.playbody.com > /etc/squid/sexurl
echo sex > /etc/squid/sextag
chown root:squid /etc/squid/sex{ip,dn,url,tag}
chmod 640 /etc/squid/sex{ip,dn,url,tag}
vim /etc/squid/squid.conf
- acl sexip dst "/etc/squid/sexip" (sexip 记录不法 ip 地址)
- acl sexdn dstdomain "/etc/squid/sexdn" (sexdn记录不法域名)
- acl sexurl url_regex "/etc/squid/sexurl" (sexurl记录不法网址)
- acl sextag urlpath_regex "/etc/squid/sextag" (sextag记录不法关键字)
- http_access deny sexdn
- http_access deny sexip
- http_access deny sexurl
- http_access deny sextag
(注意那个deny的要在allow之前哦,否则会被放进来的!)
测试:假设你现在客户端的IP:192.168.0.38时,设置以140为代理squid。那么你现在在192.168.0.38这台机子上:访问:151.11.56.58, www.souhu.sex.com www.playbody.com,或者有sex关键字的时候都是拒绝的,但如果你是访问这个www.baidu.com则是可以的哦!(因为你没有写关于防止www.baidu.com的任何信息)
实验6:#限制访问端口
- acl SSL_ports port 443
- acl Safe_ports port 80
- acl Safe_ports port 21
- acl CONNECT method CONNECT
- http_access deny !Safe_ports
- http_access deny CONNECT !SSL_ports
意思就是拒绝非safe_ports.也就是允许21,80这两个端口进行访问,拒绝connect。
实验7:
squid 反向代理加速 web
#监听服务器 192.168.0.254 的 80 端口,透明代理,支持域名和 IP 的虚拟主机
http_port 192.168.0.254:80 transparent vhost vport
#代理到本机的 80 端口的服务,仅仅做为原始内容服务器(这样子不用防火墙参与,即可完成 web 反向代理加速)
cache_peer 127.0.0.1 parent 80 0 noquery originserver
测试:你在以该机子为服务器的客户端:输入类似:www.baidu.com,那么你会显示:server40,
实验8:
在192.168.0.140主机上:squid 反向代理对后端进行负载均衡
- cache_peer 192.168.0.38 parent 80 0 noquery originserver name=a round-robin
- cache_peer 192.168.0.40 parent 80 0 noquery originserver name=b round-robin
- cache_peer_domain a www.example.com
- cache_peer_domain b www.example.com
(也可以这两条合在一起为:cache_peer_domain a b www.example.com)
在这个例子中 www.example.com 就是 squid 服务器的地址 squid 使用的是 RR 的方法轮询,从后端的实际服务器中
挑选一台进行抓取,同时会对后端的健康状态进行检查,如果后端服务器 down 掉,那么 squid 会从剩余的 origin 服
务器中抓取数据
测试:你在192.168.0.38和192.168.0.40这两个主机上开启httpd /etc/init.d/httpd restart
然后你在一个客户端上输入: www.example.com 的时候你点击刷新:会发现desktop40.example.com和desktop38.example.com(写在/var/www/html/index.html里面)
当你关闭一台机子上的httpd的时候会只显示一台机子上。
实验9:
squid 用户认证
htpasswd /etc/squid/passwd test(test不一定是系统用户)
chown root:squid /etc/squid/passwd
chmod 640 /etc/squid/passwd vim /etc/squid/squid.conf
- auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/passwd
- auth_param basic children 5
- auth_param basic realm Squid-Home Proxy Server
- auth_param basic credentialsttl 2 hours
- auth_param basic casesensitive off
- acl INTERNAL src 192.168.0.0/24
- acl AUTHUSERS proxy_auth REQUIRED
acl INTERNAL src 192.168.0.0/24(该条的意思是当这个网段的用户主机将squid服务器作为代理服务器的时候都将通过密码进入,如果为acl INTERNAL src 192.168.0.90的时候就是在主机90上以squid作为代理服务器的时候是要通过密码进入的。
- http_access allow INTERNAL AUTHUSERS(该条应该在下面几条下面)
- http_access allow localnet
- http_access allow localhost
squid -k reconfigure
测试:假设客户端你设置你的desktop40(192.168.0.40主机上)打开火狐:Edit-->Preferences-->Network-->Setting-->Manual proxy configuration:HTTP Proxy:192.168.0.90.比如输入:www.baidu.com就会弹出一个对话框,让你输入用户和密码。用户名:test 密码:redhat
实验10.
squid+mysql 认证
(1)yum install gcc mysql mysql-server mysql-devel y
wget http://people.arxnet.hu/airween/mysql_auth/mysql_auth0.8.tar.gz
tar zxf mysql_auth0.8.tar.gz(或者lftp 192.168.0.254 cd pub/docs/squid get mysql_auth0.8.tar.gz )
cd mysql_auth0.8
(2) mkdir -p /usr/local/squid/etc
mkdir -p /usr/local/squid/libexec
(3) vi Makefile
- CFLAGS = -I/usr/include/mysql -L/usr/lib64/mysql
- install:
- $(INSTALL) -o squid -g squid -m 755 mysql_auth /usr/local/squid/libexec/mysql_auth
- $(INSTALL) -o root -g root -m 700 mypasswd /usr/local/bin/mypasswd
- $(INSTALL) -o squid -g squid -m 600 $(CONF) /usr/local/squid/etc/mysql_auth.conf
- $(INSTALL) -o squid -g squid -m 600 $(CONF) /usr/local/squid/etc/mysql_auth.conf.default
(4)修改 src/mysql_auth.conf
mysqld_socket /var/lib64/mysql/mysql.sock(可以用rpm -ql mysql查它的套接字在哪里,如果在lib下你可以直接下该路经,也可以ln -s lib lib64/ 先源后目标注意不要把mysql.sock写成mysqld.sock。自己改了好久才发现是多写了一个d的缘故啊 !!!)
(5)修改 src/mypassword.c
将#include
#include
(6)修改 src/mysql_auth.c
将#include
#include
(7)make && make install
(8)cd scripts/
mysql < create_script
(9)另外还要在在/etc/squid/squid.conf 中增加 mysql_auth 认证
添加下面的代码到"TAG: acl"一节的后面
- auth_param basic program /usr/local/squid/libexec/mysql_auth
- auth_param basic realm Squid caching server
- auth_param basic children 5
- auth_param basic credentialsttl 2 hours
- acl our_networks src 192.168.0.0/24(允许这个网段的用户通过密码登录!)
- acl password proxy_auth REQUIRED
- http_access allow our_networks password
squid -k reconfigure
(10)添加用户
执行命令:mypasswd test test(添加用户和密码)注意这一步的执行要先执行mysql < create_script才可以的噢!如下:
测试:假设客户端你设置你的desktop40(192.168.0.40主机上)打开火狐:Edit-->Preferences-->Network-->Setting-->Manual proxy configuration:HTTP Proxy:192.168.0.90.比如输入:www.baidu.com就会弹出一个对话框,让你输入用户和密码。用户名:test 密码:test
注意:test用户不一定是系统用户。
实验11.
squid+openldap 认证
(1). 安装软件.
你现在准备安装软件; 这通常需要超级用户权限:
yum list openldap*
yum install openldap openldap-clients openldap-servers -y
(2)cd /etc/openldap
ls
你会看到cacerts ldap.conf schema slapd.d
编辑配置文件.
首先你删除openldap的配置文件目录,不然它不会读/etc/openldap/slapd.conf
rm -rf /etc/openldap/slapd.d
mv slapd.conf.bak slapd.conf
vi slapd.conf
- suffix "dc=sushan,dcdc=org"//或者可以写在一起"dc=sushan.org"
- rootdn "cn=Manager,dc=sushan.org"
- rootpw sushan (注意中间是2个空格噢!)
(z需要特别注意的是rootpw和sushan之间必须是2个tab健,否则在后面测试的时候会报错)ldappasswd是修改ldap用户密码的。
(3)cd /var/lib/ldap
复制模板文件,不然重启的时候会报错valid(49)说是不合法的密码的错误。
cp /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example .
mv DB_CONFIG.example DB_CONFIG
chown ldap.ldap DB_CONFIG
(4)/etc/init.d/sladp start
此时你在/var/lib/ldap
ll 会看到一些db文件。
(5)vi /etc/openldap/squid.ldif
- dn: dc=sushan.org (dn:之后是有个空格的。)
- dc: sushan.org
- objectClass: dcObject
- objectClass: organization
- o: sushan
- dn: ou=squid,dc=sushan.org
- ou: squid
- objectClass: organizationalUnit
- dn: uid=test,ou=squid,dc=sushan.org
- objectClass: top
- objectClass: person
- objectClass: organizationalPerson
- objectClass: inetOrgPerson
- userPassword: test
- uid: test
- cn: test
- sn: test
(需要特别注意的是这个配置文件很难一次搞定的,稍微有错误都会运行不下去的,例如在dn: ou=squid,dc=sushan.org 你多写了几个空格,可能就是导致错误的原因,只是你肉眼看不到哦!切记!)
(6)cd /etc/openldap
ldapadd -x -W -D "cn=Manager,dc=example.com" -f squid.ldif(在这里容易报错Enter LDAP Password:
ldap_bind: Invalid credentials (49)
此时有可能是密码rootrw之后和密码之间不是2个tab键,或者是你的密码搞错了。本人此次出错的原因是因为设置了ldap是instructor的,你可以cat /ect/openldap/ldap.conf看看有没有开启,Administration->Authentication中的user Account Database:Local accounts only 然后将ldap.conf与instructor有关的注释掉噢!)
(7)vi /etc/squid/squid.conf
- auth_param basic program /usr/lib64/squid/squid_ldap_auth -b"ou=squid,dc=sushan.org"
- acl password proxy_auth REQUIRED
- http_access allow password
(/usr/lib64/squid/squid_ldap_auth的位置可以通过ll 显示一下在哪里)
squid -k reconfigure
(8)测试:和上面一样的 你需要输入:test 密码:test才可以进入。
实验11.
步骤(1)squid 监控
squid 本身提供了一个 cgi 程序 cachemgr.cgi用来监控 squid 的运行
vim /etc/httpd/conf.d/squid.conf
- #
- # This is /etc/httpd/conf.d/squid.conf
- #
- ScriptAlias /Squid/cgi-bin/cachemgr.cgi /usr/lib64/squid/cachemgr.cgi
- # Only allow access from localhost by default
- <Location /Squid/cgi-bin/cachemgr.cgi>
- order allow,deny
- allow from localhost.localdomain
- # Add additional allowed hosts as needed
- allow from .example.com
- Location>
(/usr/lib64/squid/cachemgr.cgi的位置你可以通过ll显示!)
测试:
http://192.168.0.85/Squid/cgi-bin/cachemgr.cgi
实验12.
squid 日志分析
yum install webalizer y
vim /etc/httpd/conf.d/webalizer.conf
- Alias /usage /var/www/usage
- <Location /usage>
- Order deny,allow
- Allow from all
- # Allow from .example.com
- Location>
webalizer -Q
http://192.168.0.85/usage