Squid 及正向代理简介
Squid cache(简称为 Squid)是一个流行的自由软件, 它符合 GNU 通用公共许可证. Squid 作为网页服务器的前置 cache 服务器, 可以代理用户向 web 服务器请求数据并进行缓存, 也可以用在局域网中, 使局域网用户通过代理上网. Squid 主要设计用于在 Linux 一类系统运行.-- 摘自 360 百科
本篇博客将详细演示如何使用 squid 实现正向代理以及浏览内容过滤.
所谓正向代理模式, 是指让用户通过 Squid 服务程序获取网站页面等资源, 以及基于访问控制列表 (ACL) 功能对用户访问网站行为进行限制, 在具体的服务方式上又分为标准代理模式与透明代理模式. 标准正向代理模式是把网站数据缓存到服务器本地, 提高数据资源被再次访问时的效率, 但是用户在上网时必须在浏览器等软件中填写代理服务器的 IP 地址与端口号信息, 否则默认不使用代理服务.
Squid 正向代理访问流程
使用 Squid 服务程序提供正向代理服务的拓扑如下图所示. 局域网内的主机如果想要访问外网, 则必须要通过 Squid 服务器提供的代理才行, 这样当 Squid 服务器接收到用户的指令后会向外部发出请求, 然后将接收到的数据交还给发出指令的那个用户, 从而实现了用户的代理上网需求. 另外, 从拓扑图中也不难看出, 企业中的主机要想上网, 就必须要经过公司的网关服务器, 既然这是一条流量的必经之路, 因此企业一般还会把 Squid 服务程序部署到公司服务器位置, 并通过 CL(访问控制列表)功能对企业内员工进行上网审计及限制.
Squid 安装环境准备
这里我准备了两台虚拟机, 鉴于工作中大部分都是 Windows 使用代理, 所以我就使用 Windows 来演示了. 一台安装 Linux, 另外一台安装 Windows, 无论是 Windows 还是 Linux 都是一样的!
服务器端需要准备两块网卡, 一块网卡负责对内通信, 另外一张网卡负责对外通信.
服务器端 Linux: 外网 IP: 172.20.10.2
内网 IP: 192.168.11.2
客户端 Windows: 内网 IP: 192.168.11.137
Linux 服务器
第一步: 代理服务器添加网卡
一个连接外网, 一个连接内网
第二步: 生成网卡配置文件
- [root@ken network-scripts]# cp ifcfg-eth0 ifcfg-eth1
- [root@ken network-scripts]# VIM ifcfg-eth1
- NAME="eth1"
- DEVICE="eth1"
- ONBOOT=yes
- NETBOOT=yes
- BOOTPROTO=static
- TYPE=Ethernet
- IPADDR=192.168.11.2
- NETMASK=255.255.255.0
第三步: 重启网络
至此 Linux 网卡配置完成
- [root@ken network-scripts]# ip a | grep eth1
- 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
- .NET 192.168.11.2/24 brd 192.168.108.255 scope global noprefixroute eth1
Windows 客户端
只需要给客户端添加一个内网 IP 即可
现在可以使用仅主机模式下的 Windows 访问外网, 发现是访问不通的
Squid 安装
第一步: 关闭防火墙
- [root@ken ~]# systemctl stop firewalld
- [root@ken ~]# setenforce 0
第二步: 下载 squid 服务程序
[root@ken ~]# yum install squid -y
第三步: 启动 squid
squid 默认监听的是 3128 端口, 安全起见, 在公司内部布置的正向代理服务器建议修改监听的端口号.
- [root@ken ~]# systemctl restart squid
- [root@ken ~]# ss -tnl | grep 3128
- LISTEN 0 1024 :::3128 :::*
Squid 实现正向代理
其实下载并启动完成之后, 我们就可以使用 squid 代理服务了.
第一步: 打开你的浏览器工具 > Internet 选项, 看到如下界面
第二步: 点击连接>局域网设置
可以看到如下的界面
第三步: 填写服务器端内网 IP 及 squid 的端口号, 点击确定即可.
填写的是内网代理端的内网 IP, 可以和客户端通信的 IP 网段
第四步: 浏览器测试
刷新浏览器即可发现仅主机模式下的 Windows 也可以上网了
Squid 常用的访问控制列表
url_regex 与 urlpath_regex 的区别
1. url_regex
url_regex ACL 用于匹配请求 URL 的任何部分, 包括传输协议和原始服务器主机名. 例如, 如下 ACL 匹配从 FTP 服务器的 MP3 文件请求:
- acl FTPMP3 url_regex -i ^ftp://.*\.mp3$
- 2. urlpath_regex
urlpath_regex 与 url_regex 非常相似, 不过传输协议和主机名不包含在匹配条件里. 这让某些类型的检测非常容易. 例如, 假设你必须拒绝 URL 里的 "sex", 但仍允许在主机名里含有 "sex" 的请求, 那么这样做:
acl Sex urlpath_regex sex
另一个例子, 假如你想特殊处理 CGI-bin 请求, 你能这样捕获它们:
acl CGI1 urlpath_regex ^/CGI-bin
当然, CGI 程序并非总在 / CGI-bin / 目录下, 这样你应该编写其他的 ACL 来捕获它们.
总结
1. url_regex 匹配整个 URL 部分, 包含传输协议和主机名
2. urlpath_regex 不包含传输协议和主机名
3. 可以单独使用 url_regex 完成百分之 90 以上的工作
4. url_regex 和 urlpath_regex 都支持正则
5. URL 中的. 需要使用 \ 进行转义
Squid 正向代理之 ACL 访问控制
演示一: 只允许 192.168.43.1 主机使用代理服务
第一步: 修改配置文件
acl ken src 192.168.43.1/24 : 定义了一个别名 ken
http_access all ken : 定义了允许来自 ken 的访问
http_access deny all : 拒绝其他任何主机的访问
- [root@ken ~]# VIM /etc/squid/squid.conf
- ...
- 27 acl ken src 192.168.43.1/24
- 28
- 29 #
- 30 # Recommended minimum Access Permission configuration:
- 31 #
- 32 # Deny requests to certain unsafe ports
- 33 http_access all ken
- 34 http_access deny all
- ...
第二步: 重启 squid 服务
[root@ken ~]# systemctl restart squid
第三步: Windows 端刷新界面
发现已经上不去网了
演示二: 禁止访问 www.baidu.com 网站
在做一个演示的时候把之前定义的规则都删掉
第一步: 修改配置文件
- acl ken url_regex www.baidu.com #定义 url_regex 规则
- acl kenken src 192.168.11.137 #定义客户端地址
- #
- # Recommended minimum Access Permission configuration:
- #
- # Deny requests to certain unsafe ports
- http_access deny ken #拒接 url
- http_access allow kenken #接受客户端地址的访问
第二步: 重启服务
[root@ken ~]# systemctl restart squid
第三步: Windows 端查看
现在我的博客又能访问了
现在访问下百度网站试试
现在访问被拒绝了, 说明我们配置是生效的
演示三: 禁止网址中包含 Redis 的网站
第一步: 修改配置文件
添加如下内容
.* 表示任意长度的任意内容
- acl ken url_regex .*Redis.*
- acl kenken src 192.168.11.137
- #
- # Recommended minimum Access Permission configuration:
- #
- # Deny requests to certain unsafe ports
- http_access deny ken
- http_access allow kenken
第二步: 重启服务
[root@ken ~]# systemctl restart squid
第三步: Windows 端查看
现在我的博客还是能访问的
浏览一下 redisdoc 网站
可以发现只要带有 Redis 的网站都会被拒绝访问
演示四: 禁止访问网址中以 mp3 为结尾的网站
这个我就不演示了无非就是添加一条 acl ken url_regex .*mp3$
acl 写来写去还是考验大家的正则表达式
大家有兴趣的可以找一个这样的网站来测试一下
演示五: 基于时间段 20:00-8:00
第一步: 修改配置文件
定义一个时间段
拒绝该时间段的访问
- acl ken time 20:00-23:50
- acl kenken src 192.168.11.137
- #
- # Recommended minimum Access Permission configuration:
- #
- # Deny requests to certain unsafe ports
- http_access deny ken
- http_access allow kenken
第二步: 重启服务
[root@ken ~]# systemctl restart squid
第三步: Windows 端查看
该时段下的上网服务会被拒绝
来源: https://www.cnblogs.com/kenken2018/p/9994370.html