您的位置:首页 > 运维架构 > 反向代理

坚持#第263天~squid代理(正想代理、透明代理、反向代理)

2018-01-08 22:08 369 查看
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访问控制:

关键:从上到下的顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即结束

关键:时间是看代理机的时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: