实践出真知——基于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软件
熟悉手工编译的话其实步骤就是那些,只是具体的内容不一样而已,无需多言,直接开始:
[[email protected] ~]# hostnamectl set-hostname squid
[[email protected] ~]# su
[[email protected] ~]# ls
anaconda-ks.cfg sarg-2.3.7.tar.gz 公共 视频 文档 音乐
initial-setup-ks.cfg squid-3.4.6.tar.gz 模板 图片 下载 桌面
[[email protected] ~]# tar zxf squid-3.4.6.tar.gz -C /opt/ #解压软件包
[[email protected] ~]# yum install gcc gcc-c++ make -y #安装编译环境(如果安装了开发工具一般无需该步骤)
[[email protected] ~]# cd /opt/squid-3.4.6/ #进入软件目录开始手工编译安装
[[email protected] 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
[[email protected] 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
[[email protected] squid-3.4.6]# make
[[email protected] 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正则表达
[[email protected] squid-3.4.6]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/ ##便于系统识别对应的命令
[[email protected] squid-3.4.6]# useradd -M -s /sbin/nologin squid ##创建系统用户
[[email protected] squid-3.4.6]# chown -R squid.squid /usr/local/squid/var/ ##给目录所有文件属主属组权限
2、修改squid主配置文件,并优化启动项
[[email protected] 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 ##指定组,自己添加
[[email protected] squid-3.4.6]# squid -k parse ##检查配置文件语法(有显示内容)
[[email protected] squid-3.4.6]# squid -z ##初始化缓存目录
[[email protected] squid-3.4.6]# squid ##开启服务(有显示内容)
[[email protected] squid-3.4.6]# netstat -ntap | grep 3128 ##查看squid端口
[[email protected] squid-3.4.6]# cd /etc/init.d/
[[email protected] 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
[[email protected] init.d]# chmod +x squid ##给执行权限
[[email protected] init.d]# chkconfig --add squid ##添加到service管理中
[[email protected] init.d]# chkconfig --level 35 squid on ##开机自启
3、设置传统代理配置——依旧是对主配置文件进行修改
[[email protected] 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 ##允许保存缓存空间最大对象的大小
[[email protected] init.d]# service squid restart
[[email protected] init.d]# iptables -L ##查看表内容(有显示内容)
[[email protected] init.d]# iptables -F ##清空表缓存
[[email protected] init.d]# setenforce 0
[[email protected] init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT ##允许基于tcp协议从3128端口进入
[[email protected] init.d]# service squid reload ##重载配置文件
4、在web服务器上安装Apache http服务
[[email protected] ~]# hostnamectl set-hostname web
[[email protected] ~]# su
[[email protected] ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[[email protected] ~]# systemctl stop firewalld.service ##关闭防火墙
[[email protected] ~]# setenforce 0
[[email protected] ~]# yum install httpd -y ##安装web服务
[[email protected] ~]# 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
[[email protected] ~]# cd /etc/sysconfig/network-scripts/
[[email protected] network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[[email protected] network-scripts]# vim ifcfg-ens36 ##修改ens36ip信息
BOOTPROTO=static
##删除uuid修改33为36
IPADDR=192.168.100.1
NETMASK=255.255.255.0
[[email protected] network-scripts]# service network restart ##重启网络服务
[[email protected] network-scripts]# vim /etc/sysctl.conf ##开启路由转发
net.ipv4.ip_forward=1 #末尾加上
[[email protected] network-scripts]# sysctl -p ##加载
net.ipv4.ip_forward=1
2、在web服务器上指定静态路由
[[email protected] ~]# route add -net 192.168.100.0/24 gw 192.168.13.184 ##添加静态路由
3、在squid代理服务器上设置透明代理
前面配置(./configure时开启了支持透明模式的功能的)
[[email protected] network-scripts]# vim /etc/squid.conf ##设置配置文件
http_port 192.168.100.1:3128 transparent ##设置透明代理,真正修改的地方
cache_effective_user squid
cache_effective_group squid
[[email protected] network-scripts]# service squid stop ##关闭开启squid服务
[[email protected] network-scripts]# service squid start
[[email protected] network-scripts]# iptables -F ##清空表缓存
[[email protected] network-scripts]# iptables -t nat -F
[[email protected] 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
[[email protected] network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
##https443端口
[[email protected] network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
##允许3128端口访问
4、测试验证
查看web日志文件,如下图:
小结
? 透明模式下的设置是对网络的规划以及对squid配置文件的修改,添加对应的参数即可实现透明模式下的代理功能。并且无需在客户端设置服务器的ip地址以及端口号。
总结
? 基于squid软件实现的正向代理的两种模式应该深有体会了,结合之前的原理在配置实践中理解是不是更加事半功倍了呢?通过本文的实际操作,想必对squid的配置文件还不太熟悉(不急不急哈,未完待续,且听下回分解~~),但是实现的整个过程应该是了如指掌了哈!
原文地址:https://blog.51cto.com/14557673/2479542