使用Squid部署代理缓存服务
正向代理不仅可以让用户使用squid代理服务器上网,还可以基于IP地址、网站关键字、下载文件后缀等实现类似行为管控的功能。
反向代理可以大幅提升网站的访问速度,减轻网站服务器的负载压力。
- 虚拟机配置
- 服务端IP
[root@mail ~]# 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,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
[root@mail ~]# yum install -y squid [root@mail ~]# systemctl restart squid [root@mail ~]# 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通外网的,但是可以打开网页了
[root@mail ~]# vim /etc/squid/squid.conf http_port 10000 #大约第59行,将默认的3128端口修改为10000 [root@mail ~]# systemctl restart squid
- 配置selinux
[root@mail ~]# semanage port -l | grep squid squid_port_t tcp 3128,3401,4827 squid_port_t udp 3401,4827 [root@mail ~]# semanage port -a -t squid_port_t -p tcp 10000 [root@mail ~]# systemctl restart squid
- 客户端修改默认端口号
修改IE选项中的端口号为10000
重新打开网页,成功
- 透明正向代理——客户端还原IE选项
[root@mail ~]# iptables -t nat -A POSTROUTING -p udp --dport 53 -o ens37 -j MASQUERADE #DNS流量转发,端口默认53 [root@mail ~]# vim /etc/sysctl.conf net.ipv4.ip_forward=1 #新增此行,允许Squid服务器转发IPv4数据包 [root@mail ~]# 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% 丢失),
[root@mail ~]# vim /etc/squid/squid.conf http_port 3128 transparent #大约第59行,设置为透明转发 cache_dir ufs /var/spool/squid 100 16 256 #大约第62行,去掉前面的#设置缓存的保存路径
[root@mail ~]# systemctl stop squid #先停止squid服务 [root@mail ~]# 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
[root@mail ~]# squid -z #对Squid服务程序的透明代理技术进行初始化,生成缓存目录 [root@mail ~]# 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
[root@mail ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 #把所有客户端主机对网站80端口的请求转发至Squid服务器本地的3128端口上 [root@mail ~]# 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为桥接网络端口 [root@mail ~]# 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配置文件
[root@mail ~]# 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行,新增此行,拒绝其他客户端上网 [root@mail ~]# systemctl restart squid #配置完成后重启服务
从客户端(IP为192.168.16.20)重新打开刚才的网页,提示如下图
将IP修改为192.168.16.21后,网页恢复正常访问,如下图
说明我们的网络服务是受到了代理服务的限制
[root@mail ~]# 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 #新增此行 [root@mail ~]# systemctl restart squid #配置完成后重启服务
当打开www.wuxier.cn的时候无法访问,因为包含了wuxi;而打开www.51cto.com等不包含wuxi的网址时都可以正常访问。
注意:如果网址时https的是经过加密的则是不受限制的
[root@mail ~]# vim /etc/squid/squid.conf acl badfile url_regex -i \.mp3$ \.rar$ #新增此行,\代表转义,$代表以某后缀结尾 http_access deny badfile #新增此行 [root@mail ~]# systemctl restart squid #配置完成后重启服务
当下载.rar压缩包的时候无法下载,如下图(如果是使用迅雷等工具会无法进行限制)
- 反向代理
首先找到一个网站源服务器的IP地址,通过ping网站域名得到其公网IP,如果通过公网IP能打开其网站,则符合我们的条件。然后编辑Squid服务程序的主配置文件,把端口号3128修改为网站源服务器的地址和端口号,此时正向解析服务会被暂停(它不能与反向代理服务同时使用)。
[root@mail ~]# 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,它是一台原始的服务器 [root@mail ~]# systemctl restart squid #配置完成后重启服务
当我们访问192.168.10.157的时候就能直接访问刚才公网可以访问的网站了,如下图