凌峰创科服务平台

Linux Squid代理服务器如何高效配置?

  1. Squid 的核心概念与工作原理
  2. 安装 Squid
  3. 基础配置文件详解 (squid.conf)
  4. 配置示例:基础正向代理
  5. 配置示例:透明代理
  6. 高级功能简介
  7. 常用管理与维护命令
  8. 故障排查

Squid 的核心概念与工作原理

在配置之前,理解 Squid 的工作原理非常重要。

Linux Squid代理服务器如何高效配置?-图1
(图片来源网络,侵删)
  • 正向代理 (Forward Proxy)

    • 场景:客户端(如你的浏览器)明确配置了代理服务器地址,所有上网请求都先发送给 Squid,再由 Squid 转发到目标网站。
    • 用途:企业内网用户统一上网出口、访问控制、缓存加速、翻墙(不鼓励)等。
    • 客户端感知客户端知道代理的存在。
  • 反向代理 (Reverse Proxy)

    • 场景:对外暴露的是 Squid 的地址,客户端不知道后端真实服务器的存在,Squid 接收来自互联网的请求,然后转发给内网中的一台或多台 Web 服务器。
    • 用途:负载均衡、SSL/TLS 卸载、Web 加速、安全防护。
    • 客户端感知客户端不知道代理的存在,以为 Squid 就是目标服务器。
  • 透明代理 (Transparent Proxy)

    • 场景:介于正向和反向之间,客户端不知道代理的存在,也不需要在浏览器中配置,网络设备(如路由器、防火墙)通过策略路由(如 iptables)将客户端的 Web 流量“劫持”到 Squid 代理上。
    • 用途:企业内网强制代理,实现无感知的上网控制和缓存。
    • 客户端感知客户端不知道代理的存在。
  • 缓存:这是 Squid 的核心功能,当第一个用户请求一个网页时,Squid 会从互联网获取该网页的内容,并将其存储在本地磁盘中,当第二个用户请求同一个网页时,Squid 直接从本地缓存中提供,无需再次访问互联网,从而极大地提高了速度并减少了带宽消耗。

    Linux Squid代理服务器如何高效配置?-图2
    (图片来源网络,侵删)

安装 Squid

Squid 在几乎所有主流的 Linux 发行版软件源中都有提供。

在 Debian/Ubuntu 上安装

# 更新软件包列表
sudo apt update
# 安装 squid
sudo apt install squid -y
# 安装完成后,Squid 服务会自动启动

在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安装

# 更新软件包列表
sudo yum update -y
# 安装 squid
sudo yum install squid -y
# 启动并设置开机自启
sudo systemctl start squid
sudo systemctl enable squid

基础配置文件详解 (squid.conf)

Squid 的所有配置都位于 /etc/squid/ 目录下,主配置文件是 squid.conf,这个文件非常庞大,包含大量注释和默认配置,我们通常需要修改其中的关键部分。

# 打开配置文件 (Debian/Ubuntu)
sudo nano /etc/squid/squid.conf
# 打开配置文件 (CentOS/RHEL)
sudo nano /etc/squid/squid.conf

以下是几个最核心的配置项:

配置项 说明 示例
http_port 定义 Squid 监听的端口和模式。 http_port 3128:标准监听模式,客户端需配置此端口。
http_port 3128 transparent:透明代理模式,需要配合 iptables
visible_hostname 定义 Squid 的主机名,用于在错误页面或 Cache-Control 头中显示。 visible_proxy.mycompany.com
cache_dir 定义缓存目录、大小和层级。 cache_dir ufs /var/spool/squid 100 16 256:在 /var/spool/squid 创建一个 100MB 的 UFS 类型缓存。
access_log 定义访问日志的路径和格式。 access_log /var/log/squid/access.log squid
cache_log 定义缓存日志的路径。 cache_log /var/log/squid/cache.log
acl (Access Control List) 定义访问控制列表,用于创建规则,如 IP 地址、域名、时间等。 acl localnet src 192.168.1.0/24:定义一个名为 localnet 的规则,匹配 192.168.1.0/24 网段。
acl SSL_ports port 443:定义名为 SSL_ports 的规则,匹配 443 端口。
http_access 基于 acl 规则允许或拒绝访问。注意:规则的顺序很重要,Squid 会从上到下匹配第一条规则。 http_access allow localnet:允许 localnet 网段访问。
http_access deny all:拒绝所有其他访问。这条规则通常放在最后,作为默认拒绝策略。

配置示例:基础正向代理

这是一个最常见的场景,让内网用户通过 Squid 上网。

Linux Squid代理服务器如何高效配置?-图3
(图片来源网络,侵删)

目标:允许 168.1.0/24 网段的所有用户通过 Squid(监听在 3128 端口)上网,并启用缓存。

