实践出真知——基于squid实现正向代理实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实践出真知——基于squid实现正向代理实践相关的知识,希望对你有一定的参考价值。

实践出真知——基于squid实现正向代理实践

前言

? 俗话说得好:时间是治愈一切伤口的良药,实践是检验真理的唯一标准!本文将结合代理服务器的基本原理,进行基于squid软件实现传统(标准)代理(正向代理)以及透明代理的实例演示。

先说说squid是个啥

? 避(kai)免(ge)被(wan)喷(xiao),还是介绍一下什么是squid吧。

squid的概念

? squid是一种用来缓存Internet数据的软件。用于接受来自客户端需要下载对象(object)的请求并适当的处理这些请求。也就是说,如果一个客户端想下载一个web页面,就可以通过请求squid(代理服务器)为其获取并响应(返回)这个页面的数据到客户端;squid(代理服务器)随之连接到远程服务器并向该web页面发出请求。然后,squid聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时, squid可以简单的从磁盘(自身)中读取到,那样数据会立即传输到客户机上,从而节省网络资源(例如带宽)。

? 说白了,squid就是一个软件,运行在代理服务器上,用来真正实现代理的功能。

squid代理的作用

  • 通过缓存的方式为用户提供Web访问加速
  • 对用户的Web访问进行过滤控制

基于squid实现传统代理实例演示

一、规划实验环境和所需资源

实例核心:两台服务器,一台客户机

squid代理服务器ip:20.0.0.128
web真实服务器ip:20.0.0.130
client客户机ip(测试用):20.0.0.138

软件包资源:squid软件包链接如下:

二、网络拓扑结构

技术图片

三、实操流程

由于web真实服务器设置比较简单,安装一个Apache web服务即可,先来看一下squid代理服务器上的配置,为了方便演示,对服务器更改一下名称也是必要的

1、在代理服务器上手工编译安装squid软件

熟悉手工编译的话其实步骤就是那些,只是具体的内容不一样而已,无需多言,直接开始:

[root@localhost ~]# hostnamectl set-hostname squid
[root@localhost ~]# su
[root@squid ~]# ls
anaconda-ks.cfg       sarg-2.3.7.tar.gz   公共  视频  文档  音乐
initial-setup-ks.cfg  squid-3.4.6.tar.gz  模板  图片  下载  桌面
[root@squid ~]# tar zxf squid-3.4.6.tar.gz -C /opt/ #解压软件包
[root@squid ~]# yum install gcc gcc-c++ make -y #安装编译环境(如果安装了开发工具一般无需该步骤)

