Linux下架设代理服务器 一、代理服务器概述
1.1什么是代理服务器 在TCP/IP网络中,传统的通信过程是这样的:客户端向服务器请求数据,服务器响应该请求,将数据传送给客户端。在引入了代理服务器以后,这一过程变成了这样:客户端向服务器发起请求,该请求被送到代理服务器;代理服务器分析该请求,先查看自己缓存中是否有请求数据,如果有就直接传送给客户端,如果没有就代替客户端向该服务器发出请求。服务器响应以后,代理服务器将响应的数据传送给客户端,同时在自己的缓存中保留一份该数据的拷贝。这样,再有客户端请求相同的数据时,代理服务器就可以直接将数据传送给客户端,而不需要再向该服务器发起请求。
1.2 代理服务器的功能 一般说来,代理服务器具有以下的功能: 1.通过缓存增加访问速度 随着Internet的迅猛发展,网络带宽变得越来越珍贵。所以为了提高访问速度,好多ISP都提供代理服务器,通过代理服务器的缓存功能来加快网络的访问速度。一般说来,大多数的代理服务器都支持HTTP缓存,但是,有的代理服务器也支持FTP缓存。在选择代理服务器时,对于大多数的组织,只需要HTTP缓存功能就足够了。 通常,缓存有主动缓存被动缓存之分。所谓被动缓存,指的是代理服务器只在客户端请求数据时才将服务器返回的数据进行缓存,如果数据过期了,又有客户端请求相同数据时,代理服务器又必须重新发起新的数据请求,在将响应数据传送给客户端时又进行新的缓存。所谓主动缓存,就是代理服务器不断地检查缓存中的数据,一旦有数据过期,则代理服务器主动发起新的数据请求来更新数据。这样,当有客户端请求该数据时就会大大缩短响应时间。还需要说明的是,对于数据中的认证信息,大多数的代理服务器都不会进行缓存的。 2.提供用私有IP访问Internet的方法 IP地址是不可再生的宝贵资源,假如你只有有限的IP地址,但是需要提供整个组织的Internet访问能力,那么,你可以通过使用代理服务器来实现这一点。 3.提高网络的安全性 这一点是很明显的,如果内部用户访问Internet都是通过代理服务器,那么,代理服务器就成为**Internet的唯一通道;反过来说,代理服务器也是Internet访问内部网的唯一通道,如果你没有做反向代理,则对于Internet上的主机来说,你的整个内部网只有代理服务器是可见的,从而大大增强了网络的安全性。
1.3 代理服务器的分类及特点 通常的代理服务器分类方法,是从实现的机理分为线路层代理、应用层代理、智能线路层代理等等。在这里,我想从另外一个角度出发,把代理服务器分为传统代理服务器和透明代理服务器。 我认为有必要好好搞清楚两者的区别,只有真正明白了内在地机理,才能在遇到问题时,有章可循,才不会一头雾水,不知从何解决问题。因此,下面我们就通过具体的实例来说明。本章的写作思路来源于PaulRussell所写的IPCHAINS-HOWTO。下面所举的例子也来源于该文章,我觉得我读该文的最大收获在于对内部网访问外部网以及外部网访问内部网的实现手段有了一个清晰的认识。当然,这里所谓的内部网是指使用私有IP的内部网络。 我们的例子都基于以下假设: 你的域名为sample.com,你的内部网(192.168.1.*)用户通过proxy.sample.com(外部接口eth0:1.2.3.4;内部接口eth1:192.168.1.1)的代理服务器访问Internet,换句话说,该代理服务器是唯一一台直接与Internet和内部网相连的机器。并假该设代理服务器上运行着某种代理服务器软件(如squid)。假设内部网中某一客户机为client.sample.com(192.168.1.100)。 +-------------------+ |内部网(192.168.1.*)| eth1+--------+eth0 DDN | +------------| proxy|<===============>;Internet |client198.168.1.100| +--------+ +-------------------+ eth0: 1.2.3.4 eth1: 198.168.1.1
1.3.1传统代理 在以上基础上我们做以下工作: 1.代理服务软件被绑定到代理服务器的8080端口。 2.客户端浏览器被配置使用代理服务器的8080端口。 3.客户端不需要配置dns。 4.代理服务器上需要配置代理服务器。 5.客户端不需要配置缺省路由。 当我们在客户端浏览器中打开一个web请求,比如“http://www.linuxaid.com.cn”,这时将陆续发生以下事件: 1.客户端使用某一端口(比如1025)连接代理服务器8080端口,请求web页面“http://www.linuxaid.com.cn” 2.代理服务器向dns请求“www.linuxaid.com.cn”,得到相应的IP地址202.99.11.120。然后,代理服务器使用某一端口(比如1037)向该IP地址的80端口发起web连接请求,请求web页面。 3.收到响应的web页面后,代理服务器把该数据传送给客户端。 4.客户端浏览器显示该页面。 从www.linuxaid.com.cn的角度看来,连接是在1.2.3.4地1037端口和202.99.11.120的80端口之间建立的。从client的角度看来,连接是在192.168.1.100的1025端口和1.2.3.4的8080端口之间建立的。
1.3.2 透明代理 透明代理的意思是客户端根本不需要知道有代理服务器的存在。 在以上基础上我们做以下工作: 1.配置透明代理服务器软件运行在代理服务器的8080端口。 2.配置代理服务器将所有对80端口的连接重定向到8080端口。 3.配置客户端浏览器直接连解到Internet。 4.在客户端配置好dns. 5.配置客户端的缺省网关为192.168.1.1. 当我们在客户端浏览器中打开一个web请求,比如“http://www.linuxaid.com.cn”,这时将陆续发生以下事件: 1.客户端向dns请求“www.linuxaid.com.cn”,得到相应的IP地址202.99.11.120。然后,客户端使用某一端口(比如1066)向该IP地址的80端口发起web连接请求,请求web页面。 2.当该请求包通过透明代理服务器时,被重定向到代理服务器的绑定端口8080。于是,透明代理服务器用某一端口(比如1088)向202.99.11.120的80端口发起web连接请求,请求web页面。 3.收到响应的web页面后,代理服务器把该数据传送给客户端。 4.客户端浏览器显示该页面。 从www.linuxaid.com.cn的角度看来,连接是在1.2.3.4地1088端口和202.99.11.120的80端口之间建立的。从client的角度看来,连接是在192.168.1.100的1066端口和202.99.11.120的80端口之间建立的。 以上就是传统代理服务器和透明代理服务器的区别所在。
二、各种代理服务器的比较 linux下的代理服务器软件很多,我从www.freshmeat.com(一个著名的linux软件站点)查看了一下,足有六十多个。但是被广泛应用的只有Apache、socks、squid等几个实践证明是高性能的代理软件。下面我们分别来比较一下这几个软件:
2.1 Apache Apache是世界上用的最广泛的HTTP服务器,之所以用的最广泛,是因为它强大的功能、高效率、安全性和速度。从1.1.x版本开始,Apache开始包含了一个代理模块。用Apache作代理服务器的性能优势并不明显,不建议使用。
2.2 Socks Socks是一种网络代理协议,该协议可以让客户机通过Socks服务器获得对Internet的完全访问能力。Scoks在服务器和客户端之间建立一个安全的代理数据通道,从客户的角度看来,Scoks是透明的;从服务器的角度看来,Socks就是客户端。客户端不需要具有对Internet的直接访问能力(也就是说,可以使用私有IP地址),因为Socks服务器能够把来自于客户端的连接请求重定向到Internet。此外,Socks服务器可以对用户连接请求进行认证,允许合法用户建立代理连接。同理,Socks也能防止非授权的Internet用户访问及的内部网络。所以常常把Socks当作防火墙来使用。 常见的浏览器如netscape、IE等可以直接使用Socks,并且我们也可以使用socsk5的所带的client来使那些不直接支持socks的internet软件使用Socks。 更多的资料可以参考Socks官方站点http://www.socks.nec.com。
2.3 squid 对于web用户来说,squid是一个高性能的代理缓存服务器,squid支持FTP、gopher和HTTP协议。和一般的代理缓存软件不同,squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。 squid将数据元缓存在内存中,同时也缓存dns查询的结果,除此之外,它还支持非模块化的dns查询,对失败的请求进行消极缓存。squid支持SSL,支持访问控制。由于使用了ICP(轻量Internet缓存协议),squid能够实现层叠的代理阵列,从而最大限度地节约带宽。 squid由一个主要的服务程序squid,一个dns查询程序dnsserver,几个重写请求和执行认证的程序,以及几个管理工具组成。当squid启动以后,它可以派生出预先指定数目的dnsserver进程,而每一个dnsserver进程都可以执行单独的dns查询,这样一来就大大减少了服务器等待dns查询的时间。
2.4 选择 从上面的比较可以看出,Apache主要功能是web服务器,代理功能只不过是其一个模块而已,Socks虽然强大,但有欠灵活,因此我们着重推荐你使用squid。下面的章节我们就一起来学习squid激动人心的特性及相关的安装与配置。
三、安装squid Proxy Server
3.1获取软件 你可以通过以下途径获取该软件: 1.从squid的官方站点http://www.squid-cache.org下载该软件; 2.从你的linux发行版本中获取该软件; 通常,squid软件包有两种:一种是源代码,下载后需要自己重新编译;可执行文件,下载后只需解压就可以使用;另一种是就是RedHat所使用的rpm包。下面我们分别讲讲这两种软件包的安装方法。
3.2安装软件 我们以目前最新的稳定版本squid-2.3.STABLEX为例。
3.2.1rpm包的安装 1.**/mnt/cdrom/RedHat/RPMS 2.执行rpm -ivh squid-2.2.STABLE4-8.i386.rpm。 当然,我们也可以在开始安装系统的过程中安装该软件。
3.2.2 源代码包的安装 1.从http://www.squid-cache.org下载squid-2.3.STABLE2-src.tar.gz。 2.将该文件拷贝到/usr/local目录。 3.解开该文件 tar xvzf squid-2.3.STABLE2-src.tar.gz。 4.解开后,在/usr/local生成一个新的目录squid-2.3.STABLE2,为了方便用mv命令将 该目录重命名为squidmv squid-2.3.STABLE2 squid; 5.**squid cd squid 6.执行./configure 可以用./confgure--prefix=/directory/you/want指定安装目录 系统缺省安装目录为/usr/local/squid。 7.执行 make all 8.执行 make install 9.安装结束后,squid的可执行文件在安装目录的bin子目录下,配置文件在etc子目录下。
四、配置squid基础篇——让代理服务器跑起来配置 Squid Squid 的定制是通过编辑它的配置文件 squid.conf 来实现的,squid.conf 文件通常在 /etc/squid 目录 下。这个配置文件内容很多,但好在它的每个选项都有详尽的说明。
首先要修改的是 http_port,这个选项指定了 Squid 监听客户请求的端口,默认值是 3128。要使用代理 功能,这个端口值要和运行 Squid 的机器的 IP 地址一起使用,可以修改成下面这样:
http_port 192.168.0.1:8080 上述声明表示 Squid 绑定在 IP 地址 192.168.0.1 上,端口为 8080。端口可以设置为任意,但要** 没有其他程序会使用同样的端口。其他的服务请求的端口设置也可以设为类似的配置。 上述声明表示 Squid 绑定在 IP 地址 192.168.0.1 上,端口为 8080。端口可以设置为任意值,但要** 没有其他程序会使用同样的端口。其他的服务请求的端口设置也可以设为类似的配置。 访问控制 使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。 Squid 访问控制有两个要素:ACL 元素和 访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。
下面列出一些重要的 ACL 元素类型
* src : 源地址 (即客户机IP地址) * dst : 目标地址 (即服务器IP地址) * srcdomain : 源名称 (即客户机名称) * dstdomain : 目标名称 (即服务器名称) * time : 一天中的时刻和一周内的一天 * url_regex : URL 规则表达式匹配 * urlpath_regex: URL-path 规则表达式匹配,略去协议和主机名 * proxy_auth : 通过外部程序进行用户验证 * maxconn : 单一 IP 的最大连接数
为了使用控制功能,必须先设置 ACL 规则并应用。ACL 声明的格式如下:
acl acl_element_name type_of_acl_element values_to_acl 注:
1. acl_element_name 可以是任一个在 ACL 中定义的名称。 2. 任何两个 ACL 元素不能用相同的名字。 3. 每个 ACL 由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换言之,即任一 ACL 元素的值被匹配,则这个 ACL 元素即被匹配。 4. 并不是所有的 ACL 元素都能使用访问列表中的全部类型。 5. 不同的 ACL 元素写在不同行中,Squid 将把它们组合在一个列表中。
我们可以使用许多不同的访问条目。下面列出我们将要用到的几个:
* http_access: 允许 HTTP 访问。这个是主要的访问控制条目。 * no_cache: 定义对缓存请求的响应。
访问列表的规则由一些类似 'allow' 或 'deny' 的关键字构成,用以允许或拒绝向特定或一组 ACL 元素提供服务。 注:
1. 这些规则按照它们的排列顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即结束。 2. 一个访问列表可以又多条规则组成。 3. 如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。 4. 一个访问条目中的所有元素将用逻辑与运算连接: http_access Action 声明1 AND 声明2 AND 声明 OR. http_access Action 声明3 多个 http_access 声明间用或运算连接,但每个访问条目的元素间用与运算连接。 5. 请记住列表中的规则总是遵循由上而下的顺序。
回到配置 Squid Squid 默认不做任何用户访问控制。若要允许某个访问,必须进行定制规则。在 squid.conf 中 http_access deny 行前输入下述文字:
acl mynetwork 192.168.0.1/255.255.255.0 http_access allow mynetwork mynetwork 是 acl 名称,下一行则是适用于特定 acl (即 mynetwork ) 的规则。192.168.0.1 指明是网络中掩码为 255.255.255.0 的子网。mynetwork 主要是为了给出网络上一组机器,下一条规则则允许这些 机器访问 http 服务。上述修改配合 http_port 就可以让 Squid 很好的工作起来了。 修改完成后,Squid 可以用下述命令启动:
service squid start 注: Squid 也可以在系统启动的时候自动运行,方法是在 ntsysv 或 setup(系统服务菜单)中打开 Squid。在 对配置文件做了任何更改之后,当前正运行的 Squid 进程必须重新启动。可以用下面的命令来完成:
1. service squid restart 或 2. /etc/rc.d/init.d/squid restart
配置客户端 由于客户端的请求是送到代理服务器的特定端口的,因此,客户端也要做相应配置。在继续下一步之前,请 **要访问代理服务器的客户端已经连接在局域网中并已分配了有效的 IP 地址,请**它们都能 ping 通 运行了 Squid 的 Linux 服务器。 在 Internet Explorer 下的配置:
1. 点击菜单上的 工具 -> Internet 选项 2. 选择 连接 并单击 局域网设置 3. 选中 使用代理服务器 输入上述代理服务器的 IP 地址和端口。
在 Netscape Navigator 下的配置:
1. 点击菜单上的编辑(Edit)->首选项(Preference)->高级(Advanced)->代理服务器(Proxies)。 2. 选中手动配置代理服务器(Manual Proxy Configuration)。 3. 点击查看(View) 并 4. 输入上述代理服务器的 IP 地址和端口。
使用访问控制 多个访问控制及其规则为客户端访问控制提供了一种灵活的机制。下面给出通常所用到的例子:
1. 允许列表中的机器访问 Internet。
acl allowed_clients src 192.168.0.10 192.168.0.20 192.168.0.30 http_access allow allowed_clients http_access deny !allowed_clients 这个规则只允许 IP 地址为 192.168.0.10、192.168.0.20 及 192.168.0.30 的机器 访问 Internet,其他 IP 地址的机器则都被拒绝访问。
2. 限制访问时段。
acl allowed_clients src 192.168.0.1/255.255.255.0 acl regular_days time MTWHF 10:00-16:00 http_access allow allowed_clients regular_days http_access deny !allowed_clients 这个规则允许子网192.168.0.1中的所有客户机在周一到周五的上午10:00到下午4:00 访问 Internet。
3. 为不同的客户机分配不同的访问时段。
acl hosts1 src192.168.0.10 acl hosts2 src 192.168.0.20 acl hosts3 src 192.168.0.30 acl morning time 10:00-13:00 acl lunch time 13:30-14:30 acl evening time 15:00-18:00 http_access allow host1 morning http_access allow host1 evening http_access allow host2 lunch http_access allow host3 evening http_access deny all 在这个规则中,主机 host1 可以在 morning 和 evening 时段访问 Internet,主机 host2 和 host3 分别只能在 lunch 和 evening 时段访问 Internet。
注: 一个访问条目中所有的元素之间用与运算按下述方式连接 :
http_access Action statement1 AND staement2 AND statement OR. 多个 http_access 声明之间用或运算连接而每个访问条目中的元素用与运算连接,见 下:
http_access allow host1 morning evening 无法在时段 morning 和时段 evening 同时进行(morning AND evening ),这个表达 式将不会返回真值(TRUE),从而这个条目将不会引发任何动作。
4. 站点屏蔽 Squid 可以屏蔽某些特定站点或含有某些特定字词的站点。可以用下面的规则实现:
acl allowed_clients src 192.168.0.1/255.255.255.0 acl banned_sites url_regex abc.com *()(*.com http_access deny banned_sites http_access allow allowed_clients 也可以用以屏蔽含有某些特定字词(比如说 dummy、fake)的站点
acl allowed_clients src 192.168.0.1/255.255.255.0 acl banned_sites url_regex dummy fake http_access deny banned_sites http_access allow allowed_machibes 在实际应用中,不需要把需屏蔽的所有站点或字词都列在上面,可以先保存在一个文件 中(请查看 /etc 目录中的 banned.list文件)ACL 将从这个文件中读出所需信息用以 屏蔽被禁止的站点。
acl allowed_clients src 192.168.0.1/255.255.255.0 acl banned_sites url_regex "/etc/banned.list" http_access deny banned_sites http_access allow allowed_clients 5. 优化 Squid 可以通过使用 maxconn 元素来限制客户端连接的数目。 要使用这个选项,必须 先允许 client_db。
acl mynetwork 192.168.0.1/255.255.255.0 acl numconn maxconn 5 http_access deny mynetwork numconn 注: maxconn ACL 使用小于(less-than)对比。此 ACL 规则将在连接数大于设定值时被匹配。 这是 ACL 不与 http_access 允许规则连用的主要原因。
6. 缓存数据 对于静态页面,缓存的数据能够立刻回送到发出请求的客户端。没有必要去缓存 cgi-bin 或 Servlet,这些可以用 ACL 元素 no_cache 来禁止。
acl cache_prevent1 url_regex cgi-bin /? acl cache_prevent2 url_regex Servlet no_cache deny cache_prevent1 no_cache deny cache_prevent2 7. 自定错误反馈信息 可以用拒绝规则的 deny_info 选项来自定错误反馈信息。Squid 默认的错误信息放在 /etc/squid/errors 目录中。这个目录可以用 error_directory 选项指定。您也可以 定制现存的错误反馈信息。
acl allowed_clients src 192.168.0.1/255.255.255.0 acl banned_sites url_regex abc.com *()(*.com http_access deny banned_sites deny_info ERR_BANNED_SITE banned_sites http_access allow allowed_clients 在上面的例子中,当用户试图访问被禁止的站点时,将会显示一条定制的信息。 ERR_BANNED_SITE 选项中的文件名必须在上述的错误信息的目录中。错误信息必须是 HTML 格 式的。上面列出了 ACL 的一些选项,您可以参看 Squid 主页上的 FAQ 文档 以获得使用 ACL 更多的信息。
日志 Squid 的所有日志文件都存放在 /var/log/squid 目录中,有缓存日志、访问日志和 store.log文件。文 件 access.log 记录了有关客户机的请求、连接活动、每个 HTTP & ICP 询问、客户机 IP 地址、请求方 式、请求的 URL 等等信息。这些数据可以用来对访问进行分析。许多程序如 sarg、 calamaris, Squid-Log-Analyzer 都可以用来分析这些数据并产生 HTML 格式的分析报告。 这些报告可以在一组用户、一组 IP 地址或一组访问过的站点等等记录中产生。
这些记录文件也可以成为下面这样:
cache_access_log For access.log cache_log For cache.log cache_store_log For store.log (Store manager) pid_filename Squid process ID file name
验证方式 Squid 的默认配置允许任何用户不经过验证过程就可以进行访问。Squid 通过一个外部程序提供用户验证 功能(比如说只允许有效的用户访问 Internet),这就需要一个有效的用户名和密码。可以用 proxy_auth ACL 和 authenticate_program 来实现,在允许访问前强制进行用户名和密码的核查。下面列出一些 Squid 能用到的验证程序:
1. LDAP : 使用 Linux Lightweight 目录访问协议(Linux Lightweight Directory Access Protocol) 2. NCSA : 使用 NCSA 风格的用户名和密码档 3. SMB : 使用 SMB 协议的服务,如 SAMBA 或 Windows NT 4. MSNT : 使用 Windows NT 的域验证 5. PAM : 使用 Linux 的可装载验证模块 6. getpwam : 使用 Linux 密码档
必须指定使用的验证程序,可以用 authenticate_program 选项完成。请**选定的验证程序已安装并能很 好的工作。
修改 squid.conf 文件选定验证程序 authenticate_program /usr/local/bin/pam_auth
acl pass proxy_auth REQUIRED acl mynetwork src 192.168.0.1/255.255.255.0 http_access deny !mynetwork http_access allow pass http_access deny all 这个规则表示,使用 PAM 验证程序,所有用户在获得访问许可前必须进行验证。
还有些选项比如 authenticate_ttl 和 authenticate_ip_ttl,可以用来改变验证程序的动作,比如说使某个用户名及密码重新生效。
|