步骤:

  1. 备份原配置文件

    sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
  2. 编辑 squid.conf 在文件末尾添加或修改以下内容:

    # ----------------------------------------------------
    # 基础正向代理配置示例
    # ----------------------------------------------------
    # 1. 设置监听端口
    http_port 3128
    # 2. 设置主机名
    visible_hostname linux-proxy-server
    # 3. 定义缓存 (如果需要)
    # 如果没有特殊需求,可以注释掉或删除 cache_dir 行,Squid 将不使用缓存
    # cache_dir ufs /var/spool/squid 100 16 256
    # 4. 定义访问控制列表
    # 允许内网 192.168.1.0/24 网段
    acl localnet src 192.168.1.0/24
    # 5. 设置访问权限
    # 先允许 localnet 访问
    http_access allow localnet
    # 默认拒绝所有其他访问
    http_access deny all
    # 6. 允许来自本机的查询
    http_access allow localhost
    # 7. 禁止代理某些网站 (可选)
    # acl bad_sites dstdomain .badsite.com .anotherbadsite.net
    # http_access deny bad_sites
    # ----------------------------------------------------
  3. 检查配置文件语法 在重启服务前,务必检查配置是否正确。

    # Debian/Ubuntu
    sudo squid -k parse
    # CentOS/RHEL
    # squid -k check (新版本) 或 squid -k parse (旧版本)
    # 如果输出没有任何信息,表示语法正确
  4. 重启 Squid 服务

    # 优雅重启,会处理完现有连接再应用新配置
    sudo systemctl reload squid
    # 或者完全重启
    sudo systemctl restart squid
  5. 客户端配置 在用户的浏览器或操作系统的网络设置中,将代理服务器地址设置为 Squid 服务器的 IP 地址,端口设置为 3128


配置示例:透明代理

透明代理让客户端无需任何配置即可使用代理,体验更好。

前提条件:Squid 服务器需要作为内网网关,iptablesfirewalld 已启用。

目标:强制所有来自 168.1.0/24 网段的 HTTP/HTTPS 流量通过 Squid(3128端口)进行代理。

步骤:

  1. 配置 Squid 修改 http_port 指令,添加 transparent 选项。

    # 在 squid.conf 中
    http_port 3128 transparent
  2. 配置 IPTables (以 iptables 为例) 在 Squid 服务器上执行以下命令,将流量重定向到 Squid。

    # 清空现有规则 (可选,谨慎操作)
    iptables -F
    iptables -t nat -F
    # 允许 Squid 代理服务器的回环流量
    iptables -A INPUT -i lo -j ACCEPT
    # 允许 Squid 监听 3128 端口的入站连接
    iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
    # 关键步骤:将来自内网的 HTTP (80) 流量重定向到 Squid 的 3128 端口
    iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128
    # 关键步骤:将来自内网的 HTTPS (443) 流量重定向到 Squid 的 3128 端口
    # 注意:HTTPS 流量会被 Squid 进行 SSL 拦截,需要配置 ssl_crtd 和 ssl_bump
    iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 443 -j REDIRECT --to-port 3128
    # 保存 iptables 规则
    # Debian/Ubuntu
    sudo iptables-save > /etc/iptables/rules.v4
    # CentOS/RHEL
    sudo service iptables save
  3. 重启 Squid 服务

    sudo systemctl reload squid
  4. 客户端设置 客户端只需将默认网关设置为 Squid 服务器的 IP 地址即可,无需配置任何代理。


高级功能简介

  • SSL Bumping / 拦截:要代理 HTTPS 流量,Squid 需要解密和重新加密流量,这被称为 SSL Bumping,配置起来比较复杂,需要 Squid 能生成有效的中间证书,并让客户端信任它。
  • 认证:可以与 LDAP, NCSA, Samba 等集成,要求用户输入用户名和密码才能使用代理。
  • 日志分析:可以使用 Sarg (Squid Analysis Report Generator) 等工具生成详细的上网报告,分析访问的网站、流量排名等。
  • 内容过滤:通过 aclhttp_access 可以禁止访问特定网站或关键词。

常用管理与维护命令

# 查看服务状态
sudo systemctl status squid
# 启动/停止/重启服务
sudo systemctl start squid
sudo systemctl stop squid
sudo systemctl restart squid
# 优雅地重新加载配置 (推荐)
sudo systemctl reload squid
# 查看实时访问日志
sudo tail -f /var/log/squid/access.log
# 查看缓存日志
sudo tail -f /var/log/squid/cache.log
# 手行清理缓存 (谨慎使用)
# squid -z

故障排查

  1. 客户端无法连接

    • 检查 Squid 服务状态sudo systemctl status squid,确保服务正在运行。
    • 检查防火墙:确保 Squid 的监听端口(如 3128)没有被防火墙阻止,可以使用 sudo ufw status (Ubuntu) 或 sudo firewall-cmd --list-ports (CentOS) 检查。
    • 检查语法错误sudo squid -k parse
    • 检查 access_log:查看是否有来自客户端 IP 的连接记录,以及被 http_access 拒绝的记录。
  2. 配置文件修改后不生效

    • 确保使用了 systemctl reload squid 而不是 systemctl restart
    • 检查 http_access 规则的顺序,错误的顺序可能导致规则被跳过。
  3. 透明代理不工作

    • 这通常是 iptables 规则的问题,检查 PREROUTING 链的规则是否正确应用,-i (入站网卡) 和 -s (源网段) 是否匹配你的网络环境。
    • 确保客户端的网关和 DNS 都正确指向了 Squid 服务器。

希望这份详细的指南能帮助你成功地在 Linux 上部署和管理 Squid 代理服务器!

分享:
扫描分享到社交APP
上一篇
下一篇