使用 Squid 搭建正向代理

使用 Squid 搭建正向代理

发表于 2013 年 9 月 9 日 

出自:http://www.williamsang.com/archives/1645.html

本文的目的是让你能搭建起Squid正向代理,可以使用自己的代理服务器上网,如果服务器在国外那么科学上网也很容易哈,当然也讲解了一些细节,方便自我进行简单修改和排错。


关于代理的相关知识可以参考:图解正向代理、反向代理、透明代理

最快的搭建方式为:


执行yum install squid

复制最下面的配置文件覆盖默认配置文件squid.conf

生成密码文件(见下图)

启动squid:service squid start

本文结构:


安装squid和相关文件介绍

默认配置详解

推荐配置

安装squid和相关文件介绍


1

# yum install squid

本机环境CentOS 6.3,squid版本 3.1.10


默认配置文件介绍


如下是默认配置文件squid.conf,添加了中文注释和调整了下格式。


#################################

###   acl和http_pass访问控制   ###

#################################

acl manager proto cache_object

acl localhost src 127.0.0.1/32 ::1

acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

 

# 以下定义了局域网地址localnet(需要了解一些网络里面的私有地址概念)

acl localnet src 10.0.0.0/8

acl localnet src 172.16.0.0/12

acl localnet src 192.168.0.0/16

acl localnet src fc00::/7

acl localnet src fe80::/10

 

# 定义SSL_ports为443

acl SSL_ports port 443

 

# 定义了Safe_ports所代表的端口

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

 

# 定义CONNECT代表http里的CONNECT请求方法

acl CONNECT method CONNECT

 

# 允许本机管理缓存

http_access allow manager localhost

# 拒绝其他地址管理缓存

http_access deny manager

 

# 拒绝不安全端口请求

http_access deny !Safe_ports

 

# 不允许连接非安全SSL_ports端口

http_access deny CONNECT !SSL_ports

 

# 拒绝连接到本地服务器提供的服务

# (用于保护本机一些只有本机用户才能访问的服务)

# http_access deny to_localhost

 

# 允许局域网用户的请求

http_access allow localnet

# 允许本机用户的请求

http_access allow localhost

 

# 拒绝其他所有请求

http_access deny all

 

#################################

###   squid 服务器基本配置      ###

#################################

 

# Squid的监听端口

http_port 3128

 

#################################

###   squid 缓存配置           ###

#################################

 

# 出现cgi-bin或者?的URL不予缓存

hierarchy_stoplist cgi-bin ?

 

# 磁盘缓存目录

#cache_dir ufs /var/spool/squid 100 16 256

 

# squid挂掉后,临终遗言要放到哪里

coredump_dir /var/spool/squid

 

# 刷新缓存规则

refresh_pattern ^ftp:       1440    20% 10080

refresh_pattern ^gopher:    1440    0%  1440

refresh_pattern -i (/cgi-bin/|\?) 0 0%  0

refresh_pattern .       0   20% 4320

明显看出,我把配置文件分成了三部分:


acl结合http_access实现访问控制

squid服务器自身配置

缓存相关配置

acl结合http_access实现访问控制


acl控制格式:

acl 列表名称 列表类型 列表值1 列表值2 ...

列表名称:自己定义的,用于下面进行权限控制(allow/deny)。

列表类型:


proto:指明URL访问/传输协议。如:http、https、ftp、gopher、urn、whois、cache_object。

src:指明IP地址。

dst:指明最终服务器IP。

port:单独定义端口/端口范围。

method:指http的请求方法。包括GET、POST、PUT、HEAD、CONNECT等。

http_access deny/allow acl列表名称

这里需要注意的是:http_access按照定义的顺序来过滤请求的,只要前面被allow/deny了下面就不再判断了。


举个例子:

acl manager proto cache_object

http_access allow manager localhost

http_access deny manager


第一句指明manager为缓存管理,后面限定只能本机进行缓存管理。


squid服务器自身配置


http_port 3128

设置squid监听端口,可以自己更换,客户端链接的时候需要指定这个端口。


缓存配置:


cache_dir ufs /var/spool/squid 100 16 256

这里设置磁盘缓存的目录以及空间大小,目录结构等,格式为:

cache_dir schema directory size L1 L2 [option]


schema:默认为ufs,是一种存储机制,一般不修改。

directory:指定磁盘缓存存放目录。

size:指定cache目录的大小,单位M。

L1 L2:一级目录数量和二级目录数量。默认为16 256不需要更改。

[option]:可以指定只读和最大文件大小。(一般不用设置)

coredump_dir /var/spool/squid

squid挂掉后,临终遗言要放到哪里,一般也不需要处理


hierarchy_stoplist

后跟着字符串列表,请求的URL里面包含字符串列表里的任何一个字符就不予缓存。

hierarchy_stoplist cgi-bin ?

上述语句表示:任何包含?或cgi-bin字符串的请求的URL不予缓存直接把最终服务器结果返回给用户。


refresh_pattern

使用正则表达式来确定资源过期时间。

refresh_pattern <最小时间> <百分比> <最大时间>


如何判断过期?


如下是squid的refresh_pattern算法的简单描述:

假如响应年龄超过refresh_pattern的max值,该响应过期;

假如LM-factor少于refresh_pattern百分比值,该响应存活;

假如响应年龄少于refresh_pattern的min值,该响应存活;

其他情况下,响应过期。


LM-factor算法:

resource age =对象进入cache的时间-对象的last_modified

response age =当前时间-对象进入cache的时间

LM-factor=(response age)/(resource age)


这里多介绍点额外选项:

设定DNS服务器


dns_nameserers 8.8.8.8

日志记录


默认都在/var/log/squid目录下,默认安装时候就配置好了日志轮转,查看/etc/logrotate.d/squid 如果自己更改日志存放位置,最好重新配置自动轮转,关于logrotate参看:logrotate使用:


cache_log /var/log/cache.log:包括状态性和调试性消息。如果启动失败、报错,可以查看本文件。

cache_access_log /var/log/access.log:记录每个终端请求日志,可以设定为/dev/null 不记录日志。

cache_store_log /var/log/store.log:对大多数cache管理员来说很有用。包含了进入和离开缓存的每个目标的记录。

启动squid PID 的用户和群组,默认都为squid


cache_effective_user squid

cache_effective_group squid

内存缓冲大小:设定额外提供多少内存给squid使用。

cache_mem 20M


总内存占用计算方法


squid自身进程占用(10~20M)+ Cache目录放在内存的索引(500M目录大约20M索引)+cache_mem

官方建议可用内存大小要是这里计算量的两倍以上。因此这里的cache_mem不能设置太大。当然内存充足的话,越大越好。


Cache目录放在内存的索引(500M目录大约20M索引)这里其实是估算,没法准确计算,一般64位系统中,每个缓存索引占用112字节内存。这样如果一个缓存文件大小在1K到20K之间则,大概内存花费为:50M~3M之间。其实通过查看/var/spool/squid 目录下的缓存文件大小你可以发现基本都是几K的偏多。所以取20M还是比较合理的。


密码登录

一般我们使用代理都是有密码的,不然谁都可以用,服务器还不得挂掉,怎么在squid中是用密码验证呢?


先设定验证相关的验证参数:

# 密码存储路径,设定通过ncsa_auth程序来读取

auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/htpasswd

auth_param basic children 5

# 设定通过验证时,呈现给用户的欢迎信息,可以不写

auth_param basic realm “Welcome to proxy web server”

# 验证一次,可以持续访问多长时间

auth_param basic credentialsttl 12 hours

auth_param basic casesensitive off


# 设定acl密码用户

acl squid_user proxy_auth REQUIRED

# 允许密码用户登录

http_access allow squid_user


生成用户名密码文件,这里使用william作为用户名,test1234作为密码,见下图:

touch /etc/squid/htpasswd

htpasswd /etc/squid/htpasswd william


这里密码最好放在/etc/squid/目录下,不然很容易有权限问题,导致squid启动失败。

htpasswd

注:这里的htpasswd命令是apache服务器自带的。你执行下面的名利安装apache:


1

yum install httpd

推荐配置文件:

#################################

###   acl和http_pass访问控制   ###

#################################

 

# 密码存储路径,设定通过ncsa_auth程序来读取

auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/htpasswd

# 制定认证程序的进程数

auth_param basic children 5

# 设定通过验证时,呈现给用户的欢迎信息

auth_param basic realm "Welcome to proxy web server"

# 验证一次,可以持续访问多长时间

auth_param basic credentialsttl 12 hours

 

acl manager proto cache_object

acl localhost src 127.0.0.1/32 ::1

acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

 

# 定义SSL_ports为443

acl SSL_ports port 443

 

# 定义了Safe_ports所代表的端口

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

 

# 定义CONNECT代表http里的CONNECT请求方法

acl CONNECT method CONNECT

 

# 允许本机管理缓存

http_access allow manager localhost

# 拒绝其他地址管理缓存

http_access deny manager

 

# 拒绝不安全端口请求

http_access deny !Safe_ports

 

# 不允许连接非安全SSL_ports端口

http_access deny CONNECT !SSL_ports

 

# 拒绝连接到本地服务器提供的服务

# (用于保护本机一些只有本机用户才能访问的服务)

http_access deny to_localhost

 

# 允许本机用户的请求

http_access allow localhost

 

# 拒绝其他所有请求

http_access deny all

 

#################################

###   squid 服务器基本配置      ###

#################################

 

# Squid的监听端口

http_port 3128

 

# DNS 域名服务器配置

dns_nameservers 8.8.8.8

 

#################################

###   squid 缓存配置           ###

#################################

 

# 出现cgi-bin或者?的URL不予缓存

hierarchy_stoplist cgi-bin ?

 

# 磁盘缓存目录

cache_dir ufs /var/spool/squid 500 16 256

 

# 内存缓冲大小

cache_mem 20M

 

# squid挂掉后,临终遗言要放到哪里

coredump_dir /var/spool/squid

 

# 刷新缓存规则

refresh_pattern ^ftp:       1440    20% 10080

refresh_pattern ^gopher:    1440    0%  1440

refresh_pattern -i (/cgi-bin/|\?) 0 0%  0

refresh_pattern .       0   20% 4320

下面你可以使用如下命令来启动squid服务。


1

# service squid start

以上配置说明:


自己在外购买的服务器当作代理服务器,就没有必要让和代理服务器处于同一局域网的其他主机访问。所以去掉了localnet的相关配置。

主机空闲内存至少大于 20 + 20 + 20 =60M内存(查看上述内存计算方法)。最好空闲内存在120M以上。(当然你可以调小cache_dir和cache_mem)

参考资料:


《鸟个的LINUX私房菜-服务器架设篇》

此条目由 sang.williams 发表在 Linux 分类目录,并贴了 configuration、proxy、squid、正向代理 标签。将固定链接加入收藏夹


你可能感兴趣的:(squid)