了解squid的应用场景
理解squid的工作原理和作用
理解squid的代理类型(重点)
掌握squid的正向和透明代理的配置(重点)
能够根据需求对squid服务器做简单的访问控制
1. squid是什么?用来做什么?
Squid cache(简称为Squid)是流行最广的,使用最普遍的开源缓存代理服务器
2. squid的作用和应用场景有哪些?
用来做前置的Web缓存,加快用户访问Web的速度
代理内网用户访问互联网资源
设置访问控制策略,控制用户的上网行为
主要支持http、ftp等应用协议
官网地址:squid : Optimising Web Delivery
3. 常见的代理服务器软件
squid 非常古老,功能齐全
varnish 性能优于squid,功能相对没有squid多
其他 haproxy 、nginx等
4. squid的工作原理
1. 正向代理
2. 透明代理
正向代理的过程隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替请求。我们常说的代理也就是正向代理,正向代理代理的是请求方,也就是客户端;
3. 反向代理
反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的人是谁,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端;
总结:
正向代理和透明代理中的代理服务器和客户端同属一个LAN,对server端是透明的,服务器并不知道自己为谁提供服务。作用都是让内网用户可以通过代理服务器上互联网,也可以提高访问速度,并且可以通过代理服务器的访问控制限制内网用户的上网行为。
反向代理的过程隐藏了真正的服务器,对client端是透明的,客户端并不知道真正提供服务的服务器。可以起到负载均衡的作用,提高用户的访问速度。
两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端
应用场景
正向和透明代理:一般用于公司内网用户访问互联网,根据需求进行访问控制
反向代理:一般用于公司服务器集群前做web缓存,提高用户访问效率,同时可以起到负载均衡作用,为互联网提供可持续的web服务
1. SNAT和DNAT
网络层次:网络层
局域网用户访问外网走snat模式,同一个数据包,改变数据包头部的来源地址,再把数据包发到internet。
作用:内网用户上外网(SNAT)和内网服务发布到公网(DNAT)
2. 代理服务器模式
网络层次:应用层
不改变数据包头信息,把数据包代理给internet的服务器,基于应用层的过滤。
应用层:
协议:http、ftp、pop、smtp、p2p等
作用:缓存页面,加速访问,ACL资源访问控制
反向代理:
internet用户访问局域网服务器
Squid做反向代理服务器,把用户的请求转发到后方的真实的服务器,可以做到负载均衡的效果,同时缓冲用户经常访问的页面提高访问速度
1. 安装软件
//squid在本地镜像里有,只需要配置好本地yum源即可 [root@squid-server ~]# yum -y install squid
2. 软件的文件列表
[root@squid-server ~]# rpm -ql squid /etc/squid/squid.conf //配置文件 /etc/rc.d/init.d/squid //启动脚本 /usr/sbin/squid //二进制命令 /usr/share/doc/squid-3.1.10 //手册 /var/log/squid //日志目录 /var/spool/squid //缓存目录
3. 配置文件说明
# cat /etc/squid/squid.conf //设置监听的IP与端口号 http_port 3128 //额外提供给squid使用的内存大小 cache_mem 默认256 MB //设置squid磁盘缓存最大文件,超过4M的文件不保存到硬盘 maximum_object_size 4 MB //设置squid磁盘缓存最小文件 minimum_object_size 0 KB //设置squid内存缓存最大文件,超过4M的文件不保存到内存 maximum_object_size_in_memory 4096 KB //定义squid的cache存放路径 、cache目录容量(单位M)、一级缓存目录数量、二级缓存目录数量 cache_dir ufs /var/spool/squid 100 16 256 //log文件日志格式 logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User-Agent}>h" %Ss:%Sh //log文件存放路径和日志格式 access_log /var/log/squid/access.log combined //设置缓存日志 cache_log /var/log/squid/cache.log //log轮转60天 logfile_rotate 60 //cache目录使用量大于95%时,开始清理旧的cache cache_swap_high 95 //cache目录清理到90%时停止 cache_swap_low 90 //定义本地网段 acl localnet src 192.168.1.0/24 //允许本地网段使用 http_access allow localnet //拒绝所有 http_access deny all //主机名 visible_hostname xxx.xxxx.xxxx //管理员邮箱 cache_mgr [email protected]
需求:内网用户通过浏览器指定代理服务器的IP和端口访问互联网中的web服务
环境: client:10.1.1.2 squid-server:10.1.1.1 和 2.2.2.1 web-server: 2.2.2.2 思路: 1. squid-server需要2个IP,一个公网一个私网 2. client端只需要和squid-server能互通即可,不需要指定gw和dns; 3. client端需要在浏览器上设置代理服务器的IP和端口 4. squid-server可以上外网,client不能上外网,目的就是让squid代理内网用户访问互联网web服务 5. 搭建一个web服务 步骤: 搭建squid-server服务器: 1. 安装软件 yum -y install squid 2. 根据需求修改配置文件 需求:代理内网所有用户访问互联网的web服务 [root@squid-server ~]# vim /etc/squid/squid.conf ... #http_access deny all //注释掉这行 http_access allow all //将原来的deny all 改成 allow all,允许所有人来访问该代理服务器 cache_dir ufs /var/spool/squid 100 16 256 //取掉前面的注释,打开缓存目录 //增加以下2行 visible_hostname squid-server.itcast.cc //定义squid服务器主机名 access_log /var/log/squid/access.log //定义访问日志 3. 启动squid服务 [root@squid-server ~]# service squid start init_cache_dir /var/spool/squid... Starting squid: . [ OK ] //服务器启动后会再缓存目录里产生以下一级、二级缓存目录文件 [root@squid-server ~]# ls /var/spool/squid/ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F swap.state //查看端口3128已经处于监听状态 [root@squid-server ~]# netstat -nltp|grep squid tcp 0 0 :::3128 :::* LISTEN 31722/(squid) 注意:如果再次重启会报以下警告 WARNING cache_mem is larger than total disk cache space! 原因:默认情况下,cache_mem为256M,而squid的配置里磁盘缓存默认为100M 解决: 方法1:调小cache_mem的值 在配置文件中增加:cache_mem 100 MB 方法2:调大磁盘缓存 修改配置文件中如下内容: cache_dir ufs /var/spool/squid 256 16 256 ——>把100换成256 说明:squid缓存从 内存 ————> 磁盘 cache_mem /var/spool/squid 搭建web服务: web-server:2.2.2.2 客户端测试: client:10.1.1.2 注意:不需要设置网关和DNS 配置代理服务器前:不能够直接访问web服务 [root@client ~]# ping 2.2.2.2 connect: Network is unreachable [root@client ~]# wget http://2.2.2.2 --2018-05-05 11:48:12-- http://2.2.2.2/ Connecting to 2.2.2.2:80... failed: Network is unreachable. 浏览器配置代理服务器:指定代理服务器的IP和端口 Firefox: Edit————>Preference————>Advanced————>Network————>Settings————>Manual proxy configuration 编辑--首选项--高级--网络--设置-- 手动填写代理服务器的IP和代理端口 Chrome: 设置——>高级——>打开代理设置——>连接——>局域网设置——>为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口 IE: 设置——>Internet选项——>连接——>局域网设置--为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口 测试访问web页面: 1. client端:打开浏览器,输入:http://2.2.2.2 可以看到web-server的web页面 2. web-server端:查看/var/log/httpd/access.log日志 3. squid-server端:查看/var/log/squid/access.log日志 4. 测试web-server服务停止,squid-server是否缓存
需求:内网用户通过代理服务器可以直接访问互联网中的web服务,不用指定proxy地址和端口
思路: 1. squid-server需要2个IP,一个公网一个私网 2. client端浏览器不需要指定代理服务器的IP和端口,但是需要指定网关为squid-server的私网地址; 3. squid-server需要借助iptables将内网的80端口重定向到自己的3128端口帮内网用户代理上网 4. 搭建一个web服务 步骤: client端浏览器清空刚刚的代理设置(不要忘记) client端指定自己的默认网关为squid-server的私有地址: [root@client ~]# route add default gw 10.1.1.1 squid-server端配置透明代理服务并添加iptables规则: 1. 修改squid配置文件 [root@squid-server ~]# vim /etc/squid/squid.conf http_port 3128 transparent //在代理端口后面加上transparent(透明),代表透明代理 重启服务: service squid restart 2. 添加防火墙规则 [root@squid-server ~]# iptables -t nat -A PREROUTING -s 10.1.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128 [root@squid-server ~]# iptables -t nat -nL 说明: -j REDIRECT 表示端口重定向,仅用于tcp和udp协议 This is only valid if the rule also specifies -p tcp or -p udp 3. 客户端测试验证 1). client端:打开浏览器,输入:http://2.2.2.2 可以看到web-server的web页面 [root@client ~]# curl -I http://2.2.2.2/index.html //查看是否缓存 ... X-Cache: HIT from squid-server.itcast.cc X-Cache-Lookup: HIT from squid-server.itcast.cc:3128 //HIT代表命中,缓存 ... X-Cache: MISS from squid-server.itcast.cc X-Cache-Lookup: MISS from squid-server.itcast.cc:3128 //MISS代表没有命中,没有缓存 2). web-server端:查看/var/log/httpd/access.log日志 3). squid-server端:查看/var/log/squid/access.log日志 4). 测试web-server服务停止,squid-server是否缓存
1. 访问控制配置语法
1. 禁止IP地址为192.168.0.100的客户机上网 acl test src 192.168.0.100 //定义来源IP,test可以自己定义,代表定义的IP http_access deny test //拒绝test后面定义的源IP:192.168.0.100上网 2. 禁止192.168.1.0这个网段里的所有客户机上网 acl test src 192.168.1.0/255.255.255.0 或者 acl test src 192.168.1.0/24 http_access deny test 3. 禁止用户访问IP为210.21.118.68的网站 acl test dst 210.21.118.68 http_access deny test 4. 禁止用户访问域名为www.163.com的网站 acl test dstdomain –i www.163.com //-i: 忽略大小写 http_access deny test 5. 禁止用户访问多个网址 acl test dstdom_regex "/etc/squid/baddsturl" //如果网址太多,可以写成一个文件,然后在这个文件里一行一个网站写上你要禁止的 http_access deny test 问题:拒绝了域名访问,IP理论上是可以访问,但是不能访问?why? 原因:通过查看官方手册,发现如下说明: For dstdomain and dstdom_regex a reverse lookup is tried if a IP based URL is used and no match is found. The name "none" is used if the reverse lookup fails. 对于dstdomain和dstdomregex来说,如果使用基于IP的URL,并且没有找到匹配的话,就会尝试反向查找。如果反向查找失败,则使用“none”这个名称 6. 禁止用户访问域名包含有163.com的网站 acl test url_regex –i 163.com //使用正则表达式匹配URL地址 http_access deny test 7. 禁止用户访问包含有itcast关键字的URL acl test url_regex –i itcast http_access deny test 8. vip用户没有任何限制 acl vip arp 00:0C:29:79:0C:1A //绑定mac地址 http_access allow vip 9. 禁止192.168.2.0这个子网里所有客户机在周一至周五的9点到18点上网 acl test1 src 192.168.2.0/255.255.255.0 acl test2 time D 9:00-18:00 http_access deny test1 test2 时间列表: S Sunday 周日 M Monday 周一 T Tuesday 周二 W Wednesday 周三 H Thursday 周四 F Friday 周五 A Saturday 周六 D All weekdays (M-F) 周一到周五 10. 禁止用户下载*.mp3,*.exe,*.zip,*.rar带有定义后缀名的文件 acl test urlpath_regex –i \.mp3$ \.exe$ \.zip$ \.rar$ \.txt$ //urlpath_regex:正则表达式匹配URI地址 http_access deny test 注意: http_access deny的行为要写在allow的上方 先拒绝再允许 总结:acl访问控制,从上往下匹配,如果匹配到了规则不会往下走,如果都没有匹配上规则,则看最后面的 http_access allow|deny all
2. 应用案例
2.1 根据IP地址访问控制
acl deny_ip src 10.1.1.4 http_access deny deny_ip 注意:如果有多个不同ip地址可以放到一个文件中,如下: acl deny_ip src "/tmp/ip.txt" http_access deny deny_ip
2.2 根据域名访问控制
acl deny_dom dstdomain -i www.misshou.cc //拒绝具体某个域 http_access deny deny_dom acl deny_dom url_regex -i misshou.cc //拒绝包含misshou.cc关键字的域 http_access deny deny_dom
2.3 根据时间和日期访问控制
acl idle_time time SA //课余时间,周六周日 acl work_time time D 9:00-12:00 14:30-17:30 //工作时间周一到周五的上课时间 http_access deny work_time //上课时间不能上网 http_access allow idle_time //业余时间可以上网 注意:关于时间的几种错误写法 acl idle_time time A 14:00-18:00 S 9:00-12:00 //错误,只取周六和周天的9:00-12:00 正确写法如下:分成2行写 acl idle_time1 time A 14:00-18:00 acl idle_time2 time S 9:00-12:00 acl idle_time time 20:00-04:00 跨越子夜 //错误 正确写法如下: acl idle_time time !04:00-20:00
2.4 根据文件名访问控制
acl idle_time time SA acl work_time time D 9:00-12:00 14:30-17:30 acl content urlpath_regex \.mp4$ \.rmvb$ \.avi$ \.txt$ http_access deny work_time http_access deny content http_access allow idle_time 注意: 先deny在allow,匹配规则从上往下一条一条匹配,如果没有匹配到看最后的http_access deny|allow all
3. 综合案例(自己完成)
根据需求控制内网用户访问互联网:
允许周一到周五12:00-14:00和17:30-21:00和双休能上网,别的时间不能上网
禁止下载.exe .rar .mp3 .avi .rmvb .mp4后缀的文件
禁止访问qq.com,mop.com,sina.com,163.com,youku.com
禁止访问网址中包含某些关键字的网站:比如 sex news movie sport game
vip没有任何限制
具体步骤: 1. squid-server上修改配置文件squid.conf 1) 定义访问控制资源 acl lunchtime time MTWHF 12:00-14:00 acl dinnertime time MTWHF 17:30-21:00 acl weekend time SA 00:00-24:00 acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$ \.rar$ acl badweb dstdom_regex "/etc/squid/denywebsite" acl badword url_regex -i sex news movie sport game stock acl vip arp 00:0C:29:BB:F6:14 2) 创建禁止访问的网站 vim /etc/squid/denywebsite qq.com sina.com mop.com 163.com youku.com 3) 根据需求对以上资源做出访问控制 http_access allow vip http_access deny badfile http_access deny badweb http_access deny badword http_access allow lunchtime http_access allow dinnertime http_access allow weekend http_access deny all 2. 测试验证
总结:
需求:某公司内网搭建了一台web服务器,希望互联网用户来访问该web服务,越多越好
画图理解:反向代理
环境: client:2.2.2.2 互联网用户 squid-server:2.2.2.1和10.1.1.1 2个IP,一个公网一个私网 web-server:10.1.1.3 公司内网web服务器 搭建反向代理服务器squid步骤: 1. 清空之前的环境 [root@squid-server ~]# iptables -t nat -nL 2. 修改squid.conf配置文件来配置反向代理 [root@squid-server ~]# vim /etc/squid/squid.conf ... http_port 80 vhost cache_peer 10.1.1.3 parent 80 0 originserver 解释说明: [root@squid-server ~]# less /usr/share/doc/squid-3.1.10/squid.conf.documented ... cache_peer hostname type http-port icp-port [options] cache_peer:做反向代理的关键字 hostname:代表后台真正的web服务器 type:代表代理服务器的类型,有PARENT和SIBLING两种;parent代表父亲,sibling代表兄弟伙伴 http-port:后台web服务的端口 icp-port:代表代理服务器之间通讯的端口(用于查询兄弟缓存的端口) [options]:代表可选项 originserver:代表原始服务器(真正的web服务) weight:代表权重 max-conn:代表 ... 3. 测试验证 在client端:2.2.2.2上直接访问代理服务器: http://2.2.2.1