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是一个很强大的代理服务器。或者你们想知道什么功能,我可以查看一下有没这功能, 怎样实现。