使用Squid部署代理缓存服务
正向代理不仅可以让用户使用squid代理服务器上网,还可以基于IP地址、网站关键字、下载文件后缀等实现类似行为管控的功能。
反向代理可以大幅提升网站的访问速度,减轻网站服务器的负载压力。
- 虚拟机配置
- 服务端IP
[[email protected] ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.16.10 netmask 255.255.255.0 broadcast 192.168.16.255
inet6 fe80::6bea:7e4d:fd17:8225 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:08:3e:47 txqueuelen 1000 (Ethernet)
RX packets 6 bytes 726 (726.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 266 bytes 25392 (24.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.157 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::119b:77df:e22:7194 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:08:3e:51 txqueuelen 1000 (Ethernet)
RX packets 38296 bytes 2498587 (2.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1261 bytes 125135 (122.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 服务端安装squid
[[email protected] ~]# yum install -y squid
[[email protected] ~]# systemctl restart squid
[[email protected] ~]# systemctl enable squid
Created symlink from /etc/systemd/system/multi-user.target.wants/squid.service to /usr/lib/systemd/system/squid.service.
- 标准正向代理——客户端设置,IE选项设置
C:\Users\Administrator>ping www.baidu.com
Ping 请求找不到主机 www.baidu.com。请检查该名称,然后重试。 #外网不通
3128端口号是squid标准正向解析的默认监听端口,设置完成之后依然是无法ping通外网的,但是可以打开网页了
- 服务端修改squid配置文件
[[email protected] ~]# vim /etc/squid/squid.conf
http_port 10000 #大约第59行,将默认的3128端口修改为10000
[[email protected] ~]# systemctl restart squid
- 配置selinux
[[email protected] ~]# semanage port -l | grep squid
squid_port_t tcp 3128, 3401, 4827
squid_port_t udp 3401, 4827
[[email protected] ~]# semanage port -a -t squid_port_t -p tcp 10000
[[email protected] ~]# systemctl restart squid
- 客户端修改默认端口号
修改IE选项中的端口号为10000
重新打开网页,成功
- 透明正向代理——客户端还原IE选项
[[email protected] ~]# iptables -t nat -A POSTROUTING -p udp --dport 53 -o ens37 -j MASQUERADE #DNS流量转发,端口默认53
[[email protected] ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #新增此行,允许Squid服务器转发IPv4数据包
[[email protected] ~]# sysctl -p #让转发参数立即生效
net.ipv4.ip_forward = 1
客户端网关和DNS设置
网关为192.168.16.10
DNS位114.114.114.114
此时ping www.baidu.com进行测试,仍无法ping通,但是可以返回其公网IP了
C:\Users\Administrator>ping www.baidu.com
正在 Ping www.a.shifen.com [111.13.100.92] 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。
111.13.100.92 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),
- 服务端进行修改squid配置文件
[[email protected] ~]# vim /etc/squid/squid.conf
http_port 3128 transparent #大约第59行,设置为透明转发
cache_dir ufs /var/spool/squid 100 16 256 #大约第62行,去掉前面的#设置缓存的保存路径
[[email protected] ~]# systemctl stop squid #先停止squid服务
[[email protected] ~]# squid -k parse #检查主配置文件是否有错误
2018/08/03 21:49:23| Startup: Initializing Authentication Schemes ...
2018/08/03 21:49:23| Startup: Initialized Authentication Scheme ‘basic‘
2018/08/03 21:49:23| Startup: Initialized Authentication Scheme ‘digest‘
2018/08/03 21:49:23| Startup: Initialized Authentication Scheme ‘negotiate‘
2018/08/03 21:49:23| Startup: Initialized Authentication Scheme ‘ntlm‘
2018/08/03 21:49:23| Startup: Initialized Authentication.
2018/08/03 21:49:23| Processing Configuration File: /etc/squid/squid.conf (depth 0)
2018/08/03 21:49:23| Processing: acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
2018/08/03 21:49:23| Processing: acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
2018/08/03 21:49:23| Processing: acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
2018/08/03 21:49:23| Processing: acl localnet src fc00::/7 # RFC 4193 local private network range
2018/08/03 21:49:23| Processing: acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
2018/08/03 21:49:23| Processing: acl SSL_ports port 443
2018/08/03 21:49:23| Processing: acl Safe_ports port 80 # http
2018/08/03 21:49:23| Processing: acl Safe_ports port 21 # ftp
2018/08/03 21:49:23| Processing: acl Safe_ports port 443 # https
2018/08/03 21:49:23| Processing: acl Safe_ports port 70 # gopher
2018/08/03 21:49:23| Processing: acl Safe_ports port 210 # wais
2018/08/03 21:49:23| Processing: acl Safe_ports port 1025-65535 # unregistered ports
2018/08/03 21:49:23| Processing: acl Safe_ports port 280 # http-mgmt
2018/08/03 21:49:23| Processing: acl Safe_ports port 488 # gss-http
2018/08/03 21:49:23| Processing: acl Safe_ports port 591 # filemaker
2018/08/03 21:49:23| Processing: acl Safe_ports port 777 # multiling http
2018/08/03 21:49:23| Processing: acl CONNECT method CONNECT
2018/08/03 21:49:23| Processing: http_access deny !Safe_ports
2018/08/03 21:49:23| Processing: http_access deny CONNECT !SSL_ports
2018/08/03 21:49:23| Processing: http_access allow localhost manager
2018/08/03 21:49:23| Processing: http_access deny manager
2018/08/03 21:49:23| Processing: http_access allow localnet
2018/08/03 21:49:23| Processing: http_access allow localhost
2018/08/03 21:49:23| Processing: http_access deny all
2018/08/03 21:49:23| Processing: http_port 3128 transparent
2018/08/03 21:49:23| Starting Authentication on port [::]:3128
2018/08/03 21:49:23| Disabling Authentication on port [::]:3128 (interception enabled)
2018/08/03 21:49:23| Processing: cache_dir ufs /var/spool/squid 100 16 256
2018/08/03 21:49:23| Processing: coredump_dir /var/spool/squid
2018/08/03 21:49:23| Processing: refresh_pattern ^ftp: 1440 20% 10080
2018/08/03 21:49:23| Processing: refresh_pattern ^gopher: 1440 0% 1440
2018/08/03 21:49:23| Processing: refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
2018/08/03 21:49:23| Processing: refresh_pattern . 0 20% 4320
2018/08/03 21:49:23| Initializing https proxy context
[[email protected] ~]# squid -z #对Squid服务程序的透明代理技术进行初始化,生成缓存目录
[[email protected] ~]# 2018/08/03 21:50:01 kid1| Set Current Directory to /var/spool/squid
2018/08/03 21:50:01 kid1| Creating missing swap directories
2018/08/03 21:50:01 kid1| /var/spool/squid exists
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/00
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/01
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/02
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/03
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/04
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/05
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/06
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/07
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/08
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/09
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/0A
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/0B
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/0C
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/0D
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/0E
2018/08/03 21:50:01 kid1| Making directories in /var/spool/squid/0F
[[email protected] ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 #把所有客户端主机对网站80端口的请求转发至Squid服务器本地的3128端口上
[[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.16.0/24 -o ens33 -j SNAT --to 192.168.10.157 #SNAT数据转发。16.0网段为仅主机模式网段,ens33位仅主机网络端口,10.157为桥接网络端口
[[email protected] ~]# systemctl restart squid
此时客户端可以直接ping通了
C:\Users\Administrator>ping www.wuxier.cn
正在 Ping www.wuxier.cn [182.61.34.191] 具有 32 字节的数据:
来自 182.61.34.191 的回复: 字节=32 时间=34ms TTL=50
来自 182.61.34.191 的回复: 字节=32 时间=34ms TTL=50
来自 182.61.34.191 的回复: 字节=32 时间=35ms TTL=50
来自 182.61.34.191 的回复: 字节=32 时间=35ms TTL=50
182.61.34.191 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 34ms,最长 = 35ms,平均 = 34ms
- 验证确实是通过代理转发,而不是通过服务器来直接上网
①基于客户端的IP地址
服务端配置squid配置文件
[[email protected] ~]# vim /etc/squid/squid.conf
acl client src 192.168.16.21 #新增此行,允许来源是192.168.16.21的客户端上网
http_access allow client #大约第31行,新增此行,允许刚才设置的客户端192.168.16.21上网
http_access deny all #大约第32行,新增此行,拒绝其他客户端上网
[[email protected] ~]# systemctl restart squid #配置完成后重启服务
从客户端(IP为192.168.16.20)重新打开刚才的网页,提示如下图
将IP修改为192.168.16.21后,网页恢复正常访问,如下图
说明我们的网络服务是受到了代理服务的限制
②基于网址关键词
修改squid配置文件
[[email protected] ~]# vim /etc/squid/squid.conf
acl deny_keyword url_regex -i wuxi #新增此行,acl后的相当于是别名,可以自定义。url_regex代表匹配网址,接参数-i代表拒绝网址中包含此关键词的。或者不用参数-i,直接接特定的网址全名,如http://www.wuxier.cn
http_access deny deny_keyword #新增此行
[[email protected] ~]# systemctl restart squid #配置完成后重启服务
当打开www.wuxier.cn的时候无法访问,因为包含了wuxi;而打开www.51cto.com等不包含wuxi的网址时都可以正常访问。
注意:如果网址时https的是经过加密的则是不受限制的
③禁止下载带有某些后缀的文件
修改squid配置文件
[[email protected] ~]# vim /etc/squid/squid.conf
acl badfile url_regex -i \.mp3$ \.rar$ #新增此行,\代表转义,$代表以某后缀结尾
http_access deny badfile #新增此行
[[email protected] ~]# systemctl restart squid #配置完成后重启服务
当下载.rar压缩包的时候无法下载,如下图(如果是使用迅雷等工具会无法进行限制)
- 反向代理
首先找到一个网站源服务器的IP地址,通过ping网站域名得到其公网IP,如果通过公网IP能打开其网站,则符合我们的条件。然后编辑Squid服务程序的主配置文件,把端口号3128修改为网站源服务器的地址和端口号,此时正向解析服务会被暂停(它不能与反向代理服务同时使用)。
修改squid配置文件
[[email protected] ~]# vim /etc/squid/squid.conf
http_port 192.168.10.157:80 vhost #大约第58行,将原来的http_port 3128修改为此配置。192.168.10.157为本机IP。
cache_peer 58.250.26.38 parent 80 0 originserver #新增此行。缓存节点的IP地址,58.250.26.38即获取的公网IP,定义为我们的一个父节点,端口号为80,它是一台原始的服务器
[[email protected] ~]# systemctl restart squid #配置完成后重启服务
当我们访问192.168.10.157的时候就能直接访问刚才公网可以访问的网站了,如下图
原文地址:http://blog.51cto.com/jschinamobile/2154800