squid是比较知名的代理软件,它不仅可以跑在Linux上还可以跑在Windows和UNIX上,它的技术已经非常成熟。目前使用squid的用户也十分广泛。squid与Linux下其他的代理软件如Apache、socks、TIS FWTK等相比,下载安装简单,配置简单灵活,支持缓存和多种协议。
squid之所以用的很多,是因为它的的缓存功能,squid的缓存不仅可以节省宝贵的带宽资源,也可以大大降低服务器的I/O。从经济角度考虑,它是很多网站架构中不可或缺的角色。
squid可以做正向代理,也可以做反向代理。当做正向代理时,squid后面是客户端,客户端想上网需经过squid。当一个客户端想要请求一个主页时,它向squid发出一个申请,要squid替它请求,然后squid连接用户要请求的网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户请求同样的页面时,squid将保存的页面立即传给用户,使用户觉得速度相当快。使用正向代理时,客户端需要做一些设置才能实现,也就是平时我们在IE选项中设置的那个代理。而反向代理是,squid后面是某个站点的服务器,客户端请求该站点时,会先把请求发送到squid上,然后squid去处理用户的请求动作。正向代理如下图所示:
反向代理如下图所示:
正向代理后面是客户端,客户端上网要通过squid上。反向代理squid后面是服务器,服务器返回给用户的数据需要走squid。正向代理用在企业的办公环境中,员工上网需要通过squid代理来上网,这样可以节省网络带宽资源。而反向代理用来搭建网站静态项(图片、HTML、流媒体、JS、CSS等)的缓存服务器,它用于网站架构中。
squid正向代理:
使用centos源中自带的squid包安装:
[[email protected] ~]# yum install -y squid
编辑squid配置文件:
[[email protected] ~]# vim /etc/squid/squid.conf
打开注释行:
cache_dir ufs /var/spool/squid 100 16 256
说明:缓存目录为/var/spool/squid,缓存大小为100MB,该目录下有16个一级子目录,每个子目录下又有256个二级子目录。
并在其下面增加一行:
cache_mem 64 MB
注意:大小不能超过上面的总大小100MB
在最后面添加要缓存的静态项:
refresh_pattern \.(jpg|png|gif|js|css|mp3|mp4) 1440 20% 2880 ignore-reload
最后面添加代理服务器要显示的主机名:
visible_hostname test.com
启动squid:
[[email protected] ~]# /etc/init.d/squid start
init_cache_dir /var/spool/squid... 正在启动 squid:. [确定]
查看进程和端口(默认3128):
[[email protected] ~]# ps aux | grep squid
root 1738 0.0 0.1 15216 2688 ? Ss 05:11 0:00 squid -f /etc/squid/squid.conf
squid 1740 0.1 0.4 17816 9072 ? S 05:11 0:00 (squid) -f /etc/squid/squid.conf
squid 1742 0.0 0.0 3272 888 ? S 05:11 0:00 (unlinkd)
root 1745 0.0 0.0 5980 744 pts/0 S+ 05:12 0:00 grep squid
[[email protected] ~]# netstat -lnp | grep squid
tcp 0 0 :::3128 :::* LISTEN 1740/(squid)
udp 0 0 0.0.0.0:40410 0.0.0.0:* 1740/(squid)
udp 0 0 :::37508 :::* 1740/(squid)
使用浏览器测试:
在浏览器中设置使用该代理:工具——Internet选项——连接——局域网设置——勾选“为LAN使用代理服务器”——高级——HTTP:192.168.147.139:3128——确定——确定——确定
使用浏览器访问www.baidu.com,可见能成功访问到百度。为了验证走的是我们的代理服务器,我们可以使用tcpdump工具抓个包看看
安装tcpdump抓包工具:
[[email protected] ~]# yum install -y tcpdump
此时,访问百度就可以看到抓到很多包,说明确实走的是我们的代理服务器。
同时在缓存目录下产生了很多文件:
使用curl测试:
[[email protected] ~]# curl -x127.0.0.1:3128 www.baidu.com -I
HTTP/1.0 200 OK
Server: bfe/1.0.8.18
Date: Fri, 10 Mar 2017 13:25:23 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:02 GMT
ETag: "575e1f5a-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes
X-Cache: MISS from test.com
X-Cache-Lookup: MISS from test.com:3128
Via: 1.0 test.com (squid/3.1.23)
Connection: keep-alive
[[email protected] ~]# curl -x127.0.0.1:3128 www.qq.com -I
HTTP/1.0 200 OK
Server: squid/3.5.20
Date: Fri, 10 Mar 2017 13:26:13 GMT
Content-Type: text/html; charset=GB2312
Vary: Accept-Encoding
Vary: Accept-Encoding
Expires: Fri, 10 Mar 2017 13:27:13 GMT
Cache-Control: max-age=60
Vary: Accept-Encoding
Vary: Accept-Encoding
X-Cache: HIT from shanghai.qq.com
X-Cache: MISS from test.com
X-Cache-Lookup: MISS from test.com:3128
Via: 1.0 test.com (squid/3.1.23)
Connection: keep-alive
3128端口是可以改变的:只需要修改配置文件中的http_port 3128即可。
此时的代理是任何人都可以访问任何网站,并没有对访问进行控制,我们需要编辑配置文件进行访问限制,比如只允许员工访问.aminglinux.com和.baidu.com:
编辑配置文件:
[[email protected] ~]# vim /etc/squid/squid.conf
添加如下白名单good_domain配置(也可以设置黑名单bad_domain):
acl http proto HTTP
acl good_domain dstdomain .aminglinux.com .baidu.com
http_access allow good_domain
http_access deny !good_domain
检查配置是否有错:
[[email protected] ~]# squid -kcheck (或者squid -kch)
重新加载配置文件:
[[email protected] ~]# squid -kreconfig (或者squid -kre)
使用curl测试:
[[email protected] ~]# curl -x127.0.0.1:3128 www.baidu.com -I
HTTP/1.0 200 OK
Server: bfe/1.0.8.18
Date: Fri, 10 Mar 2017 13:43:57 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:06 GMT
ETag: "575e1f5e-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes
X-Cache: MISS from test.com
X-Cache-Lookup: MISS from test.com:3128
Via: 1.0 test.com (squid/3.1.23)
Connection: keep-alive
[[email protected] ~]# curl -x127.0.0.1:3128 www.aminglinux.com -I
HTTP/1.0 301 Moved Permanently
Server: nginx
Date: Fri, 10 Mar 2017 13:45:01 GMT
Content-Type: text/html
Content-Length: 178
Location: http://www.apelearn.com/
X-Cache: MISS from test.com
X-Cache-Lookup: MISS from test.com:3128
Via: 1.0 test.com (squid/3.1.23)
Connection: keep-alive
[[email protected] ~]# curl -x127.0.0.1:3128 www.qq.com -I
HTTP/1.0 403 Forbidden
Server: squid/3.1.23
Mime-Version: 1.0
Date: Fri, 10 Mar 2017 21:45:32 GMT
Content-Type: text/html
Content-Length: 3241
X-Squid-Error: ERR_ACCESS_DENIED 0
Vary: Accept-Language
Content-Language: en
X-Cache: MISS from test.com
X-Cache-Lookup: NONE from test.com:3128
Via: 1.0 test.com (squid/3.1.23)
Connection: keep-alive
squid反向代理:
做百度和qq的反向代理:
百度的IP:31.135.169.125,端口:80,域名:www.baidu.com
qq的IP:61.135.157.156,端口:80,域名:www.qq.com
编辑配置文件:
[[email protected] ~]# vim /etc/squid/squid.conf
将http_port 3128修改为下面的内容:
http_port 80 accel vhost vport
cache_peer 61.135.169.125 parent 80 0 originserver name=a
cache_peer_domain a www.baidu.com
cache_peer 61.135.157.156 parent 80 0 originserver name=b
cache_peer_domain b www.qq.com
每当增加一个域名的反向代理需要增加两行。注意name不能相同。
为了测试的方便,我们将上面做的正向代理先注释掉:
#acl http proto HTTP
#acl good_domain dstdomain .aminglinux.com .baidu.com
#http_access allow good_domain
#http_access deny !good_domain
检查配置无误后重新加载配置:
[[email protected] ~]# squid -kcheck
[[email protected] ~]# squid -kreconfig
使用curl测试:
做反向代理的域名OK:
[[email protected] ~]# curl -x127.0.0.1:80 www.baidu.com -I
HTTP/1.0 200 OK
Server: bfe/1.0.8.18
Date: Fri, 10 Mar 2017 14:05:41 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:01 GMT
ETag: "575e1f59-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes
X-Cache: MISS from test.com
X-Cache-Lookup: MISS from test.com:80
Via: 1.0 test.com (squid/3.1.23)
Connection: keep-alive
[[email protected] ~]# curl -x127.0.0.1:80 www.qq.com -I
HTTP/1.0 200 OK
Server: squid/3.5.20
Date: Fri, 10 Mar 2017 14:06:10 GMT
Content-Type: text/html; charset=GB2312
Vary: Accept-Encoding
Vary: Accept-Encoding
Expires: Fri, 10 Mar 2017 14:07:10 GMT
Cache-Control: max-age=60
Vary: Accept-Encoding
Vary: Accept-Encoding
X-Cache: HIT from tianjin.qq.com
X-Cache: MISS from test.com
X-Cache-Lookup: MISS from test.com:80
Via: 1.0 test.com (squid/3.1.23)
Connection: keep-alive
没有做反向代理的域名不可达:
[[email protected] ~]# curl -x127.0.0.1:80 www.aminglinux.com -I
HTTP/1.0 503 Service Unavailable
Server: squid/3.1.23
Mime-Version: 1.0
Date: Fri, 10 Mar 2017 22:06:45 GMT
Content-Type: text/html
Content-Length: 3588
X-Squid-Error: ERR_CANNOT_FORWARD 0
Vary: Accept-Language
Content-Language: en
X-Cache: MISS from test.com
X-Cache-Lookup: MISS from test.com:80
Via: 1.0 test.com (squid/3.1.23)
Connection: keep-alive
使用浏览器测试:
首先删除浏览器中之前的正向代理配置,然后在本地主机的hosts文件(路径为C:\Windows\System32\drivers\etc\hosts)中添加测试的域名(让这些域名走我们的反向代理服务器):
192.168.147.139 www.baidu.com www.qq.com www.sina.com www.aminglinux.com
没有做反向代理的域名不可达: