如何将Sophos Intelix与Squid代理集成实现URL分类校验及本地缓存
Squid 集成 Sophos Intelix 实现URL分类过滤配置方案
核心实现逻辑
Squid 本身不直接支持调用第三方URL分类接口,需要通过外部辅助脚本(Helper) 配合 Squid 的 external_acl_type 配置项实现,校验结果的缓存逻辑直接在辅助脚本侧实现即可,不需要依赖 Squid 原生缓存机制。
具体配置步骤
1. 开发 Sophos Intelix 校验辅助脚本
你可以用自己熟悉的语言(Python/Go等)开发常驻脚本,核心逻辑如下:
- 按 Squid Helper 协议标准,接收 Squid 传入的待校验URL、请求ID等参数
- 先查询本地缓存(可选内存字典、SQLite、Redis等存储,按需选择),如果存在未过期的校验结果,直接返回 Squid 对应动作(允许/拒绝)
- 缓存不存在或已过期时,调用你已在使用的 Sophos Intelix 接口获取分类结果,写入缓存并设置过期时长后,再返回对应动作给 Squid
以下是Python实现的核心参考代码:
import sys import redis import requests # 初始化缓存,示例用Redis存储,过期时长设为86400秒(1天)可自行调整 r = redis.Redis(host='127.0.0.1', port=6379, db=0) CACHE_EXPIRE = 86400 # 替换为你自己的Sophos Intelix认证信息 CLIENT_ID = "你的Client ID" CLIENT_SECRET = "你的Client Secret" def get_sophos_category(url): # 直接复用你原有自定义应用中的Sophos Intelix调用逻辑即可 auth = (CLIENT_ID, CLIENT_SECRET) resp = requests.post("你的Sophos Intelix接口地址", auth=auth, json={"url": url}) if resp.ok: return resp.json().get("category", "unknown") return "unknown" if __name__ == "__main__": while True: # 读取Squid传入的请求 line = sys.stdin.readline().strip() if not line: break parts = line.split() request_id = parts[0] url = parts[1] # 查询缓存 cache_key = f"sophos_cat:{url}" cached_cat = r.get(cache_key) if cached_cat: category = cached_cat.decode() else: category = get_sophos_category(url) r.setex(cache_key, CACHE_EXPIRE, category) # 自定义过滤规则,示例拦截恶意软件、钓鱼类URL,可按需调整分类列表 if category in ["Malware", "Phishing"]: sys.stdout.write(f"{request_id} ERR\n") else: sys.stdout.write(f"{request_id} OK\n") sys.stdout.flush()
2. Squid 侧配置修改
编辑 Squid 主配置文件(默认路径为 /etc/squid/squid.conf),添加如下配置:
# 定义外部ACL类型,指定辅助脚本路径、并发进程数可根据实际业务量调整 external_acl_type sophos_url_check children-max=10 children-start=2 %DATA %URI /usr/local/bin/sophos_intelix_helper.py # 绑定ACL规则 acl sophos_allow external sophos_url_check # 配置访问控制,仅放行校验通过的请求 http_access allow sophos_allow http_access deny all
3. 生效验证
- 给辅助脚本添加可执行权限:
chmod +x /usr/local/bin/sophos_intelix_helper.py - 检查配置语法是否正确:
squid -k parse - 重载 Squid 配置生效:
squid -k reconfigure
优化注意事项
- 若不需要精确到完整URL校验,可调整缓存维度为域名,减少重复请求量
- 建议添加错误降级逻辑,Sophos Intelix 接口不可用时直接放行或走默认策略,避免影响代理可用性
- 高并发场景推荐用Go开发辅助脚本,性能优于Python实现
内容的提问来源于stack exchange,提问作者Chuck Star
相关产品推荐
相关产品推荐

