Squid做为应用层代理服务软件,主要提供缓存加速和应用层过滤控制的功能。本次实验使用的是Squid 4.1版本,和以往版本有较多不一样,通过几天的摸索,终于成功实现了传统代理、透明代理及反向代理等功能。linux
代理服务器(Proxy Server)是我的网络和Internet服务商之间的中间代理机构,负责转发合法的网络信息,对转发进行控制和登记。其最基本的功能就是链接,此外还包括安全性、缓存,内容过滤,访问控制管理等功能。当客户机经过代理请求Web页面时,执行的代理服务器会先检查本身的缓存,当缓存中有客户机须要访问的页面,则直接将缓存服务器中的页面内容反馈给客户机;若是缓存中没有客户机须要访问的页面,则由代理服务器想Internet发送访问请求,当得到返回的Web页面之后,将页面数据保存到缓存中并发送给客户机。web
根据实现的方式不一样,代理服务能够分为传统代理和透明代理两种常见的代理服务。正则表达式
一、传统代理:普通代理服务,必须在浏览器、QQ聊天工具,下载团建等程序中手动设置代理服务器的地址和端口,而后才能使用代理服务来访问网络,对于网页浏览器,访问网站时的域名解析请求也会发送给指定的代理服务器。vim
二、透明代理:提供与传统代理相同的功能和服务,其区别在于客户机不须要指定代理服务器的地址和端口,而是经过默认路由、防火墙策略将Web访问重定向,实际上仍然交给代理服务器来处理。重定向的过程对客户机“透明”的,用户甚至不知道本身在使用代理服务,因此称为“透明代理”。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先发给DNS服务器。浏览器
下面以最新版Squid 4.1版本为例,介绍其安装和运行控制。缓存
首先将下载下来的源代码包,解压到指定目录中。安全
[root@promote ~]# tar xfvz squid-4.1.tar.gz -C /opt/ [root@promote ~]# cd /opt/squid-4.1/ [root@promote squid-4.1]# ./configure --prefix=/usr/local/squid \ #指定安装目录 > --sysconfdir=/etc \ #单独将配置文件修改到其余目录 > --enable-arp-acl \ #能够在规则中设置经过客户端MAC进行管理,防止IP欺骗 > --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正则表达式
配置完成后,进行编译安装bash
[root@promote squid-4.1]# make && make install
安装完成后,建立连接文件、建立用户和组服务器
[root@promote squid-4.1]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/ #建立软连接,这样能够直接使用squid相关的命令 [root@promote squid-4.1]# useradd -M -s /sbin/nologin squid #建立管理进程的用户 [root@promote squid-4.1]# chown -R squid.squid /usr/local/squid/var/ #将文件的属主和属组修改
修改Squid的配置文件,Squid服务的配置文件位于/etc/squid.conf。网络
[root@promote squid-4.1]# vim /etc/squid.conf cache_effective_user squid #添加指定程序用户 cache_effective_group squid #添加指定帐号基本组
其余的先保持默认的
[root@promote squid-4.1]# squid -k parse #检查配置文件语法 [root@promote squid-4.1]# squid -z #初始化缓存目录 [root@promote squid-4.1]# 2018/07/22 20:03:12| Created PID file (/usr/local/squid/var/run/squid.pid) 2018/07/22 20:03:12 kid1| Set Current Directory to /usr/local/squid/var/cache/squid 2018/07/22 20:03:12 kid1| Creating missing swap directories 2018/07/22 20:03:12 kid1| No cache_dir stores are configured. 2018/07/22 20:03:12| Removing PID file (/usr/local/squid/var/run/squid.pid) [root@promote squid-4.1]# squid #启动Squid服务 [root@promote squid-4.1]# netstat -ntap | grep squid #服务启动,Squid服务处于正常监听状态 tcp6 0 0 :::3128 :::* LISTEN 90280/(squid-1)
建立Squid服务脚本,为了使Squid服务启动、中止、重载等操做更加方便,能够编写Squid服务脚本,并使用chkconfig和service工具进行管理。
[root@promote squid-4.1]# 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..." $CMD fi ;; stop) kill -9 `expr $(cat $PID) + 2` #squid.pid中的数字和进程号相差2,直接杀死进程,后续实验发现不必定相差2,暂时找不到缘由,但愿大佬出来能解答一下。 ;; 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..." $0 start &> /dev/null echo "正在启动 squid..." ;; reload) $CMD -k reconfigure ;; check) $CMD -k parse ;; *) echo "用法:$0{start|stop|status|reload|check|restart}" ;; esac [root@promote squid-4.1]# cd /etc/init.d/ [root@promote init.d]# chmod +x squid #添加执行权限 [root@promote init.d]# chkconfig --add squid #使用chkconfig管理 [root@promote init.d]# chkconfig --level 35 squid on #设置开机启动
修改配置文件,在配置传统代理时,须要添加http_access allow all访问策略,容许任意客户机使用代理。除此之外还要设置reply_body_max_size项,其余参数保持默认。
[root@promote init.d]# vim /etc/squid.conf http_access allow all #容许任意客户机使用代理 http_port 3128 #使用3128端口 cache_mem 64 MB #指定缓存功能所使用的内存空间大小,便于保持访问较频繁的WEB对象,容量最好为4的倍数,单位为MB,建议设为物理内存的1/4 reply_body_max_size 10 MB #容许用户下载的最大文件大小,以字节为单位。默认设置0表示不进行限制 maximum_object_size 4096 KB #容许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,而是直接转发给用户
在防火墙添加容许策略:
[root@promote run]# iptables -F #清除防火墙filter表中规则 [root@promote run]# setenforce 0 #关闭加强安全××× [root@promote run]# iptables -I INPUT -p tcp --dport 3218 -j ACCEPT #这句策略就是容许访问3218端口的tcp数据包经过 [root@promote run]# service squid reload #从新加载服务配置
客户机的代理配置,在IE浏览器中,选择“工具”->“Internet选项”,子啊弹出的“Internet选项”对话框,在“链接”选项中的“局域网(LAN)设置”选项组中单机“局域网设置”按钮,弹出“局域网(LAN)设置”对话框,设置以下:
开启web服务器的httpd服务。
使用192.168.58.130这台虚拟机访问192.168.58.156,访问成功,查看web服务器的访问日志,查看是那个ip地址访问的,若是是代理服务器ip访问的话,说明传统代理部署成功。
的确是代理服务器访问的,说明传统代理部署成功。
透明代理提供的服务功能与传统代理一致的,可是其“透明”的实现依赖于默认路由和防火墙重定向策略。所以更适用于为局域网主机服务,而不适合Internet中的客户机提供服务。针对下面的拓扑,透明代理的关键在于Linux网关服务器,对于客户机仅须要正确配置网络地址和默认网关,并不须要指定代理服务器,拓扑图以下:
首先设置Squid代理服务器的双网卡配置。
而后修改squid配置文件,主要修改http_port,这里和4.1版本前的修改方法不太同样,若和之前同样,服务会没法启动,并且查看/usr/local/squid/var/logs/cache.log日志,会发现会有报错。
这里须要换种方式,由于可能4.1版本透明代理默认就是3128,那么3128端口就会被占用,没法再作透明代理,这里的方法就是从新使用一个端口,专门用来作透明代理,配置方法以下图,而后重启服务。
开启防火墙路由转发功能以及重定向策略。路由转发功能只须要在/etc/sysctl写入net.ipv4.ip_forward=1,再刷新配置文件便可。
[root@localhost ~]# vim /etc/sysctl.conf [root@localhost ~]# sysctl -p net.ipv4.ip_forward = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.ens33.send_redirects = 0 [root@localhost ~]# !v vim /etc/sysctl.conf
接着设置iptables重定向策略。
[root@localhost ~]# iptables -F #清空防火墙filter表中策略 [root@localhost ~]# iptables -F -t nat #清空防火墙nat表中策略 [root@localhost ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3129 #将80端口(http)的请求从新定向到3128端口 [root@localhost ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3129 #将443端口(https)的请求从新定向到3128端口 [root@localhost ~]# iptables -I INPUT -p tcp --dport 3129 -j ACCEPT #容许来自192.168.100.0网段来自3129端口的tcp数据包经过
配置Web服务器的网卡信息。(配置好网关)
配置客户端网卡信息。(必定要配置好网关)
都配置完后,验证效果,访问成功,咱们再查看web服务器的access.log日志,检查究竟是哪一个ip对web服务器访问的。能够看到是12.0.0.1这个IP对即代理服务器的访问记录。本篇先介绍到这里,下篇介绍Squid 4.1版本的额ACL控制访问、日志分析和反向代理。就这样!