一.Squid概述
- Squid是一个高性能的代理缓存internet数据的软件,Squid通过接受人们需要下载的目标(object)的请求并且适当地处理这些请求。即如果一个人想要下载一些web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器,并向这个页面发出请求。然后,squid显式地聚集数据到客户端,而且同时复制一份,当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据就会迅速的传输到客户机上。当前的Squid可以处理HTTP、FTP、SSL、WAIS等协议,但是不能处理POP、NNTP、RealAudio以及其他类型的东西
- Squid的工作机制
- 当客户机通过squid代理去访问web页面时,指定的代理服务器会检查自己的缓存,若是缓存中有客户机需要的页面,那么squid服务器将直接把缓存中页面内容返回给客户机。如果缓存中没有客户端请求的页面,那么squid代理服务器就会向internet发送访问请求,获得返回的web页面后,将网页的数据库保存到缓存中发送给客户机
- 由于客户机的web访问请求实际上是squid代理服务器来代替完成的,所以隐藏了用户的真实IP地址,从而起到了一定的保护作用,此外,squid也可以针对要访问的目标、客户机的地址、访问的时间段进行过滤控制
- 根据实现的方式不同,基本可以分为传统代理和透明代理两种方式
- 传统代理:也就是普通的代理服务,需要客户端在浏览器、聊天工具等一些程序设置代理服务器的地址和端口,然后才能使用代理来访问网络,这种方式相比较而言比较麻烦,因为客户机还需要手动指定代理服务器,所以一般用于internet环境
- 透明代理:与传统代理实现的功能是一样,区别在于客户机不需要手动指定代理服务器的地址和端口,而是通过静态路由、防火墙策略将web访问重定向,实际上仍然交给代理服务器来处理,重定向的过程完全是由squid服务器进行的,所以对于客户机来说,甚至不知道自己使用了squid代理服务,因此呢,我们称之为透明模式。透明模式多用于局域网环境,如在Linux网关中启用透明代理,局域网主机无需进行额外的设置就能享受更好的上网速度
二.搭建Squid的传统模式
- 实验环境
类别 | IP地址 | 系统 | 软件包 |
Squid服务器 | 192.168.43.101 | centos7 | squid-3.4.6.tar.gz |
web服务器 | 192.168.43.102 | centos7 | |
客户机 | 192.168.43.103 | centos7 |
- Squid服务器的配置
1.解压squid软件包
tar xzvf squid-3.4.6.tar.gz -C /opt
2.安装相关软件包
yum install gcc gcc-c++ make -y
3.配置服务模块,编译安装
cd /opt/suqid-3.4.6/
./configure \
--prefix=/usr/local/squid \
--sysconfdir=/etc --enable-arp-acl \
--enable-linux-netfilter \
--enable-linux-tproxy \ //添加透明代理功能
--enable-async-io=100 \
--enable-err-language="Simplify_Chinese" \
--enable-underscore \
--enable-poll \
--enable-gnuregex
make && make install
4.创建软链接,优化服务控制方式
ln -s /usr/local/squid/sbin/squid /usr/local/sbin/
5.创建squid用户
useradd -M -s /sbin/nologin squid
6.修改squid中的var的属性
chowm -R squid.squid /usr/local/squid/var/
7.编辑squid的配置文件
vim /etc/squid.conf
55 # And finally deny all other access to this proxy
56 http_access allow all
57 http_access deny all //允许所有用户访问
58
59 # Squid normally listens to port 3128
60 http_port 3128
61 cache_mem 64 MB //指定缓存功能所使用的内存空间大小
62 reply_body_max_size 10 MB //允许用户下载的最大文件大小
63 maximum_object_size 4096 KB //允许保存到缓存空间的最大对象大小
64 cache_effective_user squid //添加指定程序用户
65 cache_effective_group squid //添加指定账户基本组
66
67 # Uncomment and adjust the following to add a disk cache directory.
68 #cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256
8.编辑防火墙规则
iptables -F //清除所有规则
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT //允许目标端口3128做转发
9.检查语法并且开启服务
squid -k parse //检查配置文件语法
squid -z //初始化缓存目录
squid //启动服务
[root@localhost ~]# netstat -natp | grep squid
tcp6 0 0 :::3128 :::* LISTEN 36414/(squid-1)
[root@localhost ~]#
10.编辑脚本,优化服务控制方式(service 工具)
vim /etc/init.d/squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -natp | grep squid &> /dev/null
if [ $? -eq 0 ]
then
echo "squid is running"
else
echo "正在启动 squid...."
echo "成功启动"
$CMD
fi
;;
stop)
$CMD -k kill &> /dev/null
rm -rf $PID &> /dev/null
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ]
then
netstat -natp | grep squid
else
echo "squid is not running"
fi
;;
restart)
$0 stop &> /dev/null
echo "正在关闭 squid..."
echo "关闭成功"
$0 start &> /dev/null
echo "正在启动 squid..."
echo "启动成功"
;;
reload)
$CMD -k reconfigure
;;
check)
$CMD -k parse
;;
*)
echo "用法:$0{start|stop|status|reload|check|restart}"
;;
esac
chmod +x /etc/init.d/squid //添加服务执行权限
chkconfig --add squid //添加到service的服务列表
chkconfig --level 35 squid on //开机自启
[root@localhost ~]# service squid restart
正在关闭 squid...
关闭成功
正在启动 squid...
启动成功
[root@localhost ~]#
- web服务器配置
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# netstat -natp | grep 80
tcp 0 0 192.168.43.102:22 192.168.43.1:58000 ESTABLISHED 1372/sshd: root@pts
tcp6 0 0 :::80 :::* LISTEN 1633/httpd
- 客户机的配置
- 从客户机上访问web服务器
- 在web服务器上查看日志信息
三.搭建Squid的透明模式
- 网络拓补图
- 实验环境
类别 | IP地址 | 系统 | 软件包 |
squid服务器 | ens33:192.168.43.101/24 ens37:192.168.10.1/24 | centos7 | squid-3.4.6.tar.gz |
web服务器 | 192.168.43.102 | centos7 | |
客户机 | 192.168.10.1 | centos7 |
- 配置squid服务器
1.配置网卡
ens33为NAT模式
ens37为仅主机模式
cd /etc/sysconfig/network-scripts/
cp -p ifcfg-ens33 ifcfg-ens37
vim ifcfg-ens37
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
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="192.168.10.1"
PREFIX="24"
IPV6_PRIVACY="no"
~
service network restart
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.101 netmask 255.255.255.0 broadcast 192.168.43.255
inet6 fe80::ba30:ef5e:b59f:4f1c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ce:5f:24 txqueuelen 1000 (Ethernet)
RX packets 69255 bytes 75640130 (72.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 37782 bytes 4352077 (4.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::ece2:7d1e:9841:aaa4 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ce:5f:2e txqueuelen 1000 (Ethernet)
RX packets 1939 bytes 165942 (162.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 620 bytes 209636 (204.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 177 bytes 16303 (15.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 177 bytes 16303 (15.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:7a:bf:df txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]#
2.配置路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
3.配置squid文件
vim /etc/squid.conf
59 # Squid normally listens to port 3128
60 http_port 192.168.10.1:3128 transparent
service squid restart
4.添加防火墙规则
iptables -F //清空规则
iptables -t nat -F
iptables -t nat -I PREROUTING -i ens37 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
iptables -t nat -I PREROUTING -i ens37 -s 192.168.10.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
- 配置web服务器
yum install httpd -y
route add -net 192.168.10.0/24 gw 192.168.43.101 //添加静态路由
systemctl stop firewalld.service
setenforce 0
- 配置客户端,虚拟机处于仅主机模式
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
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="58caa276-e9d1-4c47-872d-27a4e5015272"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.10.10"
PREFIX="24"
GATEWAY="192.168.10.1"
IPV6_PRIVACY="no"
[root@localhost ~]# service network restart
Restarting network (via systemctl): [ 确定 ]
- 验证服务配置
注:在web服务器中,添加到路由表的静态路由有时间限制