Squid缓存代理服务器
一、Squid相关概述
- Squid: Linux 系统中一款最常用的
开源的代理服务软件
,提供缓存代理功能
- 工作原理: 当客户机通过代理去访问各种服务时,代理服务器会先检查自己的缓存,缓存中有结果,直接返回,如果缓存中没有用户需要的信息时,代理服务器会转给Internet(互联网),获取用户需要的信息,保存到缓存中,并且返回给用户,用户再次访问相同信息时,会直接调取服务器中的缓存信息从而提高访问速度
- web代理的工作机制: 缓存网页对象,减少重复请求,提高访问速度
- 代理缓存加速的对象: 文字、图像等静态的web元素
- 优势: 提高web访问速度,隐藏客户机的ip地址,还可以针对访问目标、时间等进行访问控制
(过滤机制)
- 代理的类型:
(1)传统代理: 需要在客户端去指定代理服务器(一般用于Internet环境)
(2)透明代理: 不需要指定代理服务器的地址和端口(一般用于局域网环境,无需额外设置即可实现上网,squid服务器充当网关)
二、构建Squid代理服务器
(1)安装
******上传源码包,配置、编译并安装(时间较长)
[root@Squid ~]# ll
总用量 4728
-rw-------. 1 root root 1263 10月 8 17:22 anaconda-ks.cfg
-rw-r--r-- 1 root root 4835525 12月 24 17:36 squid-3.5.23.tar.gz
[root@Squid ~]# tar zxvf squid-3.5.23.tar.gz
[root@Squid squid-3.5.23]# ./configure --prefix=/usr/local/squid --sysconfdir=/etc --enable-linux-netfilter --enable-async-io=240 --enable-default-err-langugae=Simplify_Chinese --disable-poll --enable-epoll --enable-gnuregex && make && make install
******优化执行路径
[root@Squid squid-3.5.23]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
******创建Squid程序运行账户和组(不创建宿组目录,并且是程序用户无法登录系统)
[root@Squid squid-3.5.23]# useradd -M -s /sbin/nologin squid
******设置Squid服务目录下的属主和属组
[root@Squid squid-3.5.23]# chown -R squid:squid /usr/local/squid/var/
******修改squid配置文件(/etc/squid.conf)
[root@Squid squid-3.5.23]# vim /etc/squid.conf
1 #
2 # Recommended minimum configuration:
3 #
4 cache_effective_user squid (添加,指定squid 的程序用户,用来设置初始化、运行时缓存的账户)
5 cache_effective_group squid (添加,指定squid 的程序组,用来设置初始化、运行时缓存的组账户)
6 # Example rule allowing access from your local networks.
7 # Adapt to list your (internal) IP networks from where browsing
8 # should be allowed
。。。。。。
(2)squid的运行控制
******检查配置文件语法是否正确
[root@Squid squid-3.5.23]# squid -k parse
******启动,停止Squid服务 (第一次启动时,会自动初始化缓存目录)
[root@Squid squid-3.5.23]# squid -z (初始化缓存目录)
[root@Squid squid-3.5.23]# squid (启动squid服务)
[root@Squid squid-3.5.23]# netstat -anpt | grep squid (监听端口,发现已经成功启动)
tcp6 0 0 :::3128 :::* LISTEN 43547/(squid-1)
******为了方便对squid 服务的启动、停止、重新加载更加方便,需要编写squid 服务脚本
(使用chkconfig 和 systemctl 工具进行管理)
[root@Squid squid-3.5.23]# vim /etc/init.d/squid (编写脚本)
写入:
#!/bin/bash
# chkconfig: 35 90 25
# config: /etc/squid.conf
# pidfile: /usr/local/squid/var/run/squid.pid
# Description: Squid - Internet Object Cache.
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -anpt|grep squid &> /dev/null
if [ $? -eq 0 ];then
echo "squid服务已经开启"
else
echo "squid服务正在开启"
$CMD
stop)
$CMD -k kill &> /dev/null
rm -f $PID &> /dev/null
echo "squid服务已经关闭"
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ];then
netstat -anpt |grep squid
else
echo "squid服务没有开启"
fi
;;
restart)
$0 stop &> /dev/null
echo "stoping squid"
$0 start &> /dev/null
echo "squid已经重新启动"
;;
reload)
$CMD -k reconfigure
;;
check)
$CMD -k parse
;;
*)
echo "当前脚本 $0 后面只能写{start|stop|restart|reload|check|status}"
esac
46,1
保存退出
[root@Squid squid-3.5.23]# chmod +x /etc/init.d/squid (给脚本添加可执行权限)
[root@Squid squid-3.5.23]# chkconfig --add squid (添加squid为系统服务,这个命令每次重新启动服务器后可能会失效,重新添加一下就好了)
******现在已经可以使用systemctl来管理squid服务了
[root@Squid ~]# systemctl start squid
[root@Squid ~]# netstat -anpt | grep squid
tcp6 0 0 :::3128 :::* LISTEN 955/(squid-1)
(一)构建Squid的传统代理
名称 | 扮演角色 | ip地址 |
---|---|---|
Squid | 代理服务器 | 192.168.100.11 |
Web | web服务器 | 192.168.100.12 |
win7 | 普通客户机 | 192.168.100.13 |
要求: 在Squid构建代理服务,来隐藏客户机的访问ip地址,禁止通过代理去下载超过10MB的文件
(1)Squid代理服务器的配置
******修改squid.conf配置文件(前提是已经安装了squid服务)
[root@Squid ~]# vim /etc/squid.conf
。。。。。。
52 # from where browsing should be allowed
53 http_access allow localnet
54 http_access allow localhost
55 http_access allow all (添加,允许任意客户机使用代理服务,在“http_access deny all”之前就行)
56
57 # And finally deny all other access to this proxy
58 http_access deny all
59 reply_body_max_size 10 MB (添加,允许下载的最大文件为10MB)
60 # Squid normally listens to port 3128
61 http_port 3128
。。。。。。
保存退出
******重启squid服务
[root@Squid ~]# systemctl restart squid
至此传统代理的squid服务器配置完成
(2)Web服务器的配置
******安装httpd服务并且写入页面即可
[root@Web ~]# mount /dev/cdrom /media/cdrom/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@Web ~]# yum -y install httpd
。。。。。。
完毕!
[root@Web ~]# echo "123.com" > /var/www/html/index.html
[root@Web ~]# systemctl start httpd
[root@Web ~]# curl 127.0.0.1
123.com
(3)Win7的配置
- 打开Win7的“运行”,输入“inetcpl.cpl”
- 弹出一个“internet属性”的窗口,点击“连接”,点击“局域网设置”
- 弹出“局域网(LAN)设置”的窗口,把“为LAN使用代理服务器(这些设置不用于拨号或VPN连接)”的选项勾选,填写地址为Suid代理服务器的地址,端口为3128
(默认端口就是3128,可以在/etc/squid.conf进行修改)
,点击“确定”
- 打开浏览器访问Web服务器(192.168.100.12)
(4)验证代理是否成功
******在squid服务器上查看日志
[root@Squid sbin]# tail -3 /usr/local/squid/var/logs/access.log (发现都是192.168.100.13也就是win7在访问)
1608806412.148 28960 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
1608806412.148 28960 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
1608806412.148 34477 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
******在web服务器上访问日志
[root@Web ~]# tail /var/log/httpd/access_log (发现都是192.168.100.11,也就是squid代理服务器在访问)
127.0.0.1 - - [24/Dec/2020:18:25:29 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
192.168.100.11 - - [24/Dec/2020:18:36:20 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
192.168.100.11 - - [24/Dec/2020:18:39:36 +0800] "GET / HTTP/1.1" 200 8 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
192.168.100.11 - - [24/Dec/2020:18:39:37 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
至此,squid传统代理搭建成功!!!!隐藏了win7的地址
(二)透明代理
名称 | 扮演角色 | ip地址 |
---|---|---|
Squid | 代理服务器 | 192.168.100.11/200.0.0.1 |
Web | web服务器 | 200.0.0.2 |
Win7 | 普通客户端 | 192.168.100.13 |
要求: 实现透明代理,squid代理服务器充当客户端的网关,隐藏客户端访问web的地址
(这里的squid服务器要添加网卡VM2,web服务器换成VM2网卡并修改地址)
(1)Squid代理服务器的配置
(在上面传统代理的基础上配置)
******添加一块新的网卡VM2,并且配置ip地址
[root@Squid ~]# cd /etc/sysconfig/network-scripts/
[root@Squid network-scripts]# cp ifcfg-ens33 ifcfg-ens37
(要先ip a,看一下添加的网卡名叫什么,然后把原来的网卡名复制一份到新的网卡名)
[root@Squid network-scripts]# vim ifcfg-ens37 (编写的网卡)
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=9d46d645-9072-4138-9eca-f2f2709d4cba
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.11
PREFIX=24
IPV6_PRIVACY=no
修改为:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=200.0.0.1
PREFIX=24
IPV6_PRIVACY=no
保存退出
[root@Squid network-scripts]# systemctl restart network (重启网卡)
[root@Squid network-scripts]# ip a (再次查看,发现成功添加地址)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:d8:4c:da brd ff:ff:ff:ff:ff:ff
inet 192.168.100.11/24 brd 192.168.100.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::abff:f1ab:2782:8087/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:d8:4c:e4 brd ff:ff:ff:ff:ff:ff
inet 200.0.0.1/24 brd 200.0.0.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::a8fc:44a7:d5f6:8e44/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@Squid network-scripts]# cd
******编写Squid主配置文件
[root@Squid ~]# vim /etc/squid.conf
。。。。。。
57 http_access deny all
58
59 reply_body_max_size 10 MB
60 # Squid normally listens to port 3128
61 http_port 192.168.100.11:3128 transparent
62 63 # Uncomment and adjust the following to add a disk cache direc tory.
。。。。。。
保存退出
[root@Squid ~]# systemctl restart squid (重启squid服务)
******在squid服务器上开启路由转发功能 (因为squid服务器要当作win7的网关)
[root@Squid ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@Squid ~]# sysctl -p
net.ipv4.ip_forward = 1
******开启防火墙并设置重定向策略
[root@Squid ~]# systemctl start firewalld
[root@Squid ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@Squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
(2)Web服务器配置
[root@Web ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=ce896eb0-2544-440a-a54d-f8633b2e9496
DEVICE=ens33
ONBOOT=yes
IPADDR=200.0.0.2
PREFIX=24
IPV6_PRIVACY=no
[root@Web ~]# systemctl restart network (重启网卡)
[root@Web ~]# ip a (查看地址发现已经成功更改)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:46:da:b9 brd ff:ff:ff:ff:ff:ff
inet 200.0.0.2/24 brd 200.0.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::ea8f:4112:94bb:75f7/64 scope link noprefixroute
valid_lft forever preferred_lft forever
(3)Win7的配置
- 配置网关为Squid服务器(192.168.100.11)
- 打开运行输入“inetcpl.cpl”
- “连接”——“局域网设置”
- 把“代理服务器”的选项勾掉,点击确认即可
- 使用浏览器访问web服务器(200.0.0.2)
(4)验证透明代理
******Squid服务器验证(发现有win7主机的访问记录)
[root@Squid ~]# tail -3 /usr/local/squid/var/logs/access.log
1608806412.148 34477 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
1608824055.115 335 192.168.100.13 TCP_MISS/200 328 GET http://200.0.0.2/ - ORIGINAL_DST/200.0.0.2 text/html
1608824055.157 0 192.168.100.13 TCP_MISS/404 450 GET http://200.0.0.2/favicon.ico - ORIGINAL_DST/200.0.0.2 text/html
******web服务器验证 (发现都是squid服务器的第二块网卡的200.0.0.1在访问)
[root@Web ~]# tail -3 /var/log/httpd/access_log
200.0.0.1 - - [24/Dec/2020:23:33:44 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
200.0.0.1 - - [24/Dec/2020:23:34:13 +0800] "GET / HTTP/1.1" 200 8 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
200.0.0.1 - - [24/Dec/2020:23:34:13 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
至此透明代理构建成功!!!!