当前位置: 首页 > 图文教程 > 服务器 > Linux服务器 > 搭建安全的LinuxSquid代理服务器

Linux服务器
Linux上双网卡绑定方法(Suse9SP3)
Linux操作系统调优参数的意义
Linux下使用SSH客户端及其Sftp文件传送
教你恢复被误删除的Linux文件
SQL Server注入大全及防御
Linux无法解析域名的解决办法
Linux系统下安装和配置MyEclipse的方法
Ubuntu下VirtualBox 1.4.0设置文件共享
Windows与Linux系统共享StarDict字典文件
修改Linux下相关的登陆信息
Windows通过SecureCRT远程登录Linux主机
Linux操作系统如何修改SWAP交换区的大小
Linux操作系统下为Apache目录添加密码
Linux时间设置与同步(NTP)
Linux内核补丁AMD旁路转换缓冲(TLB)错误
Linux架设DHCP服务器的方法
Fedora 8下Apache配置与管理
Linux操作系统下用单网卡捆绑双IP的方法
Ubuntu Linux系统环境变量配置文件
SUSE Linux中将Tomcat作为Service运行

Linux服务器 中的 搭建安全的LinuxSquid代理服务器


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-18   浏览: 194 ::
收藏到网摘: n/a

 代理服务器的功能是代理网络用户取得网络信息,它 是网络信息的中转站。随着代理服务器的广泛使用,随之而来的是一系列的安全问题。由于没有对代理服务器的访问控制策略作全面细致的配置,导致用户可以随意地通过代理服务器访问许多色情、反动的非法站点,而这些行为往往又很难追踪,给管理工作带来极大的不便。

Squid是Linux下一个缓存Internet数据的代理服务器软件,其接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户想要下载一个主页时,可以向Squid发出一个申请,要Squid代替其进行下载,然后Squid连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份。当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。目前,Squid可以代理HTTP、FTP、GOPHER、SSL和WAIS协议,暂不能代理POP3、NNTP等协议。Squid可以工作在很多中,如AIX、Digital、Unix、FreeBSD、HP-UX、Irix、Linux、NetBSD、Nextstep、SCO、Solaris、OS/2等。操作系统

安装和配置SquidServer

通常说来,安装Squid有两种方法:一是从RedHatLinux9中获取该软件的RPM包进行;二是安装从Squid的官方站点http://www.squid-cache.org/下载该软件的源码进行编译后安装。目前网上最新的稳定版本为squid-2.5.STABLE10,下面以此版本为例对两种安装方法进行介绍。

然后,进入/mnt/cdrom/RedHat/RPMS目录:

#cd/mnt/cdrom/RedHat/RPMS

最后,执行安装:

#rpm-ivhsquid-2.5.STABLE1-2.i386.rpm

当然,我们也可以在开始安装系统的过程中安装该软件。

2.源代码包的安装

从http://www.squid-cache.org/下载squid软件的最新源代码包squid-2.5.STABLE10.tar.gz,然后,按照如下步骤进行安装。

首先,将该文件拷贝到/tmp目录:

#cpsquid-2.5.STABLE10.tar.gz/tmp

然后,解开该文件:

#tarxzvfsquid-2.5.STABLE10.tar.gz

解开后,在/tmp生成一个新的目录squid-2.5.STABLE10,为了方便使用mv命令,将该目录重命名为squid:

#mvsquid-2.5.STABLE10squid

切换进入squid目录:

#cdsquid

接着,执行/configure,可以用./configure--prefix=/directory/you/want指定安装目录,系统默认安装目录为/tmp/squid:

#./configure

最后,分别执行makeall、makeinstall:

#makeall

#makeinstall

安装结束后,Squid的可执行文件在安装目录的bin子目录下,配置文件在etc子目录下。

Squid软件向用户提供了许多与配置、应用程序和库、日志等相关的文档进行配置和管理,Squid有一个主要的配置文件squid.conf。同时,在RedHat环境下所有Squid的配置文件都位于/etc/squid子目录下。在该目录当中,系统同时提供了一个默认的配置文件,其名称为squid.conf.default,然而,在实际的应用当中,该默认的配置文件存在某些问题,所以在使用Squid之前,必须首先对该配置文件的有关内容进行修改。

下面介绍squid.conf文件的结构以及一些常用的选项。squid.conf配置文件可以分为13个部分。虽然Squid的配置文件很庞大,该配置文件的规模达到了3000多行。然而,如果只是为一个中小型网络提供代理服务,并且只准备使用一台服务器,那么,配置问题将会变得相对简单,只需要修改配置文件中的几个选项即可满足应用需求。这些几个常用选项分别是:

1.http_port

该选项定义Squid监听HTTPD客户连接请求的端口。默认是3128,如果使用HTTPD加速模式,则为80。可以指定多个端口,但是所有指定的端口都必须在一条命令行上出现,程序才能正确地识别。

2.cache_mem(bytes)

该选项用于指定Squid可以使用的内存的理想值。这部分内存被用来存储以下对象:In-Transitobjects(传入的对象)、HotObjects(热对象,即用户常访问的对象)、Negative-Cachedobjects(消极存储的对象)。

3.cache_dirDirectory-NameMbytesLevel1Level2

该选项指定Squid用来存储对象的交换空间的大小及其目录结构。可以用多个cache_dir命令来定义多个交换空间,并且这些交换空间可以分布在不同的磁盘分区。“directory”指明了该交换空间的顶级目录。如果想用整个磁盘作为交换空间,那么可以将该目录作为装载点将整个磁盘挂装上去。默认值为/var/spool/squid。Mbytes定义了可用的空间总量。

配置访问控制

使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等。Squid访问控制有两个要素:ACL元素和访问列表。通过使用这些方法,系统管理员可以严格、清晰地定义代理服务器的访问控制策略。

1.ACL元素

该元素定义的语法如下:

aclaclnameacltypestring1…

aclaclnameacltype“file”…

当使用文件时,该文件的格式为每行包含一个条目。其中,acltype可以是任一个在ACL中定义的名称;任何两个ACL元素不能用相同的名字;每个ACL由列表值组成,当进行匹配检测的时候,多个值由逻辑或运算连接,换句话说,任一ACL元素的值被匹配,则这个ACL元素即被匹配;并不是所有的ACL元素都能使用访问列表中的全部类型;不同的ACL元素写在不同行中,Squid将这些元素组合在一个列表中。

2.http_access访问控制列表

根据访问控制列表允许或禁止某一类用户访问。如果某个访问没有相符合的项目,则默认为应用最后一条项目的“非”。比如最后一条为允许,则默认就是禁止。通常应该把最后的条目设为“denyall”或“allowall”来避免安全性隐患。使用该访问控制列表需要注意如下问题:

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

●访问列表可以由多条规则组成;

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

●一个访问条目中的所有元素将用逻辑与运算连接,如下所示:

http_accessAction声明1AND声明2AND声明OR

http_accessAction声明3

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

●列表中的规则总是遵循由上而下的顺序。

3.使用访问控制

上面详细讲述了ACL元素以及http_access访问控制列表的语法以及使用过程中需要注意的问题,下面给出使用这些访问控制方法的实例。

如果,允许网段10.0.0.124/24以及192.168.10.15/24内的所有客户机访问代理服务器,并且允许在文件/etc/squid/guest列出的客户机访问代理服务器,除此之外的客户机将拒绝访问本地代理服务器。那么具体操作如下:

aclclientssrc10.0.0.124/24192.168.10.15/24

aclguestssrc“/etc/squid/guest”

aclallsrc0.0.0.0/0.0.0.0

http_accessallowclients

http_accessallowguests

http_accessdenyall

其中,文件“/etc/squid/guest”中的内容为:

 172.168.10.3/24

210.113.24.8/16

10.0.1.24/25

……

如果,允许域名为job.net、gdfq.edu.cn的两个域访问本地代理服务器,其他的域都将拒绝访问本地代理服务器。那么具体操作如下:

aclpermitted_domainsrcjob.netgdfq.edu.cn

aclallsrc0.0.0.0/0.0.0.0

http_accessallowpermitted_domain

http_accessdenyall

如果,使用正则表达式,拒绝客户机通过代理服务器访问包含有诸如“sexy”等关键字的网站。那么具体操作如下:

acldeny_urlurl_regex-sexy

http_accessdenydeny_url

如果,拒绝客户机通过代理服务器访问文件中指定IP或者域名的网站,其中文件/etc/squid/deny_ip中存放有拒绝访问的IP地址,文件/etc/squid/deny_dns中存放有拒绝访问的域名。那么具体操作如下:

acldeny_ipdst“etc/squid/deny_ip”

acldeny_dnsdst“etc/squid/deny_dns”

http_accessdenydeny_ip

http_accessdenydeny_dns

如果,允许和拒绝指定的用户访问指定的网站,其中,允许客户1访问网站http://www.sina.com.cn,而拒绝客户2访问网站http://www.163.com。那么具体操作如下:

aclclient1src192.168.0.118

aclclient1_urlurl_regex^http://www.sina.com.cn

aclclient2src192.168.0.119

aclclient2_urlurl_regex^http://www.163.com

http_accessallowclient1client1_url

http_accessdenyclient2client2_url

如果,允许所有的用户在规定的时间内(周一至周四的8:30到20:30)访问代理服务器,只允许特定的用户(系统管理员,其网段为:192.168.10.0/24)在周五下午访问代理服务器,其他的在周五下午一律拒绝访问代理服务器。那么具体操作如下:

aclallclientsrc0.0.0.0/0.0.0.0

acladministrator192.168.10.0/24

aclcommon_timetimeMTWH8:30-20:30

aclmanage_timetimeF13:00-18:00

http_accessallowallclientcommon_time

http_accessallowadministratormanage_time

http_accessdenymanage_time

基本squid安装配置

在此,我们要配置一个只对内部网络提供代理服务的ProxyServer。它将用户分为高级用户和普通用户两种,对高级用户采用网卡物理地址识别的方法,普通用户则需要输入用户名和口令才能正常使用。高级用户没有访问时间和文件类型的限制,而普通用户只在上班时可以访问以及一些其它的限制。

安装

可以从Squid站点www.squid-cache.org获取该软件的源代...的发行版,如RedHat提供的RPM包。

RPM方式安装很简单,命令如下:

$rpm-ivhSquid-2.x.STALBx.i386.rpm

不过笔者认为,即便是系统中已经默认安装了Squid,也应当先删掉然后安装最新的源代码包。因为开源软件会不断修正问题、提供更新的功能,使用最新版本可以保证最高的性能及安全,而且源代码方式可以完全定制系统。不过STABLE稳定版、DEVEL版通常是提供给开发人员测试程序的,假定下载了最新的稳定版squid-2.5.STABLE2.tar.gz,用以下命令解开压缩包:

$tarxvfzsquid-2.5.STABLE.tar.gz

用bz2方式压缩的包可能体积更小,相应的命令是:

$tarxvfjsquid-2.5.STABLE.tar.bz2

然后,进入相应目录对源代码进行配置和编译,命令如下:

$cdsquid-2.5.STABLE2

配置命令configure有很多选项,如果不清楚可先用“-help”查看。通常情况下,用到的选项有以下几个:

--prefix=/web/squid

#指定Squid的安装位置,如果只指定这一选项,那么该目录下会有bin、sbin、man、conf等目录,而主要的配置文件此时在conf子目录中。为便于管理,最好用参数--sysconfdir=/etc把这个文件位置配置为/etc。

--enable-storeio=ufs,null

#使用的文件系统通常是默认的ufs,不过如果想要做一个不缓存任何文件的代理服

务器,就需要加上null文件系统。

--enable-arp-acl

#这样可以在规则设置中直接通过客户端的MAC地址进行管理,防止客户使用IP欺骗。

--enable-err-languages="Simplify_Chinese"

--enable-default-err-languages="Simplify_Chinese"

#上面两个选项告诉Squid编入并使用简体中文错误信息。

--enable-linux-netfilter

#允许使用Linux的透明代理功能。

--enable-underscore

#允许解析的URL中出现下划线,因为默认情况下Squid会认为带下划线的URL是

非法的,并拒绝访问该地址。

整个配置编译过程如下:

./configure--prefix=/var/squid

--sysconfdir=/etc

--enable-arp-acl

--enable-linux-netfilter

--enable-pthreads

--enable-err-language="Simplify_Chinese"

--enable-storeio=ufs,null

--enable-default-err-language="Simplify_Chinese"

--enable-auth="basic"

--enable-baisc-auth-helpers="NCSA"

--enable-underscore

其中一些选项有特殊作用,将在下面介绍它们。

最后执行make和makeinstall两条命令,将源代码编译为可执行文件,并拷贝到指定位置。

基本配置

安装完成后,接下来要对Squid的运行进行配置(不是前面安装时的配置)。所有项目都在squid.conf中完成。Squid自带的squid.conf包括非常详尽的说明,相当于一篇用户手册,对配置有任何疑问都可以参照解决。

在这个例子中,代理服务器同时也是网关,内部网络接口eth0的IP地址为192.168.0.1,外部网络接口eth1的IP地址为202.103.x.x。下面是一个基本的代理所需要配置选项:

http_port192.168.0.1:3128

默认端口是3128,当然也可以是任何其它端口,只要不与其它服务发生冲突即可。为了安全起见,在前面加上IP地址,Squid就不会监听外部的网络接口。

下面的配置选项是服务器管理者的电子邮件,当错误发生时,该地址会显示在错误页面上,便于用户联系:

[email protected]

以下这些参数告诉Squid缓存的文件系统、位置和缓存策略:

cache_dirufs/var/squid

cache_mem32MB

cache_swap_low90

cache_swap_high95