[root@squid ~]# cd /opt/squid-3.4.6/   #进入软件目录开始手工编译安装
[root@squid squid-3.4.6]# ls
acinclude     compat        COPYING    helpers  libltdl      README             src
aclocal.m4    configure     COPYRIGHT  icons    Makefile.am  RELEASENOTES.html  test-suite
bootstrap.sh  configure.ac  CREDITS    include  Makefile.in  scripts            tools
cfgaux        contrib       doc        INSTALL  po4a.conf    snmplib
ChangeLog     CONTRIBUTORS  errors     lib      QUICKSTART   SPONSORS
[root@squid squid-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
[root@squid squid-3.4.6]# make    
[root@squid squid-3.4.6]# make install    ##编译安装,时间根据硬件配置成正比

配置参数解析:

--prefix=/usr/local/squid      ##安装路径
--sysconfdir=/etc              ##配置文件目录
--enable-arp-acl               ##支持acl访问控制列表
--enable-linux-netfilter       ##支持网络筛选(内核过滤)
--enable-linux-tproxy          ##支持透明模式(透明模式代理实验需要)
--enable-async-io=100          ##io优化配置
--enable-err-language="Simplify_Chinese"    ##报错显示简体中文
--enable-underscore            ##允许URL中包含下划线
--enable-poll                  ##使用poll()模式,提升性能
--enable-gnuregex               ##支持GNU正则表达
[root@squid squid-3.4.6]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/  ##便于系统识别对应的命令
[root@squid squid-3.4.6]# useradd -M -s /sbin/nologin squid   ##创建系统用户
[root@squid squid-3.4.6]# chown -R squid.squid /usr/local/squid/var/  ##给目录所有文件属主属组权限

2、修改squid主配置文件,并优化启动项

[root@squid squid-3.4.6]# vim /etc/squid.conf   ##修改squid配置文件
55 # And finally deny all other access to this proxy
56 http_access allow all   ##添加此项
57 #http_access deny all ##注释,允许终端访问

59 # Squid normally listens to port 3128
60 http_port 3128
cache_effective_user squid   ##指定用户squid,自己添加
cache_effective_group squid ##指定组,自己添加
[root@squid squid-3.4.6]# squid -k parse ##检查配置文件语法(有显示内容)
[root@squid squid-3.4.6]# squid -z  ##初始化缓存目录
[root@squid squid-3.4.6]# squid  ##开启服务(有显示内容)
[root@squid squid-3.4.6]# netstat -ntap | grep 3128  ##查看squid端口

[root@squid squid-3.4.6]# cd /etc/init.d/
[root@squid init.d]# vim squid    ##编辑service启动squid的脚本
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"   ##PID文件进程号
CONF="/etc/squid.conf"   ##主配置文件
CMD="/usr/local/squid/sbin/squid"   ##启动命令

case "$1" in
start)
                netstat -ntap | grep squid &> /dev/null
                if [ $? -eq 0 ]
                then 
                 echo "squid is running"
                 else
                 echo "正在启动 squid...." 
                 $CMD
                fi
                ;;
stop)
                $CMD -k kill &> /dev/null   ##关闭squid
                rm -rf $PID &> /dev/null    ##删除PID文件
                ;;
status)
                [ -f $PID ] &> /dev/null
                 if [ $? -eq 0 ]
                                then
                                 netstat -ntap | grep squid
                                else
                                 echo "squid is not running"
                fi
                ;;
restart)
                $0 stop &> /dev/null
                echo "正在关闭 squid..."
                $0 start &> /dev/null
                echo "正在启动 squid..."
                ;;
reload)
                $CMD -k reconfigure  ##重载配置文件
                ;;
check)
                $CMD -k parse   ##检查语法
                ;;
*)
                echo "用法:$0{start|stop|reload|status|check|restart}"
                ;;
esac
[root@squid init.d]# chmod +x squid   ##给执行权限
[root@squid init.d]# chkconfig --add squid   ##添加到service管理中
[root@squid init.d]# chkconfig --level 35 squid on  ##开机自启

3、设置传统代理配置——依旧是对主配置文件进行修改

[root@squid init.d]# vim /etc/squid.conf  ##修改主配置文件
# Squid normally listens to port 3128
http_port 3128
cache_mem 64 MB   ##缓存空间大小
reply_body_max_size 10 MB  ##允许下载最大的文件大小
maximum_object_size 4096 KB   ##允许保存缓存空间最大对象的大小
[root@squid init.d]# service squid restart
[root@squid init.d]# iptables -L  ##查看表内容(有显示内容)
[root@squid init.d]# iptables -F  ##清空表缓存
[root@squid init.d]# setenforce 0
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT ##允许基于tcp协议从3128端口进入
[root@squid init.d]# service squid reload  ##重载配置文件

4、在web服务器上安装Apache http服务

