Squid代理服务器搭建和简单使用

1 Squid的介绍

1.1 前言简介

代理服务器(Proxy Server)的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站,是个人网络和Internet服务商之间的中间代理机构,负责转发合法的网络信息,对转发进行控制和登记。 [1]
代理服务器作为连接Internet与Intranet的桥梁,在实际应用中发挥着极其重要的作用,它可用于多个目的,最基本的功能是连接,此外还包括安全性、缓存、内容过滤、访问控制管理等功能。更重要的是,代理服务器是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。

1.2 Squid简介

Squid服务器缓存频繁要求网页、媒体文件和其它加速回答时间并减少带宽堵塞的内容。
Squid代理服务器(Squid proxy server)一般和原始文件一起安装在单独服务器而不是网络服务器上。Squid通过追踪网络中的对象运用起作用。Squid最初担当中介,仅仅是把客户要求传递到服务器并存储要求对象的拷贝。如果同一个客户或同一批客户在要求还在Squid缓存(cache)时要求相同的对象,Squid就可以立刻服务,加速下载并保存带宽。

2 Squid安装和环境

2.1 Squid安装过程

Squid是开源免费的,可以直接到官网查看
博主是在Ubuntu22.04里安装的,Windows应该也可以安装,就是比较麻烦。(不推荐)
输入指令安装

sudo apt-get install squid -y

安装好后输入指令查看一下状态

sudo systemctl status squid

如果绿色字是active(running)就是正常运行,不然就要查看一下下面的logfile显示哪里有错误,如果是未开启的,则输入指令开启,下面有几种常用的指令

sudo systemctl status squid  # 查看状态
sudo systemctl start squid   # 开启服务
sudo systemctl stop squid    # 停止服务
sudo systemctl restart squid # 重启服务

查看日志

journalctl -xeu squid.service

2.2 搭建的环境

需要一台服务器安装好Squid,需要双网卡双IP:
外网IP:172.28.28.0/16,网关:172.28.18.1 内网IP:172.28.18.0/16
需要一台内网的电脑配置内网IP:172.28.18.0/16

2.3 配置环境

先配置内网电脑IP
IP:172.28.18.7/16,网关不用填

因为没网关,正常情况下是无法上网的。

再配置能连接外网的服务器IP
第一网卡(能外网)IP:172.28.28.104/16,网关:172.28.18.1,DNS:119.29.29.29
第二网卡(内网)IP:172.28.18.92/16

测试服务器能否上网
可以使用指令curl www.baidu.com,查看是否出现百度一下

最好查看双IP是否生效

ping 172.28.28.104
ping 172.28.18.92

输入上面指令都通的情况就说明生效了

3 正向代理

3.1 配置Squid配置文件

主配置文件一般都在/etc/squid/squid.conf,我们需要先复制一份做备份,预防修改坏了,使用指令

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak

然后再进行编辑sudo vim /etc/squid/squid.conf,我们找到配置IP地址的那行,默认是没有172.28.0.0/16的,我们环境需要添加一行,再这里我们也能找到默认端口号3128

acl localnet src 172.28.0.0/16

acl:访问列表
src:源IP

然后在编辑子配置文件sudo vim /etc/squid/conf.d/debian.conf,将http_access allow localnet取消注释

最后我们重启一下Squid服务,每次修改配置文件后都需要重启Squid服务来生效

sudo service squid restart

3.2 配置代理服务器

内网电脑正常情况是无法上网的,如图:

我们需要在internet选项设置,依次选择连接→局域网设置

打开局域网设置后,勾选代理服务器,地址填写服务器的内网IP172.28.18.92,端口写3128,然后点确定

我们尝试打开网页,发现可以正常打开网页,其实是不通的。实际我们是通过服务器来上网的。

大部分软件也可以通过添加代理服务器的方式来上网,例如QQ,微信之类,设置方式不尽相同,这里就不展示了。

4 限制访问

我们可以通过修改配置文件来达到限制用户上网,配置文件是通过从上往下来读取指令的。

4.1 限制IP访问

我们可以通过限制固定IP来上网,需要在配置文件里分别位置添加

acl badhost src 172.28.18.7
http_access deny badhost

http_access:加载访问列表
deny:拒绝

因为是从上往下读取的关系,因此需要在http_access allow localhost的上面添加http_access deny badhost
修改完后记得使用指令sudo service squid restart重启Squid服务,之后就不重复这操作了
在内网机器里重新打开网页会提示访问被拒绝

因为只限制了一个IP,只要换个IP就正常了,也可以限制一个IP范围

acl badhost src 172.28.18.7-172.28.18.10

4.2 规定时间内禁止上网

在配置文件里相关地方添加相关语句

acl worktime time MTWHF 17:00-18:00
http_access deny worktime

4.3 禁止访问指定服务器IP

例如禁百度网址,先查看望都网站的IP,在Windows可上网的电脑上打开命令窗口,然后输入nslookup,再输入www.baidu.com,红框里的IP就是百度网站的IP。这种大型网站一般都会变动,每个人查看的IP都不尽相同。

在配置文件里相关地方添加相关语句

acl baddst dst 183.240.98.198
acl baddst dst 183.240.98.161
http_access deny baddst

4.4 禁止访问指定的域名

在配置文件里相关地方添加相关语句,可以用空格来一行多个

acl baddomain dstdomain .taobao.com .pinduoduo.com
http_access deny baddomain

4.5 访问列表组合

例如禁止区域IP访问指定域名

http_access deny badhost baddomain

4.6 # 禁止访问IP地址的网址

需要使用正则表达式来写条件,这样就能杜绝ban了域名还能用IP来访问网站了

