Azure Ubuntu VM + Squid + MySql 搭建用户可管理的代理服务器集群

本文介绍使用Squid 中的 basic_db_auth + mysql 作为Squid的用户权限认证模块,便于后期扩展与管理维护

VM的搭建

由于我们需要构建的是一个代理池,机器的数量可能很多,所以比较方便的做法是使用Azure的自定义镜像功能。一次搭建,多次复制。

  • 首先使用Azure Portal创建一个Ubuntu 虚拟机,代理所需要的资源比较少,一般最低配置的A0也就足够使用了。为安全起见建议使用PK/SK的方式设置登陆。

  • Squid安装:

sudo apt-get install squid -y
sudo systemctl status squid

如果看到squid正在运行的状态,则Squid安装成功

  • Squid配置:

Squid 配置文件路径: /etc/squid/squid.conf, 建议修改前先备份一份。基础配置可以参照:http://wiki.ubuntu.org.cn/Squid。

下面为本次我所用到的配置文件,配置文件中的连接字符串配置需要根据自己的需要更改。

auth_param basic program /usr/lib/squid/basic_db_auth --dsn "DBI:mysql:host=host;port=3306;database=database" --user "user" --password "pwd" --plaintext --persist --debug
auth_param basic children 1 startup=1 idle=1
auth_param basic realm gsbw proxy-caching web server
auth_param basic credentialsttl 10 minute
acl dbauth proxy_auth REQUIRED
acl SSL_ports port 443
acl Safe_ports port 80      # http
acl Safe_ports port 21      # ftp
acl Safe_ports port 443     # https
acl Safe_ports port 70      # gopher
acl Safe_ports port 210     # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280     # http-mgmt
acl Safe_ports port 488     # gss-http
acl Safe_ports port 591     # filemaker
acl Safe_ports port 777     # multiling http
acl CONNECT method CONNECT
http_access allow !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access allow dbauth
http_access deny all
http_port 3128
via off
forwarded_for transparent

注意使用Mysql认证的话需要安装perl的DBI包:

cpan
cpan>install DBI

配置好之后需要重启squid服务或者重新加载配置文件:

sudo systemctl restart squid

然后也不要忘记了在Azure安全组里面需要添加对 配置文件中 http_port 端口的入站权限。权限添加好之后就可以尝试下能否通过代理访问成功。

  • 捕获VM镜像:

在目标机器上取消设置源 VM

sudo waagent -deprovision+user -force
exit

然后使用azure cli操作,以下环境为azure cli 1.0:

azure config mode arm
azure login -e AzureChinaCloud -u username
azure vm deallocate -g myResourceGroup -n myVM
azure vm generalize -g myResourceGroup -n myVM
azure vm capture -g myResourceGroup -n myVM -p myVHDNamePrefix -t myTemplate.json

至此 我们的原始镜像已经创建成功。

批量创建虚拟机

azure group create myResourceGroup1 -l "chinaeast"
azure network vnet create myResourceGroup1 myVnet -l "chinaeast"
azure network vnet subnet create myResourceGroup1 myVnet mySubnet
azure network public-ip create myResourceGroup1 myPublicIP -l "chinaeast"
azure network nic create myResourceGroup1 myNIC -k mySubnet -m myVnet -p myPublicIP -l "chinaeast"
azure network nic show myResourceGroup1 myNIC
azure group deployment create myResourceGroup1 MyDeployment -f MyTemplate.json

我们还可以使用资源模板来创建更多的虚拟机。这部分可以参照官方文档。

squid透明代理之应用层广告过滤

透明代理的意思是客户端不需要知道有代理服务器的存在,也不需要有设置代理的操作,它改变你的request fields(报文),并会传送真实IP。

什么时候用透明代理?

squid正向代理其实我一直都在用,在局域网做个缓存服务器常用网站的加载速度会有明显提升,我主要还是为了在应用层过滤广告,可是移动设备设置代理又比较麻烦,一个网段下的其他人也不能受益,这种情况就可以搞起 “透明代理了“(https://baike.so.com/doc/1191007-1259770.html) 。

当然如果想了解局域网内的其他人都上了哪些不可告人的网站,刷朋友圈浏览了哪些照片。这时squid相当于是个中间人,对于裸奔的http请求,那绝对毫无隐私可言啊,结合一些日志分析工具譬如awstats,可以很直观的了解局域网内设备的浏览行文,当然这一切对于客户端是透明的无感知的。这也是为什么现在如此推崇ssl的原因了。对于https squid 其实也是可以解析的,就是比较麻烦这个后面再说。

准备物料

  • 树莓派,我这用的树莓派2b+;

  • 路由器,华为pro;

squid

squid安装过程不表仅贴一下编译参数,具体可参见官方文档

./configure --prefix=/usr/local/squid 
--enable-gnuregex 
--disable-carp 
--enable-async-io=240 
--with-pthreads 
--enable-storeio=ufs,aufs,diskd 
--disable-wccp 
--enable-icmp 
--enable-kill-parent-hack 
--enable-cachemgr-hostname=Raspi 
--with-maxfd=65535 
--enable-poll 
--enable-Linux-netfilter  #透明代理必需
--enable-large-cache-files 
--disable-ident-lookups 
--enable-default-hostsfile=/etc/hosts 
--with-dl 
--with-large-files 
--enable-delay-pools 
--enable-snmp 
--disable-internal-dns 
--enable-underscore 
--enable-arp-acl

当然你如果想让squid承担中间人重新加密的任务(就是解析https数据拉),就需要增加以下两个参数了,让squid支持sslbump和动态证书生成,但是这种方式仅支持正向代理。

--with-openssl
--enable-ssl-crtd

具体可以参照以下官方文档:

  • http://wiki.squid-cache.org/Features/SslBump

  • http://wiki.squid-cache.org/Features/DynamicSslCert

  • http://wiki.squid-cache.org/Features/MimicSslServerCert

squid装好后有几个关键配置

vim /usr/local/squid/etc/squid.conf
http_port 3128 transparent #开启透明代理支持
cache_mem 128 MB
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh #combined格式输出日志,后面awstats统计用
access_log /data/logs/squid/access.log combined #后面awstats统计要用到
cache_log /data/logs/squid/cache.log

#广告过滤
error_directory /usr/local/squid/share/errors/en-us/ #指定错误信息语言,我这里是英文(广告请求拦截后的转发页面也放这里)
acl deny_url dstdom_regex "/usr/local/squid/etc/acl/deny_url.acl" #广告url列表,github上有很多如 https://github.com/vokins/yhosts
deny_info 410:ERR_URL deny_url #ERR_URL是error_directory目录下面的错误文件,可以是文本或者html文件。 http_access deny deny_url

squid常用命令

/usr/local/squid/sbin/squid -z #重建缓存
/usr/local/squid/sbin/squid #启动
/usr/local/squid/sbin/squid -k reconfigure #重载配置文件

如果一切顺利此时squid的透明代理已经支持。

dhcp

但是要让整个局域网使用透明代理,还需让客户端的网关地址是squid服务器的地址,网关地址在普通路由器上是没法自定义的。

你可以关闭路由器的dhcp功能,路由器就当ap来使用,在树莓派上搭建一个dhcp服务,这里用的是isc-dhcp-server

apt-get直接安装

apt-get install isc-dhcp-server

编辑配置文件

vim /etc/dhcp/dhcpd.conf
subnet 10.0.0.0 netmask 255.255.255.0 {
  range 10.0.0.10 10.0.0.100;
  option domain-name-servers 180.76.76.76;
  option domain-name "qiananhua.com";
  option routers 10.0.0.2; #squid主机地址
#  option broadcast-address 10.0.0.255;
  default-lease-time 86400;
  max-lease-time 172800;
}
service isc-dhcp-server restart

断开wifi重新连接即可。

iptables

最后一步让经过squid服务器网卡的http 80端口流量用squid服务的3128端口处理

转发

iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

如果一切顺利此时打开 www.163.com 你看到的页面应该是这样的

未分类

awstats

安装比较简单如图所示

未分类

配置文件需要指定LogFile为squid日志文件地址

vim /etc/awstats/awstats.squid.conf
LogFile="/data/logs/squid/access.log"

手动生成下结果页面-dir=指定生成到nginx配置的虚拟主机根目录

/usr/local/awstats/tools/awstats_buildstaticpages.pl -update -config=squid -lang=cn -dir=/data/htdocs/awstats -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl

当然也可以吧这条命令放到.sh文件里添加到crontab自动执行,比如每30分钟执行一次统计

*/30 * * * * /data/shell/awstats.sh > /dev/null 2>&1

接着nginx添加一个awstats的虚拟主机

vim /usr/local/nginx/conf/vhosts/awstats.conf
server {
    listen 80;
    server_name awstats;
    access_log /data/logs/nginx/awstats.log;
    root /data/htdocs/awstats;
        index awstats.squid.html;

        location ~ ^/icon/{
                root /usr/local/awstats/wwwroot;
        }
}

注意本地修改下host,不出意外你会看到以下页面(最后一张图http状态吗410就是被过滤的广告链接了,占比还挺大)

未分类

未分类

未分类

CentOS7安装配置Squid http代理

其实之前配过一个squid,只是由于太懒,网上随便搜了一个教程,用了默认端口并且没有添加用户认证。某天不幸的被爬虫扫到,被用来发了半个月的垃圾邮件。。直到有一天登录邮箱,看到了一大坨警告邮件,才意识到问题的严重。惊了个呆之后,赶紧重配一遍-.-

我这里是用squid配置了一个带用户认证的普通代理。

安装

安装过程十分简便,只需要安装一下squid,一条命令搞定。我这里装的是squid3.3。

yum install squid

rpm -qa | grep squid
squid-3.3.8-12.el7_0.x86_64

配置

修改squid的配置文件 /etc/squid/squid.conf

主要就是配置一下端口,缓存,日志和访问规则。

http_port 3712
cache_mem 64 MB
maximum_object_size 4 MB
cache_dir ufs /var/spool/squid 100 16 256
access_log /var/log/squid/access.log
http_access allow all
visible_hostname squid.chao

初始化

在第一次启动之前或者修改了cache路径之后,需要重新初始化cache目录。

squid -z

启动

systemctl start squid

使用

  • 在浏览器中修改代理配置即可。

  • 在windows中:

    • Internet选项 -> 连接 -> 局域网连接 -> 代理服务器
  • 在macOSX中:
    • Safari -> 偏好设置 -> 代理 -> Web代理

然后输入你的代理地址和端口,就可以正常工作了。

测试

我从网上看到一个非常简单的方法,可以用来快速测试你的代理是否正常工作。首先打开百度,然后搜索ip。如果出来的是你代理的那台机器的ip,那么恭喜你,一大波垃圾邮件即将赶来。

添加用户认证

为了防止我们的代理被爬虫扫到并且被用于不法用途,我们非常有必要为我们的squid添加用户认证。事实上我刚配的代理,没过多久就已然被扫到。

我从我的access.log里面看到。然而此时我还没有添加任何认证机制,幸好我没使用认端口,不然我的邮箱又会收到一大坨告警邮件了。。

1439106533.703      0 89.102.9.196 TCP_DENIED/403 3739 GET http://www2.praguerentacar.com/proxy/detectproxy.php - HIER_NONE/- text/html
1439106539.302      0 89.102.9.196 TCP_DENIED/403 3724 GET http://www2.intimnosti.cz/proxy/detectproxy.php - HIER_NONE/- text/html
1439106544.881      0 89.102.9.196 TCP_DENIED/403 3706 GET http://93.185.96.50/proxy/detectproxy.php - HIER_NONE/- text/html
1439106550.453      0 89.102.9.196 TCP_DENIED/403 3712 GET http://www2.nuabi.com/proxy/detectproxy.php - HIER_NONE/- text/html

我们这里通过ncsa认证模块来为我们的squid添加认证。为什么我选择ncsa呢,因为我从网上搜到的大多用了这个方式。。

首先我们得配置我们的访问用户的账户信息。最后一个参数是用户名,可以替换成任何你喜欢的名字~

htpasswd -c /etc/squid/passwd chao

如果找不到htpasswd,就先装个Apache。yum install httpd。 然后就能使用htpasswd了。

有了帐户文件之后,我们重新配置我们的squid。在squid.conf里面,把

http_access allow all

改成

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm chao's squid server
auth_param basic credentialsttl 2 hours
acl myacl proxy_auth REQUIRED
http_access allow myacl
http_access deny all

最后重启squid就可以啦。

systemctl restart squid

现在当你使用代理访问页面的时候,会先弹出一个提示框,让你输入用户名密码。然后就可以继续访问了。

配置说明

有些人可能一开始对原理以及配置的详细介绍并不感冒,只是想让代理先跑起来再说。至少我本人就是这样子的。。所以,我把这块放在了最后。

现在,就开始介绍一下上面配置的具体内容。当然参考 官网(http://www.squid-cache.org/Doc/config/) 会更加详细准确。

http_port 3712 这个指定了我们代理的端口

cache_mem 64 MB 内存中的缓存大小

cache_dir ufs /var/spool/squid 100 16 256 缓存文件夹,默认是只在内存中进行缓存的。这里指定缓存大小为100M,第一层子目录为16个,第二层为256。

maximum_object_size 4 MB 最大被缓存文件大小,这个配合上面的cache_dir使用,只作用于缓存到磁盘的文件。

access_log /var/log/squid/access.log 访问日志

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd 指定认证程序以及账户文件

auth_param basic children 5 认证程序同时跑的个数

auth_param basic realm chao's squid server 客户端在使用代理时,输入密码时弹出来的提示框中的描述文字。

auth_param basic credentialsttl 2 hours 认证的持续时间

acl myacl proxy_auth REQUIRED 对myacl使用外部程序进行认证

http_access allow myacl 允许myacl中的成员访问

http_access deny all 拒绝所有其它访问

visible_hostname squid.chao 代理机名字

centos7安装配置squid正向代理

安装

yum install squid -y

配置

配置文件 /etc/squid/squid.conf

1. 无认证配置

cache_mem 64 MB                                                       缓存和日志设置
maximum_object_size 4 MB
cache_dir ufs /var/spool/squid 100 16 256
access_log /var/log/squid/access.log

2. 带用户认证的配置

  • 初始化

squid -z 进行初始化

系统管理

  • 启动squid
systemctl start squid.service
  • 开放防火墙端口

默认端口为3218

iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 3218 -j ACCEPT

默认只允许私有地址去使用,最有还有个拒绝所有,如下图所示:

系统管理

系统管理

可以添加所有地址:

acl localnet src 0.0.0.0/0.0.0.0

最后一句是拒绝其他不匹配的地址。

Ubuntu 12.04使用Squid创建HTTP代理

Squid是代理/缓存应用程序,拥有丰富的配置和用途的。 本文将介绍如何使用Squid建立HTTP代理。 请注意,您的原始IP地址会附加到请求头X-Forwarded-For,除非您按照指南最后一章节匿名流量的介绍,否则你的流量不会是匿名, 此外,流量没有加密,你的流量仍然存在被嗅探的可能性。

安装Squid

1.Squid可以从Ubuntu存储库中安装。 安装前请确保系统是最新的,然后再安装Squid,请运行以下命令:

  1. sudo apt-get update
  2. sudo apt-get upgrade
  3. sudo apt-get install squid

2.备份配置

  1. sudo cp /etc/squid3/squid.conf /etc/squid3/squid.conf.default

配置Squid为一个HTTP代理

Squid代理可以用作HTTP代理以绕过本地网络限制或隐藏您的真实IP。

基本配置

本节介绍配置Squid为HTTP代理的最简单方法,仅使用客户端IP地址进行身份验证。
1.编辑Squid配置文件并添加以下行:
/etc/squid3/squid.conf

  1. acl client src 12.34.56.78 # Home IP
  2.   http_access allow client

请把client替换为易于识别的名称。并将12.34.56.78替换为你的本机IP地址。 注释#Home IP不是必需的,但注释可用于帮助识别客户端。
2.一旦您保存并退出该文件,重新启动Squid:

  1. sudo service squid3 restart

3.此时,您可以配置本地浏览器或操作系统的网络设置,将你的服务器用作HTTP代理。 怎么配置取决于您选择的操作系统和浏览器。 对设置进行更改后,可以用浏览器打开一个网站来查看目前代理是否生效,例如ifconfig,what is my IP等网站。
4.可以通过向/etc/squid3/squid.conf中添加新的acl行来定义其他客户端。 通过将每个acl定义的名称添加到http_access allow行,可以授予对代理的访问权限。

高级身份验证

以下配置设置使用用户名和密码对Squid代理服务进行身份验证访问。
1.您可以使用htpasswd工具生成密码文件。 如果你的服务器安装了Apache,可能htpasswd已经存在。 否则运行:

  1. sudo apt-get install apache2-utils

2.创建一个文件来存储Squid用户和密码,然后更改所有权:

  1. sudo touch /etc/squid3/squid_passwd
  2. sudo chown proxy /etc/squid3/squid_passwd

3.创建用户名密码对:

  1. sudo htpasswd /etc/squid3/squid_passwd user1

将user1替换为你想要设置的用户名。 系统将提示您为此用户创建密码:

  1. New password:
  2. Re-type new password:
  3. Adding password for user user1

您可以重复此步骤来创建新用户。
4.编辑Squid配置文件并添加以下行:
/etc/squid3/squid.conf:

  1. auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/squid_passwd
  2.   acl ncsa_users proxy_auth REQUIRED
  3.   http_access allow ncsa_users

5.一旦您保存并退出该文件,重新启动Squid:

  1. sudo service squid3 restart

6.此时,您可以配置本地浏览器或操作系统的网络设置,将你的服务器用作HTTP代理。 连接代理时,您需要提供用户名和密码来做身份验证。 如何设置取决于您选择的操作系统和浏览器。 对设置进行更改后,可以用浏览器打开一个网站来查看目前代理是否生效,例如ifconfig,what is my IP等网站。
7.要删除一个用户的代理访问权限,必须删除squid passwd文件中的对应的行。 每行表示一个用户,格式为user:password hash:
/etc/squid3/squid_passwd

  1. user1:$p948w3nvq3489v6npq396g user2:$q3cn478554387cq34n57vn

如果使用Nano编辑,使用命令Control + k将删除光标所在的行。 一旦您保存并退出该文件,重新启动Squid:

  1. sudo service squid3 restart

配置为匿名代理

为了隐藏你的IP地址,您需要将以下行添加到Squid配置文件。

  1. forwarded_for off
  2.   request_header_access Allow allow all
  3.   request_header_access Authorization allow all
  4.   request_header_access WWW-Authenticate allow all
  5.   request_header_access Proxy-Authorization allow all
  6.   request_header_access Proxy-Authenticate allow all
  7.   request_header_access Cache-Control allow all
  8.   request_header_access Content-Encoding allow all
  9.   request_header_access Content-Length allow all
  10.   request_header_access Content-Type allow all
  11.   request_header_access Date allow all
  12.   request_header_access Expires allow all
  13.   request_header_access Host allow all
  14.   request_header_access If-Modified-Since allow all
  15.   request_header_access Last-Modified allow all
  16.   request_header_access Location allow all
  17.   request_header_access Pragma allow all
  18.   request_header_access Accept allow all
  19.   request_header_access Accept-Charset allow all
  20.   request_header_access Accept-Encoding allow all
  21.   request_header_access Accept-Language allow all
  22.   request_header_access Content-Language allow all
  23.   request_header_access Mime-Version allow all
  24.   request_header_access Retry-After allow all
  25.   request_header_access Title allow all
  26.   request_header_access Connection allow all
  27.   request_header_access Proxy-Connection allow all
  28.   request_header_access User-Agent allow all
  29.   request_header_access Cookie allow all
  30.   request_header_access All deny all

一旦您保存并退出该文件,重新启动Squid:

  1. sudo service squid3 restart

squid反向代理缓存安装配置

squid是优秀的代理服务器之一,发展历史相当悠久,功能也相当完善,许多大型网站都会用到squid作为web加速服务器。下面我们学习squid的反向代理缓存的使用。

架构环境说明

本实例的域名是 cache.webres.wang,通过DNS的轮询技术,将客户端的请求分发给其中一台 Squid 反向代理服务器处理,如果这台 Squid 缓存了用户的请求资源,则将请求的资源直接返回给用户,否则这台 Squid 将没有缓存的请求根据配置的规则发送给邻居 Squid 和后台的 WEB 服务器处理,这样既减轻后台 WEB 服务器的负载,又提高整个网站的性能和安全性。该系统结构图 如下:
FAQ
配置的系统环境:
一台 DNS 服务器:为域名cache.webres.wang添加两条A记录192.168.1.110和192.168.1.111。
两台Squid 服务器:
squid1:192.168.1.110
squid2:192.168.1.111
两台后端WEB 服务器:
webServer1:192.168.1.220
webServer2:192.168.1.221
dns的配置这里不作介绍,主要介绍squid的安装配置。

squid安装

  1. yum install gcc wget perl gcc-c++ make
  2. cd /tmp
  3. wget http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.19.tar.gz
  4. tar xzf squid-3.1.19.tar.gz
  5. cd squid-3.1.19
  6. ./configure
  7. make && make install
  8. groupadd squid
  9. useradd -g squid -s /sbin/nologin squid
  10. chown -R squid /usr/local/squid/var/logs/ /usr/local/squid/var/cache/

squid反向代理配置

配置 Squid1 服务器:

  1. vi /usr/local/squid/etc/squid.conf
  1. cache_effective_user squid
  2.  cache_effective_group squid
  3.  
  4.  ### 设定 squid 的主机名 , 如无此项 squid 将无法启动
  5.  visible_hostname squid1.webres.wang
  6.  
  7.  #### 配置 squid 为加速模式
  8.  http_port 80 accel vhost vport
  9.  icp_port 3130
  10.  
  11.  ### 配置 squid2 为其邻居,当 squid1 在其缓存中没有找到请求的资源时,通过 ICP 查询去其邻居中取得缓存
  12.  cache_peer squid2.webres.wang sibling 80 3130
  13.  
  14.  ### squid1 的两个父节点,originserver 参数指明是源服务器, round-robin  参数指明 squid 通过轮询方式将请求分发到其中一台父节点; squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了,那么 squid 会从剩余的 origin 服务器中抓取数据,round-robin表示使用通过 RR 轮询方式转发到两个父节点中的一个
  15.  cache_peer 192.168.1.220 parent 8080 0 no-query originserver round-robin  name=webServer1
  16.  cache_peer 192.168.1.221 parent 8080 0 no-query originserver round-robin  name=webServer2
  17.  
  18.  ###允许webServer1 webServer2  cache.webres.wang的请求
  19.  cache_peer_domain webServer1 webServer2  cache.webres.wang
  20.  
  21.  ####下面是一些访问控制、日志和缓存目录的设置
  22.  acl localnet src 192.168.1.110 192.168.1.111
  23.  http_access allow all
  24.  icp_access allow localnet
  25.  cache_log /usr/local/squid/var/logs/cache.log
  26.  access_log /usr/local/squid/var/logs/access.log squid
  27.  cache_dir ufs /usr/local/squid/var/cache/ 1000 16 256
  28.  
  29.  ### 对 squid 的一些优化
  30.  maximum_object_size 10240 KB  ### 能缓存的最大对象为 10M
  31.  maximum_object_size_in_memory 512 KB ### 内存中缓存的最大对象 512K
  32.  cache_mem 256 MB  ###squid 用于缓存的内存量

在/etc/hosts添加:

  1. squid1.webres.wang:192.168.1.110
  2. squid2.webres.wang:192.168.1.111

squid2的配置完全一样,除了需要更改visible_hostname。

启动squid

检查 squid 配置文件正确与否:

  1. /usr/local/squid/sbin/squid –Nk parse

生成缓存目录:

  1. /usr/local/squid/sbin/squid –N -z

启动squid:

  1. /usr/local/squid/sbin/squid

参考:http://www.ibm.com/developerworks/cn/linux/l-cn-squid/