[root@localhost ~]# hostnamectl set-hostname web
[root@localhost ~]# su
[root@web ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  公共  模板  视频  图片  文档  下载  音乐  桌面
[root@web ~]# systemctl stop firewalld.service   ##关闭防火墙
[root@web ~]# setenforce 0
[root@web ~]# yum install httpd -y  ##安装web服务
[root@web ~]# systemctl start httpd.service

5、使用client访问web地址,在web服务器端的日志文件中查看日志消息

Win7客户端访问web服务器ip地址,显示正常访问

技术图片

web服务器的日志文件信息如下:

技术图片

Win7客户机ip地址:

技术图片

根据上篇文章的介绍原理,在传统(标准)代理模式下应该是squid服务器的ip地址啊?这个问题的确没毛病,但是我们需要知道,传统代理与透明代理的最核心的区别在于哪里——就是我们的客户机没有设置代理和端口啊!

设置代理服务器IP地址和端口:

技术图片

技术图片

刷新页面再次在web服务器上查看日志消息,如下所示:

技术图片

小结

? 根据此次的实践,体验了使用squid软件实现传统代理服务器的功能,也验证了其需要在客户端设置代理服务器地址和端口的原因。

? 接下来基于上面的实验,进行透明模式的配置,首先将方才的代理服务器ip地址和端口的设置删除。

基于squid实现透明代理实例演示

一、实验环境

? 实验环境需要修改,因为透明模式是使用代理服务器将客户服务器与web服务器阻断了,所以需要在squid服务器上添加网卡实现通信。如下所示:

squid 服务器:ens33 20.0.0.128
             ens36 192.168.100.1 (仅主机)
web服务器:20.0.0.130
client 客户机:192.168.100.100(仅主机)

二、网络拓扑结构

这样构建的一个网络拓扑如下所示:

技术图片

三、实验流程

0、删除原来在client端的代理设置并且设置网卡为仅主机模式且IP地址为192.168.100.100

技术图片

1、在squid服务器上添加新网卡为仅主机模式,并且配置IP地址为192.168.100.1

[root@squid ~]# cd /etc/sysconfig/network-scripts/
[root@squid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[root@squid network-scripts]# vim ifcfg-ens36  ##修改ens36ip信息
BOOTPROTO=static
##删除uuid修改33为36
IPADDR=192.168.100.1
NETMASK=255.255.255.0  
[root@squid network-scripts]# service network restart   ##重启网络服务
[root@squid network-scripts]# vim /etc/sysctl.conf   ##开启路由转发
net.ipv4.ip_forward=1 #末尾加上
[root@squid network-scripts]# sysctl -p   ##加载
net.ipv4.ip_forward=1

2、在web服务器上指定静态路由

[root@web ~]# route add -net 192.168.100.0/24 gw 192.168.13.184  ##添加静态路由

3、在squid代理服务器上设置透明代理

前面配置(./configure时开启了支持透明模式的功能的)

[root@squid network-scripts]# vim /etc/squid.conf   ##设置配置文件
http_port 192.168.100.1:3128 transparent   ##设置透明代理,真正修改的地方
cache_effective_user squid
cache_effective_group squid
[root@squid network-scripts]# service squid stop  ##关闭开启squid服务
[root@squid network-scripts]# service squid start
[root@squid network-scripts]# iptables -F  ##清空表缓存
[root@squid network-scripts]# iptables -t nat -F
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
##定义规则入口ens36,80端口重定向到3128
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
##https443端口
[root@squid network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
##允许3128端口访问

4、测试验证

技术图片

查看web日志文件,如下图:

技术图片

小结

? 透明模式下的设置是对网络的规划以及对squid配置文件的修改,添加对应的参数即可实现透明模式下的代理功能。并且无需在客户端设置服务器的ip地址以及端口号。

总结

? 基于squid软件实现的正向代理的两种模式应该深有体会了,结合之前的原理在配置实践中理解是不是更加事半功倍了呢?通过本文的实际操作,想必对squid的配置文件还不太熟悉(不急不急哈,未完待续,且听下回分解~~),但是实现的整个过程应该是了如指掌了哈!

以上是关于实践出真知——基于squid实现正向代理实践的主要内容,如果未能解决你的问题,请参考以下文章

Squid 搭建正向代理服务器

实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离

实践出真知----k8s初步熟悉使用介绍,实践搭建nginx集群

Java 线程池实践出真知

shell编程 之 实践出真知(代码实例)

16 使用Squid部署代理缓存服务