acl xhost dstdom_regex ((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])
http_access deny xhost

5 Squid支持WebSocket配置

资料来源于:https://cloud-atlas.readthedocs.io/zh-cn/latest/web/proxy/squid/squid_websocket.html
对于 WebSocket 实际上是HTTP协议连接 upgrade (升级)成 WebSocket 连接,所以,要解决代理服务器兼容WebSocket,需要配置代理服务器允许协议升级( HTTP upgrade request )。

Squid从 v5 版本开始,支持 http_upgrade_request_protocols 配置参数,允许客户端发起的控制和服务器确认机制通过使用HTTP/1.1 Upgrade机制转换成其他协议。

配置 /etc/squid/squid.conf 添加:

http_upgrade_request_protocols WebSocket allow all

需要注意,版本低于 squid v5 无法解析上述配置。例如 Ubuntu 20.04.3 LTS 发行版提供的是 4.10 版本Squid 会出现报错。解决方法是 Ubuntu环境编译Squid 5

6 透明代理

6.1 安装ssl版本Squid

需要使用透明代理的情况,需要另外安装ssl版本。因为需要使用到ssl。

sudo apt-get install squid-openssl

6.2 配置http透明代理

网页一般使用两种端口,一个是http的80端口,一个是https的443端口。
Squid支持http端口。直接修改配置文件,不要修改Squid的默认端口,添加一个端口,这里添加3129这个端口做http的透明代理端口,再添加intercept
PS:intercept模式,支持IP层NAT拦截,将流量传递到此Squid端口。

http_port 3128
http_port 3129 intercept

6.3 配置https透明代理

6.3.1 生成测试证书

https则需要用到ssl证书,这里演示就生成测试用的证书。

mkdir -p /etc/squid/certs/
cd /etc/squid/certs/
# This puts the private key and the self-signed certificate in the same file
openssl req -new -newkey rsa:4096 -sha256 -days 3650 -nodes -x509 -keyout myCA.pem -out myCA.pem
# This can be added to browsers
openssl x509 -in myCA.pem -outform DER -out myCA.der

其中openssl req -new -newkey rsa:4096 -sha256 -days 3650 -nodes -x509 -keyout myCA.pem -out myCA.pem意思是:
OpenSSL创建一个自签名的X.509证书,不要对私钥进行加密,有效期为10年。
输入指令后需要填写各项信息(可以随便填写),1.地方,2.地方省,3.地方区,4.公司,5.组织,6.姓名,7.email
openssl x509 -in myCA.pem -outform DER -out myCA.der意思是:
名为myCA.pem的PEM格式证书文件转换为名为myCA.der的DER格式证书文件,提供测试机导入证书使用。

6.3.2 修改Squid配置文件

编辑Squid配置文件,在http_port 3129 intercept下面添加

https_port 3130 ssl-bump tls-cert=/etc/squid/certs/myCA.pem generate-host-certificates=on dynamic_cert_mem_cache_size=4MB transparent

我们使用3130端口代替https的443端口,tls-cert指定证书位置(需要绝对位置),transparent:透明代理情况下传输数据。
添加语句后如图:

6.4 添加防火墙语句

先查看一下防火墙,这里使用iptables

sudo iptables -t nat -A PREROUTING -s 172.28.0.0/16 -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3130
sudo iptables -t nat -A PREROUTING -s 172.28.0.0/16 -i eth1 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3130
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -t nat -A PREROUTING -s 172.28.0.0/16 -j DNAT -p tcp --dport 53 --to 172.28.18.1
sudo iptables -t nat -A PREROUTING -s 172.28.0.0/16 -j DNAT -p udp --dport 53 --to 172.28.18.1

第一和第二句代表80和443端口转发到代理服务器上:
将所有来自172.28.0.0/16网段且目标端口为443和80的TCP数据包的目标端口更改为3130,并且只处理通过eth1接口进入的数据包。eth1是外网的网卡名称
第三句代表处理地址转换
对所有通过eth0接口离开的数据包执行MASQUERADE操作,即动态地改变它们的源IP地址。处理出口数据。
第四和第五句代表DNS服务转发到代理服务器上:
将所有来自172.28.0.0/16网段且目标端口为53的TCP和UDP数据包的目标IP地址更改为172.28.18.1。

添加完毕后可以输入指令sudo iptables -t nat -L查看状态:

6.5 设置客户机IP和查看效果

6.5.1 设置客户机

因为博主第一台机体已经投入生产了,只能弄第二台服务器来演示透明代理。这里博主的第二台服务器IP发生了少许变化。
外网:172.28.28.105,内网:172.28.38.1

所以客户机设置的IP为:
IP:172.28.38.93/16
网关:172.28.38.1(填写Squid服务器的内网IP)
DNS:172.28.38.1(填写Squid服务器的内网IP)
如图:

1-1.因为现在网站基本都是https,我们需要在Windows导入服务器生成的证书文件。

打开internet属性下的内容,打开证书,点击导入

1-2.点击下一步,选择证书的时候需要点击所有文件,因为我们是自己生成的测试证书。

1-3.选择存放在受信任的根证书颁发机构,然完成

6.5.2 测试效果

配置是限制taobao网,如果没有导入证书,会一直多一步提示有证书危险,可以直接点击忽略就行了。

7 后言

Squid还有很多功能,这里就不一一展示了,可以去官网查看。Squid是一个很强大的代理服务器。或者你们想知道什么功能,我可以查看一下有没这功能, 怎样实现。

posted @ 2024-10-14 17:14  安全兔  阅读(831)  评论(0编辑  收藏  举报