荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: xsinuz.bbs@bbs.tju.edu.cn.no.spam (咸有一德), 信区: Linux
标  题: Re: 请问在Linux下有没有二级代理软件使用?象httport
发信站: 天大求实BBS站 (Fri Dec 17 17:00:30 2004)
转信站: SZU!news.szu.edu.cn!news.happynet.org!news2.happynet.org!TJUBBS

Squid就可以实现。

--------------------------
设置squid


前面的配置是不加限制的允许内部所有用户使用该代理上Internet,显然这不是一个很好的
访问策略。我们说过,代理方式对用户权限的控制有着非常丰富的支持。下面就看看squid
如何实现多样化的权限控制的。



让我们先了解一下squid.conf的几个配置选项和访问控制特性:



Squid 的定制是通过设置它的配置文件 squid.conf 来实现的,squid.conf 文件通常在
/etc/squid 目录下。这个配置文件内容很多,但它的每个选项都有详尽的说明。下面是几
个常用的配置参数:



http_port



首先来更改一下 http_port,这个选项指定了 Squid 监听客户请求的端口,默认值是
3128。要使用代理功能,建议这个端口值和运行 Squid 的机器的 IP 地址一起使用,可以
修改成下面这样:



http_port 192.168.100.254:3128



上述声明表示 Squid 绑定在 IP 地址 192.168.100.254 上,端口为 3128。端口可以设置
为任意值,但要确认没有其他程序会使用同样的端口。/etc/services文件列出了常用端口
,如果你想为squid设置其它的端口,可以参考这个文件的内容,防止重复设置。



visible_hostname 192.168.100.254



运行squid的主机的名字,可以写上该机器的IP地址。



cache_mgr pangty@usa.net



管理员的邮件地址。在访问发生错误时,visible_hostname和cache_mgr这两个选项的值显
示在错误提示页面内的相关位置。



cache_mem 16 MB



定义缓存内存,一般定义为物理内存大小的1/3。默认设置为8MB。



cache_dir Type Directory-Name Fs-specific-data [options]



定义硬盘缓存空间以存储访问过的页面或其它资源的拷贝。Type是指存储类型,一般设置为
ufs。Directort-Name代表缓存的位置,默认的设置是cache_dir ufs /var/spool/squid
100 16 256。其中100代表缓存空间最大为100M;16和256代表缓存目录下的一级和二级目录
数。



访问控制



控制用户的访问权限等功能是使用squid的访问控制特性来实现的。Squid 访问控制有两个
要素:ACL和访问列表。访问列表可以允许或拒绝某些用户对特定服务的访问。



为了使用控制功能,必须先设置 ACL。ACL 声明的格式如下:



acl   acl_element_name   type_of_acl_element values_to_acl



下面列出一些重要的 ACL类型(type_of_acl_element)



l         src : 源地址(即客户机IP地址)

l         dst : 目标地址(即服务器IP地址)

l         srcdomain : 源名称 (即客户机名称)

l         dstdomain : 目标名称 (即服务器名称)

l         time : 一天中的时刻和一周内的一天

l         url_regex : URL 规则表达式匹配

l         urlpath_regex: URL-path 规则表达式匹配,略去协议和主机名

l         proxy_auth : 通过外部程序进行用户验证

l         maxconn : 单一 IP 的最大连接数



注:

1. acl_element_name 可以是任一个在 ACL 中定义的名称。

2. 任何两个 ACL 元素不能用相同的名字。

3. 每个 ACL 由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换言之,
即任一 ACL的值被匹配,则这个 ACL即被匹配。

4. 并不是所有的 ACL都能使用访问列表中的全部类型。

5. 不同的 ACL写在不同行中,Squid 将把它们组合在一个列表中。



我们可以使用许多不同的访问列表。我们常用的是http_access: 允许 HTTP 访问,这个是
主要的访问控制列表。



访问列表的规则由一些类似 'allow' 或 'deny' 的关键字构成,用以允许或拒绝向特定或
一组 ACL 元素提供服务。



注:

1. 这些规则按照它们的排列顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即
结束。

2. 一个访问列表可以又多条规则组成。

3. 如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。

4. 一个访问条目中的所有元素将用逻辑与运算连接:

http_access Action 声明1 AND 声明2 AND 声明 OR.

http_access Action 声明3

多个 http_access 声明间用或运算连接,但每个访问条目的元素间用与运算连接。

5. 请记住列表中的规则总是遵循由上而下的顺序。