在这里,Squid会将/var/squid目录作为保存缓存数据的目录,每次处理的缓存大小是32兆字节,当缓存空间使用达到95%时,新的内容将取代旧的而不直接添加到目录中,直到空间又下降到90%才停止这一活动。如果不想Squid缓存任何文件,如某些存储空间有限的专有系统,可以使用null文件系统(这样不需要那些缓存策略):

cache_dirnull/tmp

下面的几个关于缓存的策略配置中,较主要的是第一行,即用户的访问记录,可以通过分析它来了解所有用户访问的详尽地址:

cache_access_log/var/squid/access.log

cache_log/var/squid/cache.log

cache_store_log/var/squid/store.log

下面这行配置是在较新版本中出现的参数,告诉Squid在错误页面中显示的服务器名称:

 visible_hostnameNo1.proxy

以下配置告诉Squid如何处理用户,对每个请求的IP地址作为单独地址处理:

client_mask255.255.255.255

如果是普通代理服务器,以上的配置已经足够。但是很多Squid都被用来做透明代理。所谓透明代理,就是客户端不知道有代理服务器的存在,当然也不需要进行任何与代理有关的设置,从而大大方便了系统管理员。相关的选项有以下几个:

httpd_accel_hostvirtual

httpd_accel_port80

httpd_accel_with_proxyon

httpd_accel_user_host_headeron

在Linux上,可以用iptables/ipchains直接将对Web端口80的请求直接转发到Squid端口3128,由Squid接手,而用户浏览器仍然认为它访问的是对方的80端口。例如以下这条命令:

iptables-tnat-APREROUTING-s192.168.0.200/32-ptcp--dport80-jREDIRECT3128

就是将192.168.0.200的所有针对80端口的访问重定向到3128端口。

所有设置完成后,关键且重要的任务是访问控制。Squid支持的管理方式很多,使用起来也非常简单(这也是有人宁愿使用不做任何缓存的Squid,也不愿意单独使用iptables的原因)。Squid可以通过IP地址、主机名、MAC地址、用户/密码认证等识别用户,也可以通过域名、域后缀、文件类型、IP地址、端口、URL匹配等控制用户的访问,还可以使用时间区间对用户进行管理,所以访问控制是Squid配置中的重点。Squid用ACL(AccessControlList,访问控制列表)对访问类型进行划分,用http_accessdeny或allow进行控制。根据需求首先定义两组用户advance和normal,还有代表所有未指明的用户组all及不允许上网的baduser,配置代码如下:

acladvance192.168.0.2-192.168.0.10/32

 aclnormalsrc192.168.0.11-192.168.0.200/32

aclbadusersrc192.168.0.100/32

aclbaddstdstwww.soocol.com

aclallsrc0.0.0.0/0

http_accessdenybaduser

http_accessallowadvance

http_accessallownormal

可以看出,ACL的基本格式如下:

acl列表名称控制方式控制目标

比如aclallsrc0.0.0.0/0,其名称是all,控制方式是src源IP地址,控制目标是0.0.0.0/0的IP地址,即所有未定义的用户。出于安全考虑,总是在最后禁止这个列表。

下面这个列表代表高级用户,包括IP地址从192.168.0.2到192.168.0.10的所有计算机:

acladvance192.168.0.2-192.168.0.20/32

下面这个baduser列表只包含一台计算机,其IP地址是192.168.0.100:

aclbaduser192.168.0.100/32

ACL写完后,接下来要对它们分别进行管理,代码如下:

http_accessdenybaduser

http_accessallowadvance

http_accessallownormal

上面几行代码告诉Squid不允许baduser组访问Internet,但advance、normal组允许(此时还没有指定详细的权限)。由于Squid是按照顺序读取规则,会首先禁止baduser,然后允许normal。如果将两条规则顺序颠倒,由于baduser在normal范围中,Squid先允许了所有的normal,那么再禁止baduser就不会起作用。

特别要注意的是,Squid将使用allow-deny-allow-deny……这样的顺序套用规则。例如,当一个用户访问代理服务器时,Squid会顺序测试Squid中定义的所有规则列表,当所有规则都不匹配时,Squid会使用与最后一条相反的规则。就像上面这个例子,假设有一个用户的IP地址是192.168.0.201,他试图通过这台代理服务器访问Internet,会发生什么情况呢?我们会发现,他能够正常访问,因为Squid找遍所有访问列表也没有和192.168.0.201有关的定义,便开始应用规则,而最后一条是deny,那么Squid默认的下一条处理规则是allow,所以192.168.0.201反而能够访问Internet了,这显然不是我们希望的。所以在所有squid.conf中,最后一条规则永远是http_accessdenyall,而all就是前面定义的“src0.0.0.0”。

上一页[1][2][3][4][5][6][7][8]