一、简介

Squid 是一个高性能的代理缓存服务器,对应中文的乌贼,鱿鱼的意思。Squid 支持 FTP,gopher 和 HTTP 协议。和一般的代理缓存软件不同,Squid 用一个单独的,非模块化的,I/O 驱动的进程来处理所有的客户端请求。

Squid 将数据元缓存在内存和硬盘中,同时也缓存 DNS 查询的结果。Squid 支持 SSL,支持访问控制。由于使用了 ICP(轻量 Internet 缓存协议),Squid 能够实现层叠的代理阵列,从而最大限度的节约带宽。

Squid Cache(简称 Squid)是一个流行的代理服务器和 Web 缓存服务器软件。Squid 可以做正向代理,也可以做反向代理。官方网站地址为:http://www.squid-cache.org/

1.1 正向代理

当 Squid 做正向代理时,Squid 后面是客户端,客户端想访问外部网络资源,必须经过 Squid。正向代理按其客户端配置方式不同,又可以分为标准(普通)代理模式和透明代理模式。

标准(普通)代理模式,是代理内部网络用户访问 internet 上服务器的连接请求,客户端必须指定代理服务器,并将本来要直接发送到 internet 上服务器的连接请求发送给代理服务器处理。用户在上网时必须在浏览器等软件中填写代理服务器的 IP 地址与端口号信息,否则默认不使用代理。

透明代理模式,是相对于代理服务器而言,客户端不需要做任何和代理服务器相关的设置和操作,对用户而言,感觉不到代理服务器的存在,所以称之为透明代理。即把代理服务器部署在核心的上网出口,当用户上网浏览页面时,会交给代理服务器向外请求,如果结合iptables,可以实现代理+网关+内容过滤+流量安全控制等完整的上网解决方案。

1.2 反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

综上,正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见;而反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见。

二、配置 Squid 正向代理

2.1 安装 squid

可以使用源码编译安装,或者使用 yum 直接安装,如下:

[root@masternode ~]# yum install -y squid
[root@masternode ~]# squid -v
Squid Cache: Version 3.5.
......

使用 yum 安装后,系统会自动生成 squid 用户和用户组,如下:

2.2 配置 squid

可以使用 squid 默认的配置文件,因为默认的配置文件其实就已经设置了正向代理,也可以修改默认的配置文件,如下:

[root@masternode ~]# vim /etc/squid/squid.conf
# 默认对外端口为3128
http_port 3128 cache_effective_user squid
cache_effective_group squid # 内网控制,按需修改
acl manager proto cache_object
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network # 配置可访问的端口
acl SSL_ports port 443
acl Safe_ports port 80 8080 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT # 允许本机访问
http_access allow manager localhost
http_access deny manager http_access deny !Safe_ports # 拒绝443以外的端口访问
http_access deny CONNECT !SSL_ports # 允许内网
http_access allow localnet
http_access allow localhost http_access allow all # 设置缓存文件位置、cache目录容量(单位M)、一级缓存目录数量、二级缓存目录数量
cache_dir ufs /var/spool/squid 128 16 256
cache_mem 128 MB
coredump_dir /var/spool/squid refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

其中 http_port 设置监听的端口号,cache_mem 设置内存缓冲区的大小,cache_dir 设置硬盘缓存区的大小,cache_effective_user 设置缓存的有效用户,cache_effective_group 设置缓存的有效用户组。

2.3 启动 squid

启动 squid 并检查配置文件,如下:

[root@masternode ~]# systemctl start squid
[root@masternode ~]# squid -kcheck

# squid -kcheck(可简写为 squid -kch)可以检查配置文件是否有错,修改配置建文件后,可以使用 # squid -kreconfigure(可简写为 # squid -krec)来重新加载配置文件。

2.4 验证代理

可以使用浏览器设置代理的方式,也可以直接使用 curl 命令来测试,其中 -x 选项即 --proxy,添加代理服务器地址和端口,如下:

