Squid 搭建正向代理详细解释



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#################################
###   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 /tc/squid/htpasswd william

这里密码最好放在/etc/squid/目录下,不然很容易有权限问题,导致squid启动失败。
htpasswd
注:这里的htpasswd命令是apache服务器自带的。你执行下面的名利安装apache:

1
yum  install httpd

推荐配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#################################
###   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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#################################
###   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 /tc/squid/htpasswd william

这里密码最好放在/etc/squid/目录下,不然很容易有权限问题,导致squid启动失败。
htpasswd
注:这里的htpasswd命令是apache服务器自带的。你执行下面的名利安装apache:

1
yum  install httpd

推荐配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#################################
###   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)

你可能感兴趣的:(服务器)