一、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)" 至此透明代理构建成功!!!!