squid:
客户端实际上是访问代理服务器,代理服务器再把结果返回给客户端
还有缓存的功能
应用在应用层
正向代理:代理上网
无论是正向代理还是反向代理都可以进行网络控制
正向和反向看客户端
客户端访问代理服务器,看代理服务器里面有没有缓存,有缓存的话,直接使用缓存,没有的话,代理服务器向远端服务器发送请求,远端
一般只缓存静态页面,动态页面会变化不适合缓存。
提高web服务器的安全性
3种代理方式
正向代理、透明代理、反向代理
正向代理的目的:为了实现内网正常上网
就像DNS转发一样
缺点:用户需要对浏览器进行设置
透明代理:
优点:不需要对浏览器进行设置
反向代理:
外网客户端通过代理服务器,能够访问内网
以下是正向代理:
环境:
web:192.168.10.11(clone1)
squid:192.168.10.13、192.168.1.250注意这个代理服务器虚拟机有两个网卡
client:192.168.1.1
start:
正向代理:
1.250:
systemctlstart httpd
yum install-y squid(代理服务器的软件装在哪里哪里就是代理服务器)
systemctlstart squid
火狐-首选项-高级-网络-设置-手动配置代理-HTTP代理:192.168.1.250,端口3128
qq浏览器(开启极速模式)-设置-高级-更改代理服务器设置-局域网设置:192.168.1.250,端口3128
你会发现可以访问代理服务器另一个网卡的网段了
正向代理总结:
物理机是1网段的,浏览器的设置代理就写代理服务器中1网段的网卡,
然后在浏览器可以访问代理服务器另一个网卡的网段了
克隆1把真机屏蔽掉
iptables -AINPUT -s 10.11 -p tcp --dport 80 -j REJECT
能ping通10.11,但是访问不了curl不通
克隆2可以(绕道上网)
systemctlstart squid
浏览器设置192.168.10.12可以访问10.11了
透明代理:
环境:
start:
10.11机:
先把浏览器上的代理去掉
vim/etc/squid/squid.conf
59行在3128后面加上 transparent表示是透明代理
systemctlrestart squid重启服务
iptables -tnat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port3128设置防火墙策略地址转换,iptables -S查看设置成功了没
-t:指定操作的是哪张表,nat表是做地址转换的
-A:添加一条策略
PREROUTING:路由前
-s IP:指定源IP
-p tcp:协议
--dport:目标端口
-j :指定动作
REDIRECT:重定向
--to-port 端口:重定向到某个端口
切换一台不同网段的虚拟机操作:
route -n查看路由表
ping 10.11不通
route adddefault gw 192.168.1.250把网关设置成代理服务器ip
或
route add-net 192.168.56.57 netmask 255.255.255.255 gw 192.168.1.63
-net后面的ip如果是写全的话,子网掩码是4个255,
-net后面的ip如果是.0结尾的话就是一个网段,3个255
ping不通10.11,但是可以访问,可以curl通
route deldefault gw 192.168.1.250删除nat刚才的设置
iptables -F是刷新清空
route -n可以查看生效了没
同一网段是如何发送的?不同网段又是如何发送的?
比如说192.168.10.11和192.168.10.12怎么通信?
首先通过自己的子网掩码24和对方相比是否一样,如果一样,通过广播获取对方的mac地址,将数据传送给对方的mac地址:
data、目标端口、自己端口、目标ip、自己ip、目标mac、自己mac
对方收到之后会拆分data,里面有来源的位置,可以回应他
如果不一样,就访问
反向代理:
通过缓存反向加速代理:
访问的是代理服务器,而不是真正的服务器
squid不要用3128端口了,改成80端口
vim/etc/squid/squid.conf
安装软件:
# yum install squid -y
关闭防火墙
修改配置文件
# vim /etc/squid/squid.conf
#将端口监听在 192.168.1.250:80 上,accel 指加速模式,vhost,vport 用于转发请求
http_port 192.168.1.250:80 accel vhost vport在59行虚拟端口
#计算机名,可以为IP地址,用于错误页面的显示
visible_hostname desk.up.com改了主机名导致服务起不来就要加这条了
#使用多大的内存作为缓存,不能大于物理内存的三分之一
cache_mem 16 MB注意有MB空格
#缓存目录大小为512M,这个可以按实际磁盘大小来定,有16二级目录,每个二级目录下有256个子目录
cache_dir ufs /var/spool/squid 512 16 256
#最大缓存文件大小为 4MB ,超过的直接传给用户,不作缓存
maximum_object_size 4 MB
#访问日志文件路径,记录了用户访问 Internet 的详细信息,可以查看每用户的上网记录
cache_access_log /var/log/squid/access.log
#缓存日志文件路径,记录了缓存相关的日志信息
cache_log /var/log/squid/cache.log
#网页缓存日志文件路径,记录了网页在缓存中调用情况
cache_store_log /var/log/squid/store.log
#缓存磁盘空间大于 90% 时自动清理
cache_swap_high 90
#清理到 80% 时停止
cache_swap_low 80
#cache_peer 后端真实服务器地址,端口,0 为 ICP 端口号(多个 Squid 时用),originserver原始资源服务器 调度策略 服务器权重,如果服务器有多台的话round-robin允许轮循
cache_peer 192.168.10.12 parent 80 0 originserver round-robin weight=1
重启服务
[root@squid ~]# systemctl restart squid
怎么看使用了缓存
echo clone1 > /var/www/html/index.html
cd/var/log/squid
vimaccess.log里面可以查看缓存日志
TCP_MISS是没有命中缓存,HIT是命中了缓存
cd/var/spool/squid/这个是缓存的目录
如果服务器有多台的话:
在cache_peer192.168.10.12 parent 80 0 originserver上面添加一条round-robin允许轮循:
cache_peer192.168.10.11 parent 80 0 originserver round-robin weight=1
cache_peer192.168.10.1 parent 80 0 originserver round-robin weight=1
重新巩固:
正向代理:(正向代理不该注释的不要注释掉)
第一步:代理机的两个网卡是56.63、1.63,在代理机上安装代理软件四驱id:
yum install-y squid
systemctlstart squid
第二步:浏览器上设置代理ip和3128端口即可(代理的端口是38中间有个12)
透明代理:
第一步:关闭浏览器代理设置,修改代理机的代理配置文件:
vim/etc/squid/squid.conf
第59行后面追加transparent
systemctlrestart squid
第二步:代理机:清除防火墙策略,并设置防火墙端口重定向策略:
iptables -tnat -F
iptables -tnat -A PREROUTING -s 192.168.1.0/24客户机网段 -p tcp --dport 80 -j REDIRECT --to-port 3128
第三步:客户机:添加一个代理ip的路由网关:
route add -net192.168.56.57 netmask 255.255.255.255 gw 192.168.1.63
可以curl 192.168.56.57了
反向代理:
第一步:代理机:清空防火墙策略,并修改代理机的代理配置文件
iptables -tnat -F
vim/etc/squid/squid.conf
http_port192.168.1.63:80 accel vhost vport从第59行开始添加
visible_hostnamelitao5663
cache_mem 16MB
cache_dirufs /var/spool/squid 512 16 256
maximum_object_size4 MB
cache_access_log/var/log/squid/access.log
cache_log/var/log/squid/cache.log
cache_store_log/var/log/squid/store.log
cache_swap_high90
cache_swap_low80
cache_peer192.168.56.57真实服务器地址 parent 80 0originserver round-robin weight=1
systemctlrestart squid
第二步:客户机:客户机去访问代理服务器
curl192.168.1.63反向代理是客户机访问代理服务器,而不是访问真实服务器
mysql方框形状的,添加字段很浪费空间
nosql可以添加字段,比mysql更节省空间
mangleDB基于mysql和nosql之间,可以存放大量数据
面向图形化的数据库
代理的ACL访问控制:
ACL访问控制: 不能上网
vim/var/log/squid
acl 定义元素
使用deny禁止,allow允许访问
acl就是将一个东西本地网络 源地址做标记:
acl localnetsrc
格式:acl 名字 类型
源地址src目标地址dst
源端口port
源域srcdomain目标域dstdomain
域名里面包含的东西、正则匹配
proto协议
src:指明源地址。可以用以下的方法指定:
acl aclname src ip-address/netmask ... 客户ip地址
acl aclname src addr1-addr2/netmask ... 地址范围
dst:指明目标地址,即客户请求的服务器的IP地址。语法为:
acl aclname dst ip-address/netmask ...
srcdomain:指明客户所属的域,Squid将根据客户IP反向查询DNS。语法为:
acl aclname srcdomain foo.com ...
dstdomain:指明请求服务器所属的域,由客户请求的URL决定。语法为:
acl aclname dstdomain foo.com ...。此处需要注意的是:如果用户使用服务器IP而非完整的域名时,Squid将进行反向的DNS解析来确定其完整域名,如果失败,就记录为“none”。
time:指明访问时间。语法如下:
acl aclname time [day-abbrevs] [h1:m1-h2:m2] [hh:mm-hh:mm]
日期的缩写指代关系如下:
1. S:指代Sunday
2. M:指代Monday
3. T:指代Tuesday
4. W:指代Wednesday
5. H:指代Thursday
6. F:指代Friday
7. A:指代Saturday
另外,h1:m1必须小于h2:m2,表达式为[hh:mm-hh:mm]。
port:指定访问端口。可以指定多个端口,比如:
acl aclname port 80 70 21 ...
acl aclname port 0-1024 ... 指定一个端口范围
proto:指定使用协议。可以指定多个协议:
acl aclname proto HTTP FTP ...
method:指定请求方法。比如:
acl aclname method GET POST ...
url_regex:URL规则表达式匹配,语法为:
acl aclname url_regex [-i] pattern
urlpath_regex:URL-path规则表达式匹配,略去协议和主机名。其语法为:
acl aclname urlpath_regex [-i] pattern
在使用上述ACL元素的过程中,要注意如下几点:
1. acltype可以是任一个在ACL中定义的名称。
2. 任何两个ACL元素不能用相同的名字。
3. 每个ACL由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换句话说,任一ACL元素的值被匹配,则这个ACL元素即被匹配。
4. 并不是所有的ACL元素都能使用访问列表中的全部类型。
5. 不同的ACL元素写在不同行中,Squid将这些元素组合在一个列表中。
2. http_access访问控制列表
根据访问控制列表允许或禁止某一类用户访问。如果某个访问没有相符合的项目,则默认为应用最后一条项目的“非”。比如最后一条为允许,则默认就是禁止。通常应该把最后的条目设为“deny all”或“allow all”来避免安全性隐患。
使用该访问控制列表要注意如下问题:
1. 这些规则按照从上到下的顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即结束。
2. 如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。
3. 一个访问条目中的所有元素用逻辑与连接
4. 一个acl元素中的多个参数用逻辑或连接
把56行上面的全部都注释掉,重启服务任何人都不能反问了
开启80端口的访问:
第15行开启
并把下面的!改为allow,!是取反的意思
http_accessallow Safe_ports
例如周一~周五早8点到晚上6点
15行下面插入:
acl worktimetime MTWHF 8:00-18:00
http_accessallow Safe_ports worktime可以写在一起
aclSafe_ports port 21 20 80 443 1024-65534或的关系
例子:
3. 代理的ACL访问控制实例:
(1)允许网段10.0.0.0/8内的所有客户机以及在文件/etc/squid/allow-hosts列出的客户机访问代理服务器
acl allow_hosts src 10.0.0.0/8 “/etc/squid/allow-hosts”文件位置固定的
httpd_access allow allow_hosts 写到默认策略上面
start:
全注释
acl allow_hosts src 10.14 “/etc/squid/allow_hosts”位置要放对
httpd_access allow allow_hosts
vim /tmp/hosts
10.15
经验:看到10.0.0.0/8肯定是src类型
(2)允许域名为job.net、gdfq.edu.cn的两个域访问代理服务器,其他的域都将拒绝访问代理服务器
acl allow_dom srcdomainjob.net gdfq.edu.cn
经验:看到域名肯定是源域
(3)使用正则表达式,拒绝客户机通过代理服务器访问url中包含有诸如“sexy”等关键字的网站
acl deny_list url_regex -isexy
http_access denydeny_access
经验:看到关键字是正则
http_access deny deny_access要写在allow的上面,因为一旦匹配到了就不在往下面执行了
(4)只允许管理员192.168.10.1访问网站http://www.qq.com,其他人不能访问此网站,但是可以访问其他网站
acl deny_dom dstdomain www.qq.comm
acl manager src 192.168.10.1
http_access allow manager
http_access deny deny_dom顺序不能颠倒
这些规则按照从上到下的顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即结束。
想象:如果不是管理员,就不能访问,如果是管理员,就能访问,不执行下面的那个拒绝了
经验:看到www.qq.com就是目标域
看到192.168.10.1就是
(5)允许所有的用户在上班时间(周一至周五的8:30到18:00)访问代理服务器,其他时间不能访问; 系统管理员192.168.10.1可以在任何时间访问
acl workdaytime MTWHF
acl worktimetime 8:30-18:00
acl managerssrc 192.168.10.1
http_accessallow managers
http_accessdeny !workday
http_accessdeny !worktime
查看日志检查哪里报错:vim /var/log/messages
重新巩固:
代理服务器ACL访问控制:
关键:从上到下的顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即结束
关键:时间是看代理机的时间