Skip to main content

Squid Conf

caution
  • ssl_bump 不能指定 cache_peer
    • 可以配置全部转发

基础配置

# 监听端口
http_port 7777

# 定义本地网络
acl localnet src 127.0.0.0/24
acl localnet src 192.168.0.0/16
acl localnet src 10.0.0.0/8
http_access allow localnet

# 缓存目录 - 500MB - 第一级 16 - 第二级 256
cache_dir ufs .caache 500 16 256

上级转发配置

# 上级缓存
cache_peer 127.0.0.1 parent 7777 7 no-query

# FTP 不转发 - 直接访问
acl ftp proto FTP
always_direct allow ftp

# 全部走 cache_peer
never_direct allow all

推荐配置

# 最小缓存对象
maximum_object_size 1 MB
# 不发送版本信息
httpd_suppress_version_string on

# 定义本地网络
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fc00::/7
acl localnet src fe80::/10

# acl localnet src all

# 定义安全端口
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # waiss
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http

# 识别 CONNECT 方法
acl CONNECT method CONNECT
# 识别查询参数
acl QUERY urlpath_regex cgi-bin \? asp aspx jsp
# 带参数不缓存
cache deny QUERY

# 只允许安全端口
http_access deny !Safe_ports

# 只允许 CONNECT SSL 端口
http_access deny CONNECT !SSL_ports

# 只允许本地访问 cachemgr
http_access allow localhost manager
http_access deny manager

# 不允许访问本地
http_access deny to_localhost

# 允许本地访问
http_access allow localnet
http_access allow localhost
http_access deny all

网络配置

http_port port [mode] [options]
http_port hostname:port [mode] [options]
http_port 1.2.3.4:port [mode] [options]
  • mode - 默认为转发模式
    • intercept - IP-Layer NAT interception
    • tproxy - Linux TPROXY
    • accel - Accelerator / reverse proxy
    • ssl-bump
      • generate-host-certificates - on/off
      • dynamic_cert_mem_cache_size=SIZE - 默认 4MB
  • options
    • TLS/SSL
      • cipher=
      • options=

SSL

ssl_bump <action> [!]acl ...
  • action
    • splice - 默认 - 转为 TCP 通道,不解密代理流量
    • bump
      • SslBump1 和客户端建立安全链接,然后连接到服务端
      • SslBump2 - 服务端建立连接
      • SslBump3 - 模仿 服务端 证书
    • peek
      • SslBump1 接收到客户端证书
      • SslBump2 接收到服务端证书
      • 根据获取的证书信息判断是否 bump 进入 step 3
    • stare
      • 类似 peed,控制 splice
    • terminate
      • 终止连接
# 不做特殊处理 - 可用于记录 SNI 信息
ssl_bump peek all
ssl_bump splice all

# 处理所有
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all
ssl_bump splice all

缓存节点选择

  • Features/CacheHierarchy
  • dead_peer_timeout 10 seconds
    • peer 10 秒超时认为失败
  • forward_max_tries 25
    •  转发重试次数

缓存节点

cache_peer hostname type proxy-port icp-port options
  • type parent,sibling,multicast
  • proxy-port - 代理端口
  • icp-port - ICP, HTCP 端口 - 用于查询相邻服务
    • squid 端口 3130
    • 0 表示不支持
  • options
    • 节点选择方式
      • default - 默认最后选择 last-resort
      • round-robin - 轮训 parent
      • weighted-round-robin - 支持 weight 的轮训
    • 通用选项
      • name=xxx - 当单主机多 port 时需要,默认为主机名字,会被其他配置引用
      • standby=N - 热备连接数
      • max-conn=N - 最大连接数
      • connect-timeout=N - 超时
      • connect-fail-limit=N - 标记节点 Down 的失败次数
      • allow-miss
      • no-tproxy - 不使用 TPROXY
      • proxy-only - 不存储
    • ICP
      • no-query - disable icp
    • HTCP
      • htcp - enable HTCP

节点 ACL

cache_peer_access peer-name allow|deny [!]aclname
  • peer-name
    • cache_peer 的 hostname

域名匹配缓存节点类型

neighbor_type_domain neighbor parent|sibling domain domain ...
  • neighbor - cache_peer 名字
