使用 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、正向代理 标签。将固定链接加入收藏夹