凌峰创科服务平台

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

Squid 的核心功能与用途

在开始配置之前,了解 Squid 能做什么非常重要:

Squid代理服务器Linux下如何配置?-图1
(图片来源网络,侵删)
  1. 缓存加速:这是 Squid 最核心的功能,当多个用户访问同一个网站时,Squid 会将网页、图片、CSS/JS 文件等静态内容存储在本地,后续用户的请求可以直接从 Squid 服务器获取,而无需再次访问原始网站,从而大大加快访问速度,并减少对外部带宽的占用。
  2. 访问控制与安全
    • ACL (Access Control List):可以基于 IP 地址、域名、时间、端口、用户/密码、文件类型等规则来控制哪些用户可以访问哪些网站。
    • 内容过滤:可以阻止用户访问特定类型的网站(如社交媒体、成人内容)或下载特定类型的文件(如 .exe, .mp4)。
    • 透明代理:客户端无需在浏览器中配置代理,所有网络流量都会被 Squid 自动拦截和代理,这对于企业环境非常方便,可以统一管理所有员工的上网行为。
  3. 带宽管理:可以通过 ACL 和 delay_pools 功能限制特定用户或特定网站的带宽使用,防止个别用户占用过多带宽。
  4. 反向代理:Squid 也可以作为 Web 服务器的“前端”,它接收来自互联网的请求,并将请求转发给后端的 Web 服务器(如 Nginx, Apache),这样可以缓存动态内容,减轻后端服务器的压力,并提高网站性能和可用性。
  5. 日志记录与分析:Squid 会详细记录所有通过它的访问请求,这些日志可以用于流量分析、安全审计和用户行为分析。

安装 Squid

以主流的 Debian/Ubuntu 和 CentOS/RHEL 为例。

Debian / Ubuntu

# 更新软件包列表
sudo apt update
# 安装 squid
sudo apt install squid -y

CentOS / RHEL / Rocky Linux / AlmaLinux

# 安装 EPEL 仓库(如果尚未安装)
sudo dnf install epel-release -y
# 安装 squid
sudo dnf install squid -y

安装完成后,Squid 服务会自动启动,你可以检查其状态:

# 检查状态
sudo systemctl status squid
# 如果没有启动,可以手动启动
sudo systemctl start squid
# 设置开机自启
sudo systemctl enable squid

基本配置

Squid 的主配置文件位于 /etc/squid/squid.conf(Debian/Ubuntu)或 /etc/squid/squid.conf(CentOS/RHEL),这个文件非常长,包含大量注释和示例,最好的方式是先备份原文件,然后从头开始或修改关键部分。

# 备份原配置文件
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak

修改监听端口和 IP 地址

默认情况下,Squid 监听所有网络接口(http_port 3128),你可以修改它,例如只监听内网 IP。

Squid代理服务器Linux下如何配置?-图2
(图片来源网络,侵删)
# 在 /etc/squid/squid.conf 中找到 http_port 行
# 默认可能是 http_port 3128
# 修改为只监听内网 IP,192.168.1.100
http_port 192.168.1.100:3128

配置访问控制

这是 Squid 最强大的部分,我们通过 ACL 定义规则,然后用 http_access 应用这些规则。

ACL 定义规则:

# 定义一个名为 "local_network" 的 ACL,包含内网网段
acl local_network src 192.168.1.0/24
# 定义一个名为 "blocked_sites" 的 ACL,包含要屏蔽的网站
acl blocked_sites dstdomain .facebook.com .twitter.com .youtube.com
# 定义一个名为 "work_hours" 的 ACL,允许访问的时间范围
# 时间格式是 HH:MM - HH:MM
acl work_hours time M T W T F 8:30-17:30

http_access 应用规则:

注意:规则的匹配顺序是从上到下,一旦匹配到一条规则,就立即执行,后续规则将被忽略。DENY 规则通常放在 ALLOW 规则之后。

Squid代理服务器Linux下如何配置?-图3
(图片来源网络,侵删)
# 允许 local_network 网段的所有用户访问
http_access allow local_network
# 在工作时间内,允许访问所有网站
http_access allow work_hours
# 禁止访问 blocked_sites 列表中的网站
http_access deny blocked_sites
# 默认策略:拒绝所有其他访问
# 这条规则非常重要!它作为安全网关,确保未明确允许的访问都被拒绝。
http_access deny all

设置缓存目录(可选)

Squid 默认会使用磁盘空间进行缓存,你可以调整缓存大小和位置。

# 在配置文件中找到 cache_dir 行,通常是以下格式
# 格式: cache_dir ufs /path/to/cache/directory MB_level_1 MB_level_2 max_object_size
# 设置一个 4GB 的缓存目录
cache_dir ufs /var/spool/squid 4096 16 256