我们具体来看看如何运用acl和http_access。首先把squid.conf的配置改回原状,即修改
http_access allow all为http_access deny all。下面给出几种常用访问控制:



根据IP鉴权



只有地址为192.168.100.10和192.168.100.100的终端可以使用代理

在squid.conf的ACCESS CONTROL配置部分添加

acl authorizedip src 192.168.100.10

acl authorizedip src 192.168.100.100

然后到http_access部分

在http_access deny all这一行前面添加

http_access allow authorizedip



如果需要设置的IP地址非常多,又不连续,是不是要写上一大堆的acl xxx xxx x.x.x.x?
有一个简单的方法,把这些IP地址写在一个文件里,比如/etc/squid/authorizedip.txt,
每行一个。然后在squid.conf里这样写

acl authorizedip src "/etc/squid/authorizedip.txt"



根据时间控制



关于时间段的设置,可以参见squid.conf中的说明,具体是S - Sunday, M - Monday, T -
Tuesday, W - Wednesday, H - Thursday, F - Friday A - Saturday,如果七天都允许,
也可以不写。时间格式是H1:M1-H2:M2,要求是前面的要小于后面的。



# 定义一个访问时间段:每周星期一到星期五的上午八点到下午五点,允许alloweduser用
户在这个时间段内上网

acl accept_time time MTWHF 8:00-17:00

http_access allow alloweduser accept_time

http_access deny alloweduser



访问特定URL地址



虽然我们不希望所有的人都使用代理自由的访问Internet,但有几个网站是可以让内部终端
都能访问的。在squid.conf里添加访问控制:

acl alloweddomain dstdomain .linuxforum.net .linuxaid.com.cn

http_access allow alloweddomain

同样的,如果参数很多的情况,也可以把这些允许的地址名写到一个文本里:

acl alloweddomain dstdomain "/etc/squid/alloweddomain.txt"

alloweddomain.txt里是允许访问站点的列表,每行一个。



根据关键字过滤网址



有些网站(色情网站,广告网站)很令人讨厌,通过设置acl可以很容易屏蔽掉这些站点:

acl denyurl url_regex sex boylink xxx city69 asiaadult sehu

http_access deny denyurl

这个设置将过滤带有sex boylink xxx city69 asiaadult sehu这些关键字的URL地址。

和前面一样,也可以把这些关键字写到一个文本里

acl denyedurl url_regex "/etc/squid/sex.txt"

http_access deny denyurl



基于用户的认证



Squid本身并不支持用户验证,它是通过外部程序提供用户验证功能,用户通过squid访问前
需要输入有效的用户名和密码。可以用 proxy_auth  ACL 和 authenticate_program 来实
现这个功能,在允许访问前强制进行用户名和密码的核查。下面列出一些 Squid 能用到的
验证程序:



NCSA : 使用 NCSA 风格的用户名和密码档

LDAP : 使用 Linux Lightweight 目录访问协议(Linux Lightweight Directory Access
Protocol)

SMB : 使用 SMB 协议的服务,如 SAMBA 或 Windows NT

MSNT : 使用 Windows NT 的域验证

PAM : 使用 Linux 的可装载验证模块

getpwam : 使用 Linux 密码档



使用验证功能必须用authenticate_program 选项指定使什么验证程序,并且请确认选定的
验证程序已安装并能很好的工作。默认的,这些验证程序放在/usr/lib/squid/目录下。



以NCSA认证为例,修改 squid.conf 文件选定验证程序:

authenticate_program /usr/lib/squid/ncsa_auth /etc/squid/passwd

acl alloweduser proxy_auth pangty

http_access allow alloweduser

其中/etc/squid/passwd是用户和密码列表,这个文件可以用apache软件包带的htpasswd来
产生,它的内容可能是这样的:

pangty:wCQhCeZOOF3vk



pangty是用户名,“:”号后面的是该用户的密码。



注意:修改了squid.conf配置后,需要重新启动squid或者告诉squid重新装入配置文件才能
起作用。这样执行:



重起squid:



[root@rh73 ~]# /etc/rc.d/init.d/squid restart



不重起,只装入新的配置文件:



[root@rh73 ~]# /etc/rc.d/init.d/squid reload



以上是squid的常用的配置选项,这对于一般的应用来说已经足够了,如果你需要更多的特
性支持,请阅读下面的内容。



§§ 需要更多的功能



显示中文错误提示信息



