<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
<!-- this stylesheet will later on be added by lfparser automatically: -->
<style type="text/css">
<!--
  pre { font-familiy:monospace,Courier }
  p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:no ne; border-width:medium; border-color:#aedbe8; padding:0.1cm ; text-align:left }

-->
</style>

    <title></title>
  </head>

  <body>
    <h1>架设 Squid 代理服务器</h1>

    <h4>ArticleCategory: [Choose a category, do not translate
    this]</h4>
    SystemAdministration 

    <h4>AuthorImage:[Here we need a little image from you]</h4>
<img src="http://main.linuxfocus.org/common/images/DSOberoi.jpg" width="154" height="208"
alt="[DSOberoi]">

    <h4>TranslationInfo:[Author + translation history. mailto: or
    http://homepage]</h4>

    <p>original in en <a href="mailto:ds_oberoi@yahoo.com">D.S.
    Oberoi</a></p>
    
    <p>en to zh <a href="mailto:freeneil@sohu.com">Free Neil</a></p>

    <h4>AboutTheAuthor:[A small biography about the author]</h4>
    D.S. Oberoi 生活在印度的 Jammu,印度目前由于政局紧张,普遍难以连接上 Internet。

    <h4>Abstract:[Here you write a little summary]</h4>
    Linux 目前已经逐步成为网络的同义词。它可以在办公环境或日常家庭中作为文件服务器、打印服务器、
    <br>邮件服务器以及应用软件服务器来使用, 并且逐渐作为代理服务器来使用。<br>
    
    一台代理服务器可以通过一个Internet连接在同一时间为不同的用户提供Internet访问服务。好的代理服
    <br>务器同时还为访问请求提供缓存服务,这样当一个本地访问请求到达时,代理服务器会先在缓存记录里查
    <br>找有无相同的请求,如果有,则从缓存中把数据直接回送到客户端,从而缩短访问WEB的时间并减轻带宽
    <br>的压力。
    <br>Squid 是一个支持Proxy、HTTP缓存、Ftp、Gopher 等等的软件,它也支持SSL、访问控制、DNS缓存并且为
    <br>所有的请求做记录。Squid 在 Windows NT 下也可用,详见 <a href="http://www.logisense.com/">Logi Sense</a>. <br>
    <br>
    本文的重点是为配置一台代理服务器并为用户提供可控访问提供基本的指导。
    
    <h4>ArticleIllustration:[This is the title picture for your
    article]</h4>
<img src="http://main.linuxfocus.org/common/images/illustration235.gif" width="100"
height="44" alt="[squid]" hspace=10>

    <h4>ArticleBody:[The article body]</h4>

    <h2>Squid 已经安装了吗?</h2>
    Squid 的 rpm 文件已经和 RedHat 7.1 捆绑发行了,在安装系统的时候,如果在 Networks 选项中选中的
    <br>话,它会自动安装在系统上。您可以用下面的命令检查您的系统中是否已经安装了 Squid:

    <pre>rpm -q squid
   </pre>
    Squid 的最新版本可以在 <a href="http://www.squid-cache.org/">Squid 主页</a> 或它的<a href="http://www.squid-cache.org/mirrors.html">镜像站点</a>得到。
    Squid 可以用下述命令安装在系统上:

    <pre>rpm -ivh squid-2.3.STABLE4-10.i386.rpm
   </pre>

    <h2>配置 Squid</h2>
    Squid 的定制是通过编辑它的配置文件 squid.conf 来实现的,squid.conf 文件通常在 /etc/squid 目录
    <br>下。这个配置文件内容很多,但好在它的每个选项都有详尽的说明。
    <br>
    <br>
    首先要修改的是 http_port,这个选项指定了 Squid 监听客户请求的端口,默认值是 3128。要使用代理
    <br>功能,这个端口值要和运行 Squid 的机器的 IP 地址一起使用,可以修改成下面这样:
    
    <p class="code">http_port 192.168.0.1:8080</p>
    上述声明表示 Squid 绑定在 IP 地址 192.168.0.1 上,端口为 8080。端口可以设置为任意值,但要确认
    <br>没有其他程序会使用同样的端口。其他的服务请求的端口设置也可以设为类似的配置。
    
    <h2>访问控制</h2>
    使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。
    Squid 访问控制有两个要素:ACL 元素和 访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。
    <br>
    <br>
    下面列出一些重要的 ACL 元素类型<br>

    <ul>
      <li>src : 源地址 (即客户机IP地址)</li>

      <li>dst : 目标地址 (即服务器IP地址)</li>

      <li>srcdomain : 源名称 (即客户机名称)</li>

      <li>dstdomain : 目标名称 (即服务器名称)</li>

      <li>time : 一天中的时刻和一周内的一天</li>

      <li>url_regex : URL 规则表达式匹配</li>

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

      <li>proxy_auth : 通过外部程序进行用户验证</li>

      <li>maxconn : 单一 IP 的最大连接数</li>
    </ul>
    为了使用控制功能,必须先设置 ACL 规则并应用。ACL 声明的格式如下:
    
    <p class="code">acl &nbsp;&nbsp;acl_element_name &nbsp;&nbsp;type_of_acl_element
    values_to_acl</p>
    注:

    <ol>
      <li>acl_element_name 可以是任一个在 ACL 中定义的名称。</li>

      <li>任何两个 ACL 元素不能用相同的名字。</li>

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

      <li>并不是所有的 ACL 元素都能使用访问列表中的全部类型。</li>

      <li>不同的 ACL 元素写在不同行中,Squid 将把它们组合在一个列表中。</li>
    </ol>
    我们可以使用许多不同的访问条目。下面列出我们将要用到的几个:
    
    <ul>
      <li><b>http_access:</b> 允许 HTTP 访问。这个是主要的访问控制条目。</li>

      <li><b>no_cache:</b> 定义对缓存请求的响应。</li>
    </ul>
    访问列表的规则由一些类似 'allow' 或 'deny' 的关键字构成,用以允许或拒绝向特定或一组 ACL 元素提供服务。
    <br>
    注: 

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

      <li>一个访问列表可以又多条规则组成。</li>

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

      <li>一个访问条目中的所有元素将用逻辑与运算连接:<br>
       http_access Action 声明1 AND 声明2 AND 声明 OR.<br>
       http_access Action 声明3<br>
      多个 http_access 声明间用或运算连接,但每个访问条目的元素间用与运算连接。</li>

      <li>请记住列表中的规则总是遵循由上而下的顺序。</li>
    </ol>

    <h2>回到配置 Squid</h2>
    Squid 默认不做任何用户访问控制。若要允许某个访问,必须进行定制规则。在 squid.conf 中 http_access deny 行前输入下述文字:

    <p class="code">acl mynetwork 192.168.0.1/255.255.255.0<br>
     http_access allow mynetwork</p>
    mynetwork 是 acl 名称,下一行则是适用于特定 acl (即 mynetwork ) 的规则。192.168.0.1 
    指明是网络中掩码为 255.255.255.0 的子网。mynetwork 主要是为了给出网络上一组机器,下一条规则则允许这些
    <br>机器访问 http 服务。上述修改配合 http_port 就可以让 Squid 很好的工作起来了。 修改完成后,Squid 
    <br>可以用下述命令启动:

    <p class="code">service squid start</p>
    注:<br>
    Squid 也可以在系统启动的时候自动运行,方法是在 ntsysv 或 setup(系统服务菜单)中打开 Squid。在
    <br>对配置文件做了任何更改之后,当前正运行的 Squid 进程必须重新启动。可以用下面的命令来完成:

    <ol>
      <li>service squid restart 或</li>

      <li>/etc/rc.d/init.d/squid restart</li>
    </ol>

    <h2>配置客户端</h2>
    由于客户端的请求是送到代理服务器的特定端口的,因此,客户端也要做相应配置。在继续下一步之前,请
    <br>确认要访问代理服务器的客户端已经连接在局域网中并已分配了有效的 IP 地址,请确认它们都能 ping 通
    <br>运行了 Squid 的 Linux 服务器。<br>
    在 Internet Explorer 下的配置:<br>

    <ol>
      <li>点击菜单上的 工具 -&gt; Internet 选项</li>

      <li>选择 连接 并单击 局域网设置</li>

      <li>选中 使用代理服务器 输入上述代理服务器的 IP 地址和端口。</li>
    </ol>
    <br>
    在 Netscape Navigator 下的配置:<br>

    <ol>
      <li>点击菜单上的编辑(Edit)-&gt;首选项(Preference)-&gt;高级(Advanced)-&gt;代理服务器(Proxies)。</li>

      <li>选中手动配置代理服务器(Manual Proxy Configuration)。</li>

      <li>点击查看(View) 并</li>

      <li>输入上述代理服务器的 IP 地址和端口。</li>
    </ol>

    <h2>使用访问控制</h2>
    多个访问控制及其规则为客户端访问控制提供了一种灵活的机制。下面给出通常所用到的例子:

    <ol>
      <li>
        允许列表中的机器访问 Internet。<br>

        <p class="code">acl allowed_clients src 192.168.0.10
        192.168.0.20 192.168.0.30<br>
        http_access allow allowed_clients<br>
        http_access deny !allowed_clients</p>
        这个规则只允许 IP 地址为 192.168.0.10、192.168.0.20 及 192.168.0.30 的机器
        <br>访问 Internet,其他 IP 地址的机器则都被拒绝访问。
      </li>
      <br><br>
      <li>
        限制访问时段。<br>

        <p class="code">acl allowed_clients src
        192.168.0.1/255.255.255.0<br>
        acl regular_days time MTWHF 10:00-16:00<br>
        http_access allow allowed_clients regular_days<br>
        http_access deny !allowed_clients</p>
        这个规则允许子网192.168.0.1中的所有客户机在周一到周五的上午10:00到下午4:00
        <br>访问 Internet。
      </li>
      <br><br>
      <li>
        为不同的客户机分配不同的访问时段。<br>

        <p class="code">acl hosts1 src192.168.0.10<br>
        acl hosts2 src 192.168.0.20<br>
        acl hosts3 src 192.168.0.30<br>
        acl morning time 10:00-13:00<br>
        acl lunch time 13:30-14:30<br>
        acl evening time 15:00-18:00<br>
        http_access allow host1 morning<br>
        http_access allow host1 evening<br>
        http_access allow host2 lunch<br>
        http_access allow host3 evening<br>
        http_access deny all</p>
        在这个规则中,主机 host1 可以在 morning 和 evening 时段访问 Internet,主机
        <br>host2 和 host3 分别只能在 lunch 和 evening 时段访问 Internet。<br>
        <br>
        注:<br>
        一个访问条目中所有的元素之间用与运算按下述方式连接 :

        <p class="code">http_access Action statement1 AND staement2
        AND statement OR.</p>
        多个 http_access 声明之间用或运算连接而每个访问条目中的元素用与运算连接,见
        <br>下:

        <p class="code">http_access allow host1 morning evening</p>
        无法在时段 morning 和时段 evening 同时进行(morning AND evening ),这个表达
        <br>式将不会返回真值(TRUE),从而这个条目将不会引发任何动作。
      </li>
      <br><br>
      <li>
        站点屏蔽<br>
        Squid 可以屏蔽某些特定站点或含有某些特定字词的站点。可以用下面的规则实现:

        <p class="code">acl allowed_clients src
        192.168.0.1/255.255.255.0<br>
         acl banned_sites url_regex abc.com *()(*.com<br>
         http_access deny banned_sites<br>
         http_access allow allowed_clients<br>
        </p>
        也可以用以屏蔽含有某些特定字词(比如说 dummy、fake)的站点

        <p class="code">acl allowed_clients src
        192.168.0.1/255.255.255.0<br>
         acl banned_sites url_regex dummy fake<br>
         http_access deny banned_sites<br>
         http_access allow allowed_machibes</p>
        在实际应用中,不需要把需屏蔽的所有站点或字词都列在上面,可以先保存在一个文件
        <br>中(请查看 /etc 目录中的 banned.list文件)ACL 将从这个文件中读出所需信息用以
        <br>屏蔽被禁止的站点。

        <p class="code">acl allowed_clients src
        192.168.0.1/255.255.255.0<br>
         acl banned_sites url_regex "/etc/banned.list"<br>
         http_access deny banned_sites<br>
         http_access allow allowed_clients</p>
      </li>

      <li>
        优化<br>
         Squid 可以通过使用 maxconn 元素来限制客户端连接的数目。 要使用这个选项,必须
         <br>先允许 client_db。

        <p class="code">acl mynetwork 192.168.0.1/255.255.255.0<br>
         acl numconn maxconn 5<br>
         http_access deny mynetwork numconn</p>
        注:<br>
        maxconn ACL 使用小于(less-than)对比。此 ACL 规则将在连接数大于设定值时被匹配。
        <br>这是 ACL 不与 http_access 允许规则连用的主要原因。
      </li>
      <br><br>
      <li>
        缓存数据<br>
        对于静态页面,缓存的数据能够立刻回送到发出请求的客户端。没有必要去缓存 cgi-bin 
        <br>或 Servlet,这些可以用 ACL 元素 no_cache 来禁止。
        
        <p class="code">acl cache_prevent1 url_regex cgi-bin /?<br>
        acl cache_prevent2 url_regex Servlet<br>
        no_cache deny cache_prevent1<br>
         no_cache deny cache_prevent2</p>
      </li>

      <li>
        自定错误反馈信息<br>
        可以用拒绝规则的 deny_info 选项来自定错误反馈信息。Squid 默认的错误信息放在
        <br>/etc/squid/errors 目录中。这个目录可以用 error_directory 选项指定。您也可以
        <br>定制现存的错误反馈信息。

        <p class="code">acl allowed_clients src 192.168.0.1/255.255.255.0<br>
         acl banned_sites url_regex abc.com *()(*.com<br>
         http_access deny banned_sites<br>
         deny_info ERR_BANNED_SITE banned_sites<br>
         http_access allow allowed_clients</p>
        在上面的例子中,当用户试图访问被禁止的站点时,将会显示一条定制的信息。
        <br>ERR_BANNED_SITE 选项中的文件名必须在上述的错误信息的目录中。错误信息必须是 HTML 格
        <br>式的。上面列出了 ACL 的一些选项,您可以参看 Squid 主页上的 <a href=
        "http://www.squid-cache.org/Doc/FAQ">FAQ 文档</a> 以获得使用 ACL 
        <br>更多的信息。
      </li>
    </ol>

    <h2>日志</h2>
    Squid 的所有日志文件都存放在 /var/log/squid 目录中,有缓存日志、访问日志和 store.log文件。文
    <br>件 access.log 记录了有关客户机的请求、连接活动、每个 HTTP &amp; ICP 询问、客户机 IP 地址、请求方
    <br>式、请求的 URL 等等信息。这些数据可以用来对访问进行分析。许多程序如 <a href="http://web.onda.com.br/orso/ index.html">sarg</a>、 <a
    href="http://calamaris.cord.de/">calamaris</a>, <a href=
    "http://squidlog.sourceforge.net/">Squid-Log-Analyzer</a> 都可以用来分析这些数据并产生 HTML 格式的分析报告。
    这些报告可以在一组用户、一组
    <br>IP 地址或一组访问过的站点等等记录中产生。<br>
    <br>
    这些记录文件也可以成为下面这样: <br>
<pre>
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
</pre>

    <h2>验证方式</h2>
    Squid 的默认配置允许任何用户不经过验证过程就可以进行访问。Squid 通过一个外部程序提供用户验证
    <br>功能(比如说只允许有效的用户访问 Internet),这就需要一个有效的用户名和密码。可以用 proxy_auth
    <br>ACL 和 authenticate_program 来实现,在允许访问前强制进行用户名和密码的核查。下面列出一些 Squid
    <br>能用到的验证程序:
    
    <ol>
      <li>LDAP : 使用 Linux Lightweight 目录访问协议(Linux Lightweight Directory Access Protocol)</li>

      <li>NCSA : 使用 NCSA 风格的用户名和密码档</li>

      <li>SMB : 使用 SMB 协议的服务,如 SAMBA 或 Windows NT</li>

      <li>MSNT : 使用 Windows NT 的域验证</li>

      <li>PAM : 使用 Linux 的可装载验证模块</li>

      <li>getpwam : 使用 Linux 密码档</li>
    </ol>
    必须指定使用的验证程序,可以用 authenticate_program 选项完成。请确认选定的验证程序已安装并能很
    <br>好的工作。<br>
    <br>
    修改 squid.conf 文件选定验证程序<br>
    authenticate_program /usr/local/bin/pam_auth 

    <p class="code">acl pass proxy_auth REQUIRED<br>
    acl mynetwork src 192.168.0.1/255.255.255.0<br>
    http_access deny !mynetwork<br>
    http_access allow pass<br>
    http_access deny all</p>
    这个规则表示,使用 PAM 验证程序,所有用户在获得访问许可前必须进行验证。<br>
    <br>
    还有些选项比如 authenticate_ttl 和 authenticate_ip_ttl,可以用来改变验证程序的动作,比如说使某个用户名及密码重新生效。
    
    <h2>参考资料</h2>
    本文仅仅初窥了 Squid 的冰山一角,更多的参考资料可以在下面的站点找到:
   
    <ul>
      <li><a href="http://www.squid-cache.org/">Squid Home,
      www.squid-cache.org</a></li>

      <li><a href="http://squid-docs.sourceforge.net/">Squid
      Documentation Project, squid-docs.sourceforge.net</a></li>

      <li><a href="http://www.visolve.com">visolve.com</a></li>

      <li><a href=
      "http://home.iae.nl/users/devet/squid/proxy_auth/">For Proxy
      Authentication,
      home.iae.nl/users/devet/squid/proxy_auth</a></li>
    </ul>
    <!-- vim: set sw=2 ts=2 et tw=80: -->
  </body>
</html>