修改后需要创建缓存目录并重新初始化它:

# 创建目录
sudo mkdir -p /var/spool/squid
# 设置正确的权限
sudo chown -R squid:squid /var/spool/squid
# 重新初始化缓存(会清空所有旧缓存)
sudo squid -z

启动、重启与测试

检查配置文件语法

在重启服务前,务必检查配置文件是否有语法错误:

sudo squid -k parse
# 或者
sudo squid -k check

如果没有任何输出,说明语法正确。

重启 Squid 服务

sudo systemctl restart squid

测试代理

使用 curl 命令行工具

在另一台客户端机器上,确保它能访问 Squid 服务器的 IP 和端口。

# -x 指定代理服务器地址
curl -x http://192.168.1.100:3128 http://www.example.com

Squid 配置正确且允许该客户端访问,命令会返回 example.com 的网页内容。

在浏览器中配置代理

在客户端电脑的浏览器设置中,手动配置代理服务器:

  • 代理服务器地址168.1.100
  • 端口3128

配置后,访问任意网站,观察是否能正常打开。


高级配置:透明代理

透明代理让客户端“感觉不到”代理的存在,无需在浏览器或系统中做任何设置,它通常通过 Linux 的 iptables (或 nftables) 网络防火墙来实现。

假设 Squid 服务器有两个网卡:

  • eth0 (内网): 168.1.100
  • eth1 (外网): 0.113.10

配置步骤:

  1. 启用 IP 转发

    编辑 /etc/sysctl.conf 文件,添加或取消注释以下行:

    net.ipv4.ip_forward=1

    然后应用更改:

    sudo sysctl -p
  2. 配置 Squid 监听透明代理端口

    在 Squid 配置文件中,添加一个 http_port 条目,并标记为 transparent

    # 监听来自内网的 80 端口流量,并透明代理
    http_port 192.168.1.100:80 vhost vport transparent
    # 监听来自内网的 443 端口流量,并透明代理(需要 SSL Bump 功能,更复杂)
    # http_port 192.168.1.100:443 vhost vport transparent ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB

    对于初学者,先配置 HTTP (80端口) 的透明代理即可。

  3. 配置 iptables 规则

    在 Squid 服务器上,使用 iptables 将内网访问外网的流量重定向到 Squid 的 3128 端口。

    # 清空现有规则(谨慎操作)
    iptables -F
    iptables -t nat -F
    # 设置 NAT 策略,允许 IP 转发
    iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
    iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
    # 关键步骤:将内网访问外网 80 端口的流量重定向到 Squid 的 3128 端口
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

    注意:这里的 iptables 规则是一个示例,你需要根据你的实际网卡名称(eth0, eth1)和 Squid 的监听端口进行调整。

  4. 保存 iptables 规则

    iptables 规则在重启后会丢失,需要保存下来。

    • Debian/Ubuntu:
      sudo apt install iptables-persistent
      sudo netfilter-persistent save
    • CentOS/RHEL:
      sudo dnf install iptables-services
      sudo service iptables save

完成以上配置后,内网中的任何一台电脑,只要其网关指向 Squid 服务器,访问任何网站时,流量都会被自动 Squid 代理,而无需用户做任何设置。


排错与日志

Squid 工作不正常,日志是最好的朋友。

  • 主日志文件/var/log/squid/access.log

    • 记录了所有通过 Squid 的请求,格式类似于 Web 服务器日志。
    • 排错:查看最新的几行,看是否有 TCP_DENIEDACCESS_DENIED 等错误信息,这通常意味着 ACL 规则阻止了请求。
  • 缓存日志/var/log/squid/cache.log

    • 记录了 Squid 内部运行状态、启动信息、警告和错误。
    • 排错:当 Squid 启动失败或配置有严重问题时,这里会有详细的错误信息。
  • 错误页面/var/log/squid/store.log

    记录了 Squid 缓存对象的存储和检索情况。

你可以使用 tail 命令实时监控日志:

sudo tail -f /var/log/squid/access.log
sudo tail -f /var/log/squid/cache.log

Squid 是一个非常灵活的工具,从简单的缓存加速到复杂的企业级网络安全网关都能胜任,掌握其核心在于:

  1. 理解 http_port:定义 Squid 如何接收请求。
  2. 精通 aclhttp_access:这是实现访问控制的核心。
  3. 善用日志:快速定位问题。
  4. 了解透明代理:在企业环境中,这是最常见的部署方式。

希望这份详细的指南能帮助你顺利上手 Squid!

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