第 19 章 Squid 缓存代理


Squid 是 Web 客户端的高性能代理缓存服务器,支持 FTP、Gopher 和 HTTP 数据对象。它通过缓存和重复使用频繁请求的网页来缩短带宽并缩短响应时间。[17]
在 Red Hat Enterprise Linux 中,s quid 软件包提供了 Squid 缓存代理。输入以下命令查看是否安装了 squid 软件包:
~]$ rpm -q squid
package squid is not installed
如果没有安装它,并且您想要使用 squid,请以 root 用户身份使用 yum 工具来安装它:
~]# yum install squid

19.1. Squid 缓存代理和 SELinux

启用 SELinux 后,Squid 默认会受到限制。受限制的进程在其自己的域中运行,并且与其他受限制的进程隔开。如果一个受攻击者限制的进程受到 SELinux 策略配置的影响,攻击者对资源的访问权限和可能受到的破坏会受到限制。以下示例演示了在自己的域中运行的 Squid 进程。本例假设安装了 squid 软件包:
  1. 运行 getenforce 命令,确认 SELinux 是否在 enforcing 模式下运行:
    ~]$ getenforce
    Enforcing
    
    当 SELinux 处于 enforcing 模式时,命令会返回 Enforcing
  2. 以 root 用户身份输入以下命令启动 squid 守护进程:
    ~]# systemctl start squid.service
    确认 服务正在运行。输出中应包括以下信息(只有时间戳有所不同):
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: active (running) since Mon 2013-08-05 14:45:53 CEST; 2s ago
  3. 输入以下命令来查看 squid 进程:
    ~]$ ps -eZ | grep squid
    system_u:system_r:squid_t:s0    27018 ?        00:00:00 squid
    system_u:system_r:squid_t:s0    27020 ?        00:00:00 log_file_daemon
    
    squid 进程关联的 SELinux 上下文为 system_u:system_r:squid_t:s0。上下文的最后一部分 squid_t 是类型。类型定义进程的域以及文件的类型。在这种情况下,Squid 进程在 squid_t 域中运行。
SELinux 策略定义了在受限制域中运行的进程的方式,如 squid_t、与文件、其他进程和系统交互。文件必须正确标记,以允许对文件进行 squid 访问。
当配置 /etc/squid/squid.conf 文件以便 squid 侦听默认 TCP 端口 3128, 3401 或 4827 以外的端口时,必须使用 semanage port 命令,将所需的端口号添加到 SELinux 策略配置中。以下示例演示了将 squid 配置为监听最初在 SELinux 策略配置中定义的端口,因此服务器无法启动。本例还演示如何配置 SELinux 系统,以允许 守护进程成功侦听策略中尚未定义的非标准端口。本例假定已安装了 squid 软件包。以 root 用户身份运行示例中的每个命令:
  1. 确认 squid 守护进程没有运行:
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: inactive (dead)
    
    如果输出不同,请停止该进程:
    ~]# systemctl stop squid.service
  2. 输入以下命令查看 SELinux 允许 squid 侦听的端口:
    ~]# semanage port -l | grep -w -i squid_port_t
    squid_port_t                   tcp      3401, 4827
    squid_port_t                   udp      3401, 4827
    
    
  3. 以 root 用户身份编辑 /etc/squid/squid.conf。配置 http_port 选项,以便它列出在 squid 的 SELinux 策略配置中未配置的端口。在这个示例中,守护进程被配置为侦听端口 10000:
    # Squid normally listens to port 3128
    http_port 10000
    
  4. 运行 setsebool 命令,以确保 squid_connect_any 布尔值设为 off。这样可确保 squid 只允许在特定端口上运行:
    ~]# setsebool -P squid_connect_any 0
  5. 启动 squid 守护进程:
    ~]# systemctl start squid.service
    Job for squid.service failed. See 'systemctl status squid.service' and 'journalctl -xn' for details.
    
    记录类似如下的 SELinux 拒绝信息:
    localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 10000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
    
  6. 对于 SELinux,允许 squid 侦听端口 10000,如下例所示:
    ~]# semanage port -a -t squid_port_t -p tcp 10000
  7. 再次启动 squid,并使其侦听新端口:
    ~]# systemctl start squid.service
  8. 现在 SELinux 已配置为允许 Squid 侦听非标准端口(本示例中为 TCP 10000),它在此端口上成功启动。


[17] 如需更多信息,请参阅 Squid 缓存代理 项目页面。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.