squid代理(反向传统透明)+ACL控制+日志分析
Posted TaKe___Easy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了squid代理(反向传统透明)+ACL控制+日志分析相关的知识,希望对你有一定的参考价值。
squid代理
一、缓存代理概述
1.1 Web代理的工作机制
- 缓存网页对象,减少重复请求
- 代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址
- 将获得的网页数据(静态Web元素)保存到缓存中并发送给客户机,以便下次请求相同的数据时快速相应
1.2 代理的基本类型
- 传统代理:适用于lnternet,需明确指定服务端
- 透明代理:客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理
- 反向代理:如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的Web服务器请求资源,然后将请求的应答返回给客户端,同时也将应答缓存(静态)在本地,以供下一个请求者使用
1.3 使用代理的好处
- 提高Web访问速度
- 隐藏客户机的真实IP地址
二、Squid服务搭建
2.1 搭建环境
- squid:192.168.131.10
- apache:192.168.131.11
- 客户端(Win10):192.168.131.5
2.2 安装squid服务
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# yum -y install gcc gcc-c++ make
[root@localhost opt]# cd /opt/
[root@localhost opt]# ls
rh squid-3.5.28.tar.gz
[root@localhost opt]# tar zxvf squid-3.5.28.tar.gz
[root@localhost opt]# cd squid-3.5.28/
[root@localhost squid-3.5.28]# ./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 【使用GUN正则表达式】
./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@localhost squid-3.5.28]# make -j2 && make install
【创建程序用户squid,保证系统安全性】
[root@localhost squid-3.5.28]# useradd -M -s /sbin/nologin squid
【创建软链接到路径环境变量便于系统识别squid】
[root@localhost squid-3.5.28]# ln -s /usr/local/squid/sbin/ * /usr/local/bin/
【为/usr/local/squid/var/目录递归指定属主属组】
[root@localhost squid-3.5.28]# chown -R squid.squid /usr/local/squid/var/
【该配置文件的运行机制是自上而下。即匹配之后,自此行之下不再进行匹配】
[root@localhost bin]# vim /etc/squid.conf
【55行以上是访问权限允许的配置,以下是权限拒绝的操作,如果不需要配置权限拒绝的话,可以直接注释配置“允许所有访问”】
55 # And finally deny all other access to this proxy
【因为机制是自上而下,所以需在deny之前。允许放通所有,即允许所有客户机使用代理服务】
56 http_access allow all
57 http_access deny all
61 cache_effective_user squid 【添加指定程序用户,用来设置初始化,运行时缓存的账号,不添加启动不成功】
62 cache_effective_group squid 【添加指定账户基本组】
[root@localhost bin]# squid -k parse 【检测配置文件语法是否正确】
[root@localhost bin]# squid -z 【初始化缓存目录】
[root@localhost bin]# squid 【启动服务】
[root@localhost bin]# netstat -napt | grep squid
tcp6 0 0 :::3128 :::* LISTEN 57070/(squid-1)
[root@localhost bin]# cd /etc/init.d/
[root@localhost init.d]# vim squid 【编写squid服务脚本】
#!/bin/bash
#chkconfig: 2345 90 25 【2345是默认自启动级别,如果是-代表任何级别都不自启动】
【90是启动优先级;25是停止优先级;优先级范围是0-100,数字越大,优先级越低】
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)
$CMD -k kill &> /dev/null
rm -rf $PID &> /dev/null
;;
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@localhost init.d]# chmod +x /etc/init.d/squid 【给予该服务启动脚本可执行权限】
[root@localhost init.d]# chkconfig --add squid 【将该服务加入chkconfig管理】
[root@localhost init.d]# chkconfig --level 35 squid on 【可以在字符界面(3)和视图界面(5)中自启动】
[root@localhost init.d]# chkconfig --list squid 【查看能在几个运行级别中自启动】
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。
要列出 systemd 服务,请执行 'systemctl list-unit-files'。
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'。
【2、3、4、5是脚本中默认的自启动级别】
squid 0:关 1:关 2:开 3:开 4:开 5:开 6:关
2.3 传统代理
【在squid配置文件的63行插入以下3行】
[root@localhost init.d]# vim /etc/squid.conf
【指定缓存功能所使用的内存空间大小,便于保持访问教频繁的Web对象,容量最好为4的倍数,单位为MB。建议设为物理内存的四分之一】
63 cache_mem 64 MB
【允许用户下载的最大文件大小,以字节为单位。默认设置0表示不进行限制】
64 reply_body_max_size 10 MB
【允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,而是直接转发给用户】
65 maximum_object_size 4096 KB
- 重启服务并查看
[root@localhost init.d]# service squid restart
正在关闭 squid...
正在启动 squid....
[root@localhost init.d]# netstat -natp | grep squid
tcp6 0 0 :::3128 :::* LISTEN 97458/(squid-1)
- 生产环境中还需要修改防火墙规则
[root@localhost init.d]# iptables -F
[root@localhost init.d]# setenforce 0
[root@localhost init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
[root@localhost init.d]# service squid reload
[root@localhost init.d]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:squid
2.4 httpd配置
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# netstat -natp | grep 80
tcp6 0 0 :::80 :::* LISTEN 44106/httpd
2.5 开启代理并观察日志
2.6 透明代理服务器构建
- Squid-Server :ens33:192.168.13110 、 ens36:192.168.100.10
- Web : 192.168.100.100
- 客户端 :192.168.131.100
- 配置双网卡
[root@localhost init.d]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36
[root@localhost init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.131.10
NETMASK=255.255.255.0
#GATEWAY=192.168.131.2 【将网关和DNS注释掉,此时本机相当于网关服务器】
#DNS1=192.168.131.2
[root@localhost init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
NAME=ens36 【名称ens36】
#UUID=8b83f99f-7a65-42d7-9510-5b214a8a20de 【因为是直接复制ens33,所以这里的UUID需注释】
DEVICE=ens36 【设备ens36】
ONBOOT=yes
IPADDR=192.168.100.10 【ens36IP地址】
NETMASK=255.255.255.0
#GATEWAY=192.168.100.2 【网关注释】
#DNS1=192.168.100.2 【DNS注释】
[root@localhost init.d]# systemctl restart network
[root@localhost init.d]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.131.10 netmask 255.255.255.0 broadcast 192.168.131.255
inet6 fe80::a642:fac7:7adb:8efb prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:49:74:c2 txqueuelen 1000 (Ethernet)
RX packets 25556 bytes 14832869 (14.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22490 bytes 14555560 (13.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.10 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::ee9:986a:f26c:46e5 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:49:74:cc txqueuelen 1000 (Ethernet)
RX packets 369 bytes 43266 (42.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 51 bytes 7436 (7.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost /]# vim /etc/sysctl.conf 【在此配置文件最后一行添加,开启路由转发】
net.ipv4.ip_forward=1
[root@localhost /]# sysctl -p 【加载内核配置文件】
net.ipv4.ip_forward = 1
【添加静态路由。gw:指定下一跳路由器的 IP 地址】
[root@localhost /]# route add -net 192.168.100.0/24 gw 192.168.131.10
【将配置文件的第60行进行修改,添加提供内网服务的ip地址并开启透明模式的支持】
[root@localhost /]# vim /etc/squid.conf
60 http_port 192.168.131.10:3128 transparent
[root@localhost /]# service squid reload 【重载服务】
[root@localhost /]# iptables -F
[root@localhost /]# iptables -t nat -F
【添加防火墙规则(将100网段:80(HTTP)/443(HTTPS)端口的流量重定向到3128端口)】
[root@localhost /]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.131.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@localhost /]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.131.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
【如果重启的话需要再配置以下规则】
[root@localhost /]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
- Web服务器
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.100 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::d6b9:3f4f:af20:4b7e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:a2:07:46 txqueuelen 1000 (Ethernet)
RX packets 56 bytes 6858 (6.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 93 bytes 10530 (10.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# mount /dev/cdrom /mnt/
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl restart httpd.service
2.7 Windows关闭代理测试
三、ACL访问控制
- 在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现
- 1.使用acl配置项定义需要控制的条件
- 2.通过http_access配置项对已定义的列表做“允许”或“拒绝”访问的控制
- 每行ACL配置可以定义一条访问控制列表,格式如下
- 格式:acl 列表名称 列表类型 列表内容
- 列表名称:名称是自定义,相当于给ACL起个名字(类似于Shell脚本变量名)
- 列表类型:必须使用squid预定义的值,对应不同类别的控制条件
- 列表内容:是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格分隔,相当于“或”的关系)
3.1 方式一
- ACL控制分析
acl localhost src 192.168.131.10/32 【基于源地址为】
acl MYLAN src 192.168.131.0/24 【基于客户机网段】
acl destionhost dst 192.168.131.20/32 【基于目标地址为】
acl MC20 maxconn 30 【基于最大并发连接】
acl PORT port 33 【基于目标端口】
acl DMBLOCK dstdomain .qq.com 【基于目标域,匹配域内所有站点】
【url正则表达式的结构,基于指定的协议进行过滤^rtsp(协议)的控制】
acl BURL url_regex -i ^rtsp:// ^emule:// 【以 rtsp://、emule:// 开头的 URL,-i表示忽略大小写】
【基于访问文件的末尾(格式)】
acl PURL urlpath_regex -i \\.mp3$ \\.mp4$ \\.rmvb$ 【以.mp3、.mp4、.rmvb 结尾的URL路径】
【基于访问时间控制】
acl WORKTIME time MTWHF 0:30-7:30 【时间为周一至周五 0:30~7:30,“MTWHF”为每个星期的英文首字母】
【以上控制是否允许则取决于以下的allow/deny】
[root@localhost /]# vim /etc/squid.conf
8 acl host src 192.168.131.100/24 【IP地址为192.168.131.100.10/24的主机】
32 http_access deny host 【拒绝目标主机访问】
- Win10进行访问测试
3.2 方式二
- squid:192.168.131.10
- Web1:192.168.131.13
- Web2:192.168.131.14
[root@localhost /]# vim /dest.list 【启用对象列表管理】
192.168.131.13 【目标IP】
【调用指定文件中的列表内容】
【如果调用的列表是文件形式,则需要先把文件定义给列表】
【acl 将文件定义的列表(名) dst(目标地址) 定义目标地址的文件路径(绝对路径)】
[root@localhost /]# vim /etc/squid.conf
8 acl destionhost dst "/dest.list"
32 http_access deny destionhost 【拒绝列表】
【如果是拒绝列表,则需要放在http_access allow all前面(上一行)】
[root@localhost /]# service squid restart
- Web1和Web2
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# vim /以上是关于squid代理(反向传统透明)+ACL控制+日志分析的主要内容,如果未能解决你的问题,请参考以下文章
Squid 代理服务器的应用(传统代理透明代理ACL控制列表sarg日志分析反向代理)
squid缓存服务器 ACL访问控制 传统代理 透明代理 squid日志分析 反向代理
部署Squid 代理服务器(内含传统透明代理服务器的配置ACL访问控制日志分析反向代理)