默认的,squid在发生错误时显示的是英文提示信息,squid的提示信息已经被翻译成很多语
言,可以很方便的让他显示中文信息:



[root@rh73 ~]# cd /etc/squid/

[root@rh73 ~]# rm -f errors

[root@rh73 /etc/squid]# ln -s /usr/lib/squid/errors/Simplify_Chinese/ errors



/usr/lib/squid/errors下面有squid的各种语言版本的提示信息,按目录存放在不同的子目
录下面。



支持基于MAC的控制以及访问带有下划线的URL



由于计算机的IP 地址是随时可以更改的,所以即便你设置了ACL限制只有某些IP的计算机可
以访问Internet,其它人仍然可以在该计算机关机的情况下,修改成这些允许上网的IP地址
后访问Internet。另外,前面我们是使用DHCP来管理内部网络上的计算机的IP地址,每台计
算机每次获得的IP地址可能是不一样的,所以,单纯的通过IP地址来控制上网权限并不适合
所有的场合,而MAC地址相对是稳定的,一般网卡的MAC地址不能够更改,所以基于MAC地址
的用户控制非常适合解决这两种情况带来的问题。



另外,我们访问Internet时,有时候会遇到这样的网站地址:
http://www.hello_world.com,在网站的URL地址里面有下划线,这时Red Hat Linux自带的
squid软件包可能会报告无法访问该网站。



这些功能需要重新编译squid源代码增加相应的编译选项来实现。下面我们就来看一下如何
使用rpm重新编译软件包源代码获得必要的功能。



当文章写到这里的时候,Red Hat Linux网站发布了squid的升级软件包,我们可以从网上获
得它的最新源代码rpm包:



ftp://updates.redhat.com/7.2/en/os/SRPMS/squid-2.4.STABLE6-6.7.3.src.rpm



在开始编译前,有一些软件包是需要首先安装,这可能包括rpm-build、sgml-tools,前者
在Red Hat Linux的光盘上可以找到,后者可以从这里下载:



ftp://ftp.freesoft.cei.gov.cn/.mirror2/ftp.redhat.com/redhat-7.2/i386/RedHat/RPM
S/sgml-tools-1.0.9-12.i386.rpm



安装squid的源代码包



[root@rh73 ~]# rpm -ivh squid-2.4.STABLE6-6.7.3.src.rpm



安装后的源代码包在/usr/src/redhat/SOURCES目录下,我们关心的是另外一个文件
/usr/src/redhat/SPECS/squid.spec,这里面有squid的相关编译选项,修改该文件
%configure部分如下:



%configure \

   --exec_prefix=/usr --bindir=/usr/sbin --libexecdir=/usr/lib/squid \

   --localstatedir=/var --sysconfdir=/etc/squid \

   --enable-poll --enable-snmp --enable-removal-policies="heap,lru" \

   --enable-storeio="aufs,coss,diskd,ufs" \

   --enable-delay-pools --enable-linux-netfilter \

   --with-pthreads \

   --enable-underscores \

   --enable-arp-acl \

   --enable-err-language=Simplify_Chinese \

   --enable-auth-modules="LDAP,NCSA,PAM,SMB,MSNT"  # --enable-icmp



--enable-underscores是增加对下划线网址的支持,--enable-arp-acl是增加支持MAC地址
方式的鉴权。



开始编译产生新的RPM包:



[root@rh73 ~]# rpm -ba squid.spec



这条命令将根据squid.spec 的配置重新编译生成新的rpm包。编译过程视机器性能的好坏而
定,大概需要几分钟到几十分钟不等,如果没有什么错误,最后产生的新的rpm包在
/usr/src/redhat/RPMS/i386/目录下:squid-2.4.STABLE6-6.7.3.i386.rpm



安装新的rpm包:



[root@rh73 ~]# rpm -Uvh
/usr/src/redhat/RPMS/i386/squid-2.4.STABLE6-6.7.3.i386.rpm



注意,这里使用了-U参数,是因为我们前面已经安装过squid的一个较旧的版本,-U参数指
出这个操作是对原有版本软件包的升级。现在你的squid就可以支持MAC地址鉴权和带下划线
的URL地址了。 8)



配置squid.conf来支持MAC地址鉴权,在squid.conf里加入这样的内容:



acl allowedmac arp 00:10:DC:8F:5B:FF

http_access allow allowedmac



上面只是常用的几种ACL设置的示例,关于ACL可以访问squid主页上FAQ文档的Access
Controls部分获得更多的信息:

http://www.squid-cache.org/Doc/FAQ/FAQ-10.html



§§ 配置透明代理



透明代理是NAT和代理的完美结合,之所以称为透明,是因为在这种工作方式下你感觉不到
代理的存在,和单纯使用NAT一样,对上网的客户端没有任何特殊的设置。Squid可以通过配
置支持透明代理。



很多文章讲到共享上网就会讲有关透明代理(iptables + squid或ipchains + squid)的内
容,我个人认为对于规模不大的网络,又没有内容过滤等功能的要求,使用squid是没有必
要的,单纯的使用NAT方式就足够了,并且这样对运行NAT的服务器的要求就更加低,比如使
用一台486 + 4M内存的机器,如果使用那些经过特殊定制的Linux系统,甚至连硬盘都不需
要,只要一张软盘就可以了。



如果是源代码方式编译安装的squid,请在编译选项里指明--enable-linux-netfilter选项
。Red Hat Linux自带的squid支持透明代理,我们可以直接修改/etc/squid/squid.conf文
件,设置必要的参数:



httpd_accel_host virtual

httpd_accel_port 80

httpd_accel_with_proxy on

httpd_accel_uses_host_header on



运行/etc/rc.d/init.d/squid reload使设置生效,然后修改fw.sh脚本,在最后添加这样一
行:



iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j REDIRECT --to-port
3128



这将把所有局域网用户通过Linux接入服务器访问www服务的访问请求重定向到工作在3128端
口的squid处理。运行fw.sh脚本,使设置生效。就这么简单!



你可能还记得fw.sh里面的关于NAT的规则:

iptables -A POSTROUTING -t nat -s 192.168.100.0/24 -o eth0 -j SNAT --to-source
61.156.35.114



由于PREROUTING规则总在POSTROUTING规则之前应用,所以不用担心squid被NAT规则屏蔽掉




注意:使用透明代理时,无法同时使用squid基于用户帐号的验证功能!



想了解更多关于透明代理的资料,请访问TLDP(The Linux Documentation Project)上关
于透明代理的HOWTO文档:

http://www.tldp.org/HOWTO/mini/TransparentProxy.html



§§ 一个squid.conf的配置实例



现在给出一个支持透明代理并使用MAC地址控制用户上网权限的squid配置文件,该配置还支
持特定网站(如色情网站)的过滤功能:



#定义服务器地址和端口

http_port 192.168.100.254:3128



#定义服务器名字

visible_hostname 192.168.100.254



#定义管理员邮件地址

cache_mgr pangty@usa.net



#定义缓存内存空间和缓存目录

cache_mem 16 MB

cache_dir ufs /var/spool/squid 100 16 256



#支持透明代理

httpd_accel_host virtual

httpd_accel_port 80

httpd_accel_with_proxy on

httpd_accel_uses_host_header on



#定义acl

#sexurl.txt列出要过滤色情网站地址的关键字,每个关键字占一行,如xchina

#maclist.txt列出允许上网的主机的MAC地址,每个地址占一行,如00:50:56:C0:00:08

acl all src 0.0.0.0/0.0.0.0

acl sexurl url_regex "/etc/squid/sexurl.txt"

acl allowedmac arp "/etc/squid/maclist.txt"



#定义访问策略

http_access deny sexurl

http_access allow allowedmac

http_access deny all





[参考文档]
Squid Documentation http://www.squid-cache.org/Doc/


 ------------------------------------------------------
父代理设置

使用 cache_peer 选项执行上级代理。第一个例子中Squid和服务器HTTP端口号3128,而
ICP请求在3130. 你可以同时制定多个上级代理。 下面的例子中制定了两个上级代理。

    cache_peer cache.myparent.example parent 3128 3130
    cache_peer cache.sibling.example sibling 8080 3130

[参考文档]
http://squid-docs.sourceforge.net/latest/html/x666.html


--
http://bbs.tju.edu.cn/TJUBBS/attach/bbscon/xsinuz_sign_pic01.jpg?B=Pictures&F=M.
1102146615.A&attachpos=207&attachname=/xsinuz_sign_pic01.jpg
   世間有無數種道。釋道中有救贖之道;儒道中有學習之道;
       醫者之道、徘人之道、茶道、弓術之道等無數才藝技巧。
                     每一個人都挑選自己喜好的方面而行之。
   ——— 宮本武藏  《五輪書》
※ 来源:.天大求实BBS http://bbs.tju.edu.cn [FROM: 211.81.59.65]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店