cache_peer 127.0.0.1 sibling 7777 icp-port options

acl extdomain dstdomain .google.com
cache_peer_access 127.0.0.1 allow extdomain
# 匹配的域名使用 sibling cache_peer
neighbor_type_domain 127.0.0.1 sibling .google.com

never_direct allow all

磁盘缓存配置

# 最小缓存对象
minimum_object_size 0
# 最大缓存对象
maximum_object_size 4 MB

cache_dir

缓存存储目录

cache_dir type directory-name fs-specific-data [options]
  • type
    • ufs - mbytes L1 L2 - 默认内置
      • mbytes 最大使用空间,可以使用百分比,默认 100 MB
      • L1 - 第一层目录数量 - 默认 6
      • L2 - 第二层目录数量 - 默认 256
    • aufs - mbytes L1 L2
      • 同 ufs,但使用 POSIX 线程避免阻塞主 squid 进程
    • diskd - mbytes l1 l2 [options] [q1=n] [q2=n]
      • 结构同 ufs,使用独立进程
      • Q1=64 - 当达到 Q1 个未 ACK 请求时,squid 停止打开新文件
      • Q2=72 - 当达到 Q2 个未 ACK 请求时,squid 开始阻塞
    • rock - mbytes
      • 存储为类似数据库文件
      • 会启独立进程 disker - 避免阻塞
  • options
    • no-store - 不存储新对象
    • min-size=n
    • max-size=n
  • 多个 cache_dir 应该按照 max-size 进行排序

store_dir_select_algorithm

存储目录选择算法

store_dir_select_algorithm algorithm
  • algorithm
    • least-load - 默认
    • round-robin - 轮训

cache_replacement_policy

缓存替换策略

cache_replacement_policy policy
  • policy
    • lru 默认
    • heap GDSF : Greedy-Dual Size Frequency
    • heap LFUDA: Least Frequently Used with Dynamic Aging
    • heap LRU : LRU policy implemented using a heap

内存缓存

  • cache_mem 256 MB
  • maximum_object_size_in_memory 512 KB
  • memory_cache_shared on
  • memory_cache_mode always
    • always - 最近请求的对象都会到内存缓存
    • disk - 只有 disk cache 才会到内存缓存
    • network - 网络请求的对象会到内存缓存
  • memory_replacement_policy lru

缓存调优

max_stale 1 week
minimum_expiry_time 60 seconds

refresh_pattern

  • 控制缓存洛基
  • refresh_pattern [-i] regex min percent max [options]
    • -i - 正则大小写不敏感
    • regex - 匹配 URL 的正则
    • min - 默认最小失效时间 - 分钟
    • percent - 失效时间比例 - 例如虽然指定 1h 但达到 50% 的时候就失效
    • max - 最大失效时间 - 分钟
    • options
      • override-expire - 重写 Expires 头,确保最小缓存时间
      • override-lastmod - 覆盖上次修改时间,确保最小缓存时间
      • reload-into-ims - reload 请求判断 If-Modified-Since /If-None-Match
      • ignore-reload - 忽略 no-cache/reload 请求 头
      • ignore-no-store - 忽略 Cache-control: no-store
      • ignore-private - 忽略 Cache-control: private
      • max-stale=NN - 最大过期时间 - 默认为全局 max_stale
      • refresh-ims - 客户端请求 If-Modified-Since 时,请求到源服务器
      • store-stale - 保存过期数据
  • refresh_pattern

逻辑

FRESH if expire > now, else STALE
STALE if age > max
FRESH if lm-factor < percent, else STALE
FRESH if age < min
else STALE
# 强制缓存
refresh_pattern . 2 20% 360 override-expire override-lastmod
# windows 更新
refresh_pattern -i windowsupdate.com/.*\.(cab|exe|ms[i|u|f|p]|[ap]sf|wm[v|a]|dat|zip|psf) 43200 80% 129600 reload-into-ims
refresh_pattern -i microsoft.com/.*\.(cab|exe|ms[i|u|f|p]|[ap]sf|wm[v|a]|dat|zip|psf) 43200 80% 129600 reload-into-ims
refresh_pattern -i windows.com/.*\.(cab|exe|ms[i|u|f|p]|[ap]sf|wm[v|a]|dat|zip|psf) 43200 80% 129600 reload-into-ims
refresh_pattern -i microsoft.com.akadns.net/.*\.(cab|exe|ms[i|u|f|p]|[ap]sf|wm[v|a]|dat|zip|psf) 43200 80% 129600 reload-into-ims
refresh_pattern -i deploy.akamaitechnologies.com/.*\.(cab|exe|ms[i|u|f|p]|[ap]sf|wm[v|a]|dat|zip|psf) 43200 80% 129600 reload-into-ims
range_offset_limit none

# mac 更新
refresh_pattern ([^.]+.|)(download|adcdownload).(apple.|)com/.*\.(pkg|dmg) 4320 100% 43200 reload-into-ims

# avg 更新
refresh_pattern ([^.]+.|)avg.com/.*\.(bin) 4320 100% 43200 reload-into-ims
refresh_pattern ([^.]+.|)spywareblaster.net/.*\.(dtb) 4320 100% 64800 reload-into-ims
refresh_pattern ([^.]+.|)symantecliveupdate.com/.*\.(zip|exe) 43200 100% 43200 reload-into-ims
refresh_pattern ([^.]+.|)avast.com/.*\.(vpu|vpaa) 4320 100% 43200 reload-into-ims

## common
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 10080 90% 43200 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(iso|avi|wav|mp3|mp4|mpeg|swf|flv|x-flv)$ 43200 90% 432000 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(deb|rpm|exe|zip|tar|tgz|ram|rar|bin|ppt|doc|tiff)$ 10080 90% 43200 override-expire ignore-no-cache ignore-no-store ignore-private

refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 40% 40320

refresh_pattern -i youtube.com/.* 10080 90% 43200
refresh_pattern (/cgi-bin/|\?) 0 0% 0

日志配置

xxx_log <module>:<place> [option ...] [acl acl ...]
xxx_log none [acl acl ...]
  • option
    • logformat=squid
    • buffer-size=64KB
    • on-error=die|drop
    • rotate=N
      • squid -k rotate
      • 默认遵循 logfile_rotate
      • 0 禁用
  • module
    • none
    • stdio
    • daemon
    • syslog
    • udp
    • tcp
# 访问日志
access_log daemon:/usr/local/squid/var/logs/access.log squid
# 存储日志
cache_store_log none

# 管理日志
# 通过 debug_options 控制
cache_log /usr/local/squid/var/logs/cache.log
# module,level
# level 1-9
# module 支持 ALL 表示所有模块
# debug_options

# CoreDump 目录
coredump_dir /var/cache/squid

其他配置

# 添加 X-Forwarded-For 头
# off -> unknown
# transparent 不动
# delete 删除头
# truncate 移除现有,添加 客户端 IP
forwarded_for on
# 手机客户端统计信息
client_db on

# 离线模式 - 不验证已缓存的数据
offline_mode off

FAQ

转发所有请求到 HTTP Proxy

cache_peer <Parent_proxy_IP> parent <port> 0 no-query default
acl all src 0.0.0.0/0.0.0.0
http_access allow all
never_direct allow all

根据地址路由 cache_peer


acl up_urls dstdom_regex "/etc/squid/urls"

# SSL bump rules
sslproxy_cert_error allow all
acl DiscoverSNIHost at_step SslBump1
ssl_bump peek DiscoverSNIHost
acl NoSSLIntercept ssl::server_name_regex -i "/etc/squid/urls.nobump"
acl NoSSLIntercept ssl::server_name_regex -i "/etc/squid/urls"
ssl_bump splice NoSSLIntercept
ssl_bump bump all

never_direct allow up_urls
cache_peer 127.0.0.1 parent 8118 0 no-query no-digest default

cache_peer_access 127.0.0.1 allow up_urls
cache_peer_access 127.0.0.1 deny all

TBD

cache_replacement_policy heap LFUDA
range_offset_limit -1
quick_abort_min -1 KB
refresh_pattern . 525600 100% 525600 ignore-reload ignore-no-store ignore-private ignore-auth ignore-must-revalidate store-stale