linux Squid代理服务的配置

Squid是我最早接触的代理服务(除isa外),公司的两条adsl是通过pfsense整合的,但pfsense的开发进度总是让人担忧,而且总有一些不如意的地方,虽然现在是通过pfsense+panabit来管控的不错,个人认为还是非常有必要了解下squid的好。下面的文章是转载过来的,希望能对大家有帮助。
一.linux Squid代理服务概述
(一).Linux代理服务器简介
代理服务器是目前网络中常见的服务器之一,它可以提供文件缓存、复制和地址过滤等服务,充分利用有限的出口带宽,加快内部主机的访问速度,也可以解决多用户需要同时访问外网但公有IP地址不足的问题。同时可以作为一个防火墙,隔离内网与外网,并且能提供监控网络和记录传输信息的功能,加强局域网的安全性等。它的主要作用有以下几点。
1.共享网络
2.加快访问速度,节约通信带宽
3.防止内部主机受到攻击
4.限制用户访问,完善网络管理
(二).代理服务器的原理
① 客户端A向代理服务器提出访问Internet的请求。
② 代理服务器接受到请求后,首先与访问控制列表中的访问规则相对照,如果满足规则,则在缓存中查找是否存在需要的信息。
③ 如果缓存中存在客户端A需要的信息,则将信息传送给客户端。如果不存在,代理服务器就代替客户端向Internet上的主机请求指定的信息。
④ Internet上的主机将代理服务器的请求信息发送到代理服务器中,同时代理服务会将信息存入缓存中。
⑤ 代理服务器将Internet上主机的回应信息传送给客户端A。
⑥ 客户端B向代理服务器提出相同的请求。
⑦ 代理服务器也首先与访问控制列表中的访问规则相对照。
⑧ 如果满足规则,则将缓存中的信息传送给客户端B。
二.linux Squid简介
Squid是Linux和UNIX平台下最为流行的高性能免费应用层代理服务器,它具有权限管理灵活、性能高和效率快等特点。Squid是一个由众多在互联网上的开发人员共同努力完成的高性能的代理缓冲服务器,它的具体开发是由国家网络应用研究室(the National Laboratory for Applied Network Research)的Duane Wessels主持,由NSF出资支持的。
Squid的另一个优越性在于它使用访问控制列表(ACL)和访问权限列表(ARL)进行权限管理和内容过滤。访问控制清单和访问权限清单通过阻止特定的网络连接来减少潜在的Internet非法连接,可以使用这些清单来确保内部网的主机无法访问有威胁的或不适宜的站点。
三.linux Squid代理服务的安装
Red Hat Enterprise Linux 5安装程序默认没有安装Squid服务,读者可以使用下面的命令检查系统是否已经安装了Squid服务或查看已经安装了何种版本。rpm -q squid 如果系统还没有安装Squid服务,可将Red Hat Enterprise Linux 5第2张安装盘放入光驱,加载光驱后在光
盘的Server目录下找到Squid的RPM安装包文件squid-2.6.STABLE6-3.el5.i386.rpm,使用下面的命令安装Squid。
rpm -ivh /mnt/Server/squid-2.6.STABLE6-3.el5.i386.rpm
四.linux Squid代理服务的基本配置
Squid主配置文件是/etc/squid/squid.conf ,最基本的设置如下。
http_port 192.168.16.1:8080
cache_mem 64 MB
cache_dir ufs /var/spool/squid 4096 16 256
cache_effective_user squid
cache_effective_group squid
dns_nameservers 61.144.56.101
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
visible_hostname 192.168.16.1
cache_mgr lindenstar@163.com
acl all src 0.0.0.0/0.0.0.0
http_access allow all
acl选项的格式如下。
acl列表名称 列表类型 [-i] 列表值
列表名称:用于区分Squid的各个访问控制列表,任何两个访问控制列表不能用相同的列表名。虽然列表名称可以随便定义,但为了避免以后不知道这条列表是干什么用的,应尽量使用有意义的名称,如badurl、clientip和work time等。
列表类型:是可被Squid识别的类别。Squid支持的控制类别很多,可以通过IP地址、主机名、MAC地址和用户/密码认证等识别用户,也可以通过域名、域后缀、文件类型、IP地址、端口和URL匹配等控制用户的访问,还可以使用时间区间对用户进行管理
-i选项:表示忽略列表值的大小写,否则Squid是区分大小写的。
列表值:针对不同的类型,列表值的内容是不同的。例如,对于类型为src或dst,列表值的内容是某台主机的IP地址或子网地址;对于类型为time,列表值的内容是时间;对于类型为srcdomain和dstdomain,列表值的内容是DNS域名。
Squid会针对客户HTTP请求检查http_access规则,
定义访问控制列表后,就使用http_access选项根据访
问控制列表允许或禁止访问了。
该选项的基本格式为:
http_access [allow | deny] 访问控制列表名称
? [allow | deny]:定义允许(allow)或禁止(deny)访问控制列表定义的内容。
? 访问控制列表名称:需要http_access控制的ACL名称。
五.初始化linux Squid
1.创建Squid使用硬盘缓冲区的目录结构
/usr/sbin/squid –z
2.设置Squid错误提示信息为中文
在Squid的主配置文件/etc/squid/squid.conf中添加下列语句,并使用命令“/etc/init.d/squid reload”重新载入配置文件
error_directory /usr/share/squid/errors/Simplify_Chinese
六.Linux访问控制应用实例
【例1】禁止IP地址为192.168.16.200的客户机上网。
acl badclientip1 src 192.168.16.200
http_access deny badclientip1
【例2】禁止192.168.1.0这个子网里所有的客户机上网。
acl badclientnet1 src 192.168.1.0/255.255.255.0
http_access deny badclientnet1
【例3】禁止用户访问IP地址为210.21.118.68的网站。
acl badsrvip1 dst 210.21.118.68
http_access deny badsrvip1
【例4】禁止用户访问域名为www.163.com的网站。
acl baddomain1 dstdomain -i www.163.com
http_access deny baddomain1
【例5】禁止用户访问域名包含有163.com的网站。
acl badurl1 url_regex -i 163.com
http_access deny badurl1
【例6】禁止用户访问域名包含有sex关键字的URL。
acl badurl2 url_regex -i sex
http_access deny badurl2
【例7】限制IP地址为192.168.16.200的客户机并发最大连接数为5。
acl clientip1 src 192.168.16.200
acl conn5 maxconn 5
http_access deny client1 conn1
【例8】禁止192.168.2.0这个子网里所有的客户机在周一到周五的9:00到18:00上网。
acl clientnet1 src 192.168.2.0/255.255.255.0
acl worktime time MTWHF 9:00-18:00
http_access deny clientnet1 worktime
【例9】禁止客户机下载*.mp3、*.exe、*.zip和*.rar类型的文件。
acl badfile1 urlpath_regex -i \.mp3$ \.exe$ \.zip$ \.rar$
http_access deny badfile1
【例10】禁止QQ通过Squid代理上网。
acl qq url_regex -i tencent.com
http_access deny qq
七.Linux下启动和停止代理服务
1.启动代理服务
/etc/init.d/squid start
2.停止代理服务
/etc/init.d/squid stop
3.重新启动代理服务
/etc/init.d/squid restart
4.重新载入配置文件
/etc/rc.d/init.d/squid reload
5.自动启动代理服务
如果需要让代理服务随系统启动而自动加载,可以执行“ntsysv”命令启动服务配置程序,找到“squid”服务,在其前面加上星号(*),然后选择“确定”
八.Linux下透明代理的实现
(一).透明代理的简介
透明代理是NAT和代理的完美结合,之所以称为透明,是因为在这种工作方式下用户感觉不到代理服务器的存在,不需要在浏览器或其他客户端工具(如网络快车等)中作任何设置,客户机只需要将默认网关设置为Linux服务器的IP地址即可。当客户机访问Internet,请求数据包经过Linux服务器转发时,Linux服务器上的iptables将客户机的HTTP请求重定向到Squid代理服务器,由代理服务器代替客户机访问外部信息资源,再将获取的数据传回客户机。
(二).配置Squid
Squid主配置文件/etc/squid/squid.conf :
http_port 192.168.16.1:8080
cache_mem 64 MB
cache_dir ufs /var/spool/squid 4096 16 256
cache_effective_user squid
cache_effective_group squid
dns_nameservers 61.144.56.101
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
visible_hostname 192.168.16.1
cache_mgr lindenstar@163.com
#以下是实现透明代理的4条语句的关键,缺一不可
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
acl all src 0.0.0.0/0.0.0.0
http_access allow all
(三).配置iptables
iptables在这里所起的作用是端口重定向,执行以下命令
将所有由eth0接口进入的Web服务80端口的请求直接转发到
8080端口,由Squid处理。
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp –dport 80 -j REDIRECT –to-ports 8080
九.Linux代理服务器用户身份认证
(一).配置squid.conf文件
Squid主配置文件/etc/squid/squid.conf:
http_port 192.168.16.1:8080
cache_mem 64 MB
cache_dir ufs /var/spool/squid 4096 16 256
cache_effective_user squid
cache_effective_group squid
dns_nameservers 61.144.56.101
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
visible_hostname 192.168.16.1
cache_mgr lindenstar@163.com
acl all src 0.0.0.0/0.0.0.0
#以下是实现用户身份认证的语句
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic credentialsttl 2 hours
auth_param basic realm Example.com’s Squid proxy-caching
acl auth_user proxy_auth REQUIRED
http_access allow auth_user
(二).建立账户文件
为了建立供用户认证使用的账户文件,可以利用Apache的htpasswd程序生成账户文件/etc/squid/passwd,该账户文件每行包含一个用户的信息,即用户名和经过加密后的密码。htpasswd -c /etc/squid/passwd linden
(三).测试用户认证
① 在服务器中使用命令“/etc/init.d/squid restart”重启Squid服务。
② 在客户端的Web浏览器中配置好代理服务器的IP地址和端口号。
③ 访问任意网站,这时Web浏览器会弹出输入用户名和口令的对话框。
④ 输入正确的用户名和口令,就能连上Internet了。
⑤ 如果用户名和口令不正确,则出现“网络缓存服务器拒绝访问”的错误信息。
十.使用MySAR实现Linux Squid流量管理
(一).安装MySAR
① 安装Apache和PHP解释器,具体安装和设置方法见第7章。
② 安装MySQL和PHP -MySQL支持包,并设置MySQL管理员root的密码为“mysar”,具体安装设置方法常见第12章。
③ 访问http://giannis.stoilis.gr/software/mysar,下载最新版的MySAR安装软件 。
④ 使用命令“tar zxvf mysar-2.1.1.tar.gz -C /usr/local”将其解压到/usr/local目录中。
⑤ 编辑/usr/local/mysar/www/install/index.php安装向导文件,找到语句“hostname varchar(255) NOT NULL default‘ ’,”,在该语句后插入语句“usr_iptables tinyint(1) unsigned NOT NULL default ‘0’,”,用于在hostnames表中创建usr_iptables字段,以便判断用户是否已被限制访问服务器。
⑥ 编辑Apache主配置文件/etc/httpd/conf/httpd.conf,在配置文件的末尾添加语句“Alias /mysar/ “/usr/local/mysar/www/””设置虚拟目录,使虚拟目录指向MySAR目录中的www子目录。
⑦ 使用下列命令重新启动Apache和MySQL服务。
/etc/init.d/httpd restart
/etc/init.d/mysqld start
使用Web浏览器访问“http://服务器IP地址或域名/mysar/”,打
开MySAR的安装向导 。
(二).设置MySAR
① 编辑文件/usr/local/mysar/bin/mysar-importer.php(该文件的作用是读取Squid的日志文件/var/log/squid/access.log,并对日志进行分析,然后将相应的数据写入数据库中),找到语句“debug(‘Record received: ‘,40,__FILE__,__LINE__);”在该语句前插入如下语句。
$test_head=preg_split(“[//]”,$record[6]);
if (substr($test_head[1],0,7)==”192.168″)
{continue 1 ;}
② 编辑vi /usr/local/mysar/etc/mysar.cron文件,将文件中的“root”删除,并在文件末尾添加语句“01 1 * * * squid -k rotate”,使Squid的日志每天循环保存一次(由于MySAR是通过分析Squid日志的方法来统计流量的,因此如果日志文件太大就会降低MySAR的运行效率,同时也可能使统计出错)。然后再使用命令“crontab /usr/local/mysar/etc/mysar.cron”设置自动作业。
③ 使用Web浏览器访问“http://服务器IP地址或域名/mysar/”,打开MySAR查看用户使用Squid代理服务器访问外网的情况 。
(三).编写管理程序
1. 编写C程序用于执行iptables命令
#include
#include
#include
int main(int argc ,char *argv[])
{int optch;
while( (optch = getopt( argc , argv , “ad” ) ) != -1 )/*分析命令行参数*/
{switch( optch ) {
case ‘d’:
execlp(“iptables”,”iptables”,”-I”,”INPUT”,”-s”,argv[2],”-j”,”DROP”,(char *) 0 );
break;/*设置iptable规则,禁止用户访问服务器*/
case ‘a’:
execlp(“iptables”,”iptables”,”-D”,”INPUT”,”-s”,argv[2],”-j”,”DROP”,(char *) 0 );
break;/*删除iptable规则*/
default: printf(“error \n”);} }}
编写完成后以.c为后缀名保存文件(本例文件名为uip.c),然后再分别使用命令gcc –c uip.c和
make uip.o编译连接程序。
使用命令chmod u+s uip修改程序uip的执行权限,使PHP程序能够调用它。
2. 编写PHP程序mysar.php用于管理代理用户
=6105900){system(‘./uip -d ‘.$row[“hostname”]);
$usr_update= mysql_query(“update hostnames set usr_iptables=1 where hostname='”.$row[“hostname”].”‘”);}}
//判断用户的总流量是否大于6105900B,如果大于则调用c程序设置iptables规则,禁止用户访问代理服务器
?>
使用命令“crontab –e”打开自动作业列表,在文件的末尾添加语句“* * * * * root /usr/local/mysar/mysar.php”,使程序mysar.php每分钟自动执行一次。

《linux Squid代理服务的配置》有一个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注