显示了百度首页的 html 源码,说明 squid 正向代理设置成功。

然后我们再来看 squid 对图片的缓存。如下:

其中 MISS 表示丢失,HIT 表示命中。当 cache server 第一次接收到对第一个新资源的请求时,就会产生一个 cache 丢失,而 cache 命中是在 cache server 每次从它的缓存里满足客户端 HTTP 请求时发生。

我在 Windows 宿主机上面使用代理访问百度,如下:

2.5 ACL 访问控制

1)只允许 IP 地址为 192.168.0.105 的客户端使用服务器上的 squid 服务程序提供的代理服务,禁止其余所有的主机代理请求

编辑 /etc/squid/squid.conf,添加如下设置:

acl client src 192.168.0.105
http_access allow client
http_access deny all

由于虚拟机网络使用了桥接模式,今天启动 squid 服务器之后,发现 IP 地址变成了 192.168.0.107,所以代理服务器的地址就要变成这个新的地址。

宿主机的 IP 地址为 192.168.0.101,使用代理服务器访问百度时,返回 403 Forbidden,如下:

而 另一台 虚拟机 backupnode 的 IP 地址为 192.168.0.105,所以它使用代理服务器访问百度时返回 200 OK,如下:

2)禁止所有客户端访问网址中包含 taobao 关键词的网站

编辑 /etc/squid/squid.conf,添加如下设置:

acl deny_keyword url_regex -i taobao
http_access deny deny_keyword

-i 表示不区分大小写,可以看到访问的网址中包含 taobao 时,返回 403 Forbidden,如果访问不带 taobao,比如换成 baobao 时,可以正常访问,如下:

3)禁止所有客户端访问某个特定的网站

如上面所示,编辑 /etc/squid/squid.conf,添加如下设置:

acl deny_url url_regex http://www.youku.com
http_access deny deny_url

4)禁止下载带有某些后缀的文件,比如 .rar 和 .avi

编辑 /etc/squid/squid.conf,添加如下设置:

acl badfile urlpath_regex -i \.rar$ \.avi$
http_access deny badfile

如有有人使用迅雷等 P2P 下载软件来下载资源的话,就只能使用专业级的应用防火墙来禁止了。

三、配置 Squid 反向代理

网站页面是由静态资源和动态资源一起组成的,其中静态资源包括网站架构 CSS/js 文件、大量的图片、视频等数据,这些数据相对于动态资源来说更加稳定,一般不会经常发生改变。但是随着建站技术的更新换代,外加人们不断提升的审美能力,这些静态资源占据的网站空间也越来越多。如果能够把这些静态资源从网站页面中抽离出去,然后在全国各地部署静态资源的缓存节点,这样不仅可以提升用户访问网站的速度,而且网站源服务器也会因为这些缓存节点的存在而降低负载。

方向代理是 Squid 服务程序的一种重要模式,其原理是把一部分原本向网站源服务器发起的用户请求交给 Squid 服务器缓存节点来处理。但是这种技术的弊端也很明显,如果有心怀不轨的人将自己的域名和服务器反向代理到某个知名的网站上面,从理论上来讲,当用户访问到这个域名时,也会看到与那个知名网站一样的内容(有些诈骗网站就是这样骗取用户信任的)。因此,当前许多网站都默认禁止了反向代理功能。开启了 CDN(内容分发网络)服务的网站也可以避免这种窃取行为。如果访问开启了防护功能的网站,一般会提示 500 错误。

将端口号 "http_port 3128" 修改为 "http_port 80 accel vhost vport",此时正向解析会被暂停,它不能与反向代理服务同时使用,然后再增加你要代理的后端真实服务器的信息。

编辑 /etc/squid/squid.conf,添加如下设置:

# 默认对外端口为3128
#http_port 3128
# 配置反向代理
http_port 80 accel vhost vport
cache_peer 14.215.177.38 parent 80 0 originserver name=baidu
cache_peer 61.151.166.146 parent 80 0 originserver name=qq
cache_peer_domain baidu www.baidu.com
cache_peer_domain qq www.qq.com

可以看到我们分别设置代理了后面的真实服务器, baidu 和 qq。

可以正常访问 baidu(返回 200,正常) 和 qq(返回 302,要求浏览器重定向到 https。解释一下:当客户端访问 http://www.qq.com 时,先经过了 squid 反向代理服务器,由于 squid 反向代理了 www.qq.com,于是将请求转发给 61.151.166.146,真实服务器检测到该请求为 http 请求,返回 302 响应码,要求临时重定向到 https://www.qq.com)。

由于没有配置反向代理 sina 和 sohu,所以上述请求都返回 500 错误。

四、Squid 服务常用命令选项

[root@masternode squid]# squid -h
Usage: squid [-cdhvzCFNRVYX] [-n name] [-s | -l facility] [-f config-file] [-[au] port] [-k signal]
-a port Specify HTTP port number (default: 3128).
-d level Write debugging to stderr also.
-f file Use given config-file instead of
/etc/squid/squid.conf
-h Print help message.
-k reconfigure|rotate|shutdown|restart|interrupt|kill|debug|check|parse
Parse configuration file, then send signal to
running copy (except -k parse) and exit.
-n name Specify service name to use for service operations
default is: squid.
-s | -l facility
Enable logging to syslog.
-u port Specify ICP port number (default: 3130), disable with 0.
-v Print version.
-z Create missing swap directories and then exit.
-C Do not catch fatal signals.
-D OBSOLETE. Scheduled for removal.
-F Don't serve any requests until store is rebuilt.
-N No daemon mode.
-R Do not set REUSEADDR on port.
-S Double-check swap during rebuild.
-X Force full debugging.
-Y Only return UDP_HIT or UDP_MISS_NOFETCH during fast reload.

虽然命令有很多,但是常用的选项就是上面提到的 squid -k check,squid -k reconfigure 和 squid -k parse,这些命令均可以简写成:

# squid -kche(或 squid -k che),表示检查 squid.conf 配置文件是否有语法或配置错误。

# squid -krec(或 squid -k rec),表示当 squid.conf 进行过配置更改后,可以使用该命令进行 squid 配置重载,而不用重启 squid 服务,相当于热加载。

# squid -kpar(或 squid -k par),表示如果 squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,尝试启动 squid。

Linux 笔记 - 第十九章 配置 Squid 正向代理和反向代理服务的更多相关文章

  1. Linux 笔记 - 第二十四章 配置 Tomcat

    一.前言 Tomcat 是 Apache 软件基金会(Apache Software Foundation)Jakarta 项目中的核心项目,由 Apache.Sun 和其他一些公司及个人共同开发.使 ...

  2. Apache的代理服务器的配置 (正向代理 ,反向代理,轮询调度)

    一. 代理服务器的了解1.代理服务器 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自 ...

  3. Linux 笔记 - 第十四章 LAMP 之(二) 环境配置

    博客地址:http://www.moonxy.com 一.前言 LAMP 环境搭建好之后,其实仅仅是安装上了软件,我们还需要掌握 httpd 和 PHP 的配置. 二.httpd 配置 2.1 创建虚 ...

  4. Linux 笔记 - 第二十二章 Nginx 配置 SSL

    一.前言 基础知识 1.1 公钥密码体制(public-key cryptography) 公钥密码体制分为三个部分,公钥.私钥.加密解密算法,它的加密解密过程如下: 加密:通过加密算法和公钥对内容( ...

  5. Linux 笔记 - 第十六章 LNMP 之(一) 环境搭建

    博客地址:http://www.moonxy.com 一.前言 LNMP 中的 N 指 Nginx,在静态页面的处理上,Nginx 较 Apache 更胜一筹:但在动态页面的处理上,Nginx 并不比 ...

  6. Linux 笔记 - 第十五章 MySQL 常用操作和 phpMyAdmin

    博客地址:http://www.moonxy.com 一.前言 前面几章介绍了 MySQL 的安装和简单的配置,只会这些还不够,作为 Linux 系统管理员,我们还需要掌握一些基本的操作,以满足日常管 ...

  7. Linux 笔记 - 第十四章 LAMP 之(一) 环境搭建

    博客地址:http://www.moonxy.com 一.前言 LAMP 是 Linux Apache MySQL PHP 的简写,即把 Apache.MySQL 以及 PHP 安装在 Linux 系 ...

  8. Programming In Scala笔记-第十九章、类型参数,协变逆变,上界下界

    本章主要讲Scala中的类型参数化.本章主要分成三个部分,第一部分实现一个函数式队列的数据结构,第二部分实现该结构的内部细节,最后一个部分解释其中的关键知识点.接下来的实例中将该函数式队列命名为Que ...

  9. Linux 笔记 - 第十二章 Shell 脚本

    博客地址:http://www.moonxy.com 一.前言 常见的编程语言分为两类:一类是编译型语言,如:C.C++ 和 Java等,它们远行前要经过编译器的编译.另一类是解释型语言,不需要编译, ...

随机推荐

  1. Laya 中缩放的实现

    Laya 缩放功能的实现 在 laya 中实现滚轮对选中对象的缩放,涉及到以下两个模块: 事件 容器坐标 1. 事件 在 Laya 中, Event 是事件类型的集合.包含了常见的鼠标事件.键盘事件. ...

  2. 在linux中用同一个版本的R 同时安装 Seurat2 和 Seurat3

    在linux中用同一个版本的R 同时安装 Seurat 2 和 Seurat 3 Seurat  作为单细胞分析中的重量级R包,有多好用用,用过的人都知道.Seurat 分析流程基本涵盖了单细胞分析中 ...

  3. 史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  4. var let及const

    es6已经发布很久了,之前只会用var定义变量,学习了let和const后,又学到了一些作用域.JavaScript编译和深拷贝浅拷贝的知识.这章主要来说说这三个定义量的方法: 1.var 在没学习e ...

  5. poli-java开源BI软件

    目录 快速入门 Github地址: 特性 一个易于使用的SQL报告应用程序,专为SQL爱好者而设计. SQL中的电源数据分析,可获得更快的业务洞察力. 快速入门 https://shzlw.githu ...

  6. 微服务SpringCloud之Spring Cloud Config配置中心服务化

    在前面两篇Spring Cloud Config配置中心的博客中都是需要指定配置服务的地址url:spring.cloud.config.uri,客户端都是直接调用配置中心的server端来获取配置文 ...

  7. SSH密码和秘钥认证原理

    SSH登录方式主要分为两种: 1. 用户名密码验证方式 说明: (1) 当客户端发起ssh请求,服务器会把自己的公钥发送给用户: (2) 用户会根据服务器发来的公钥对密码进行加密: (3) 加密后的信 ...

  8. Codeforces 976F

    题意略. 思路:为了保证每个点都有至少k条边覆盖,我们可以让二分图的左半边与源点s相连,连容量为indegree[i] - k的边(如果正着想不好想,我们可以想它的反面, 限制它反面的上限,从而保证我 ...

  9. Python 基础 2-3 列表的反转与排序

    引言 列表是按照特定格式排序而成的,有时候这种排序方式我们并不喜欢,我们希望它可以按照我们的方式来进行正序或者倒序排序,或其他的排序方式 反转与排序 比如说我这里有一组列表,里面存放的全部都是数值,但 ...

  10. NLP(二十四)使用LSTM构建生成式聊天机器人

    准备 数据集:AIML数据集 下载数据集并用Notepad++打开,复制到txt文件中方便打开 代码实现 数据很少,训练轮次不多,结果不好,仅当示例 import numpy as np import ...