Squid Web Cache Wiki

Squid Web Cache 文档

🔗 功能:原生 FTP 代理

🔗 功能

此项目为 squid.conf 添加了 ftp_port 选项。Squid 作为 FTP 到 FTP 的网关,处理发送到该端口的 TCP 流量。

  1. Squid 监听发送到配置端口的原生 FTP 请求。
  2. Squid 将收到的 FTP 命令转换为内部 HTTP 包装请求,
  3. Squid 将这些内部请求从客户端转发到服务器端(照常对其应用访问控制和可选内容适应)。
  4. 未来,Squid 甚至可能将这些 HTTP 包装请求转发给对等节点,但这超出了初始实现的范围。
  5. 在服务器端,Squid 将 HTTP 包装请求转换为 FTP 命令,并将这些命令转发给 FTP 服务器。
  6. 同样,FTP 服务器响应也会被包装在 HTTP 响应中转发回 FTP 客户端。
  7. Squid 使用 HTTP 包装和现有的访问日志代码记录 FTP 事务。

🔗 映射

🔗 FTP 命令到 HTTP 请求的映射

每个 FTP 命令(无论 Squid 是否理解)都映射到一个 HTTP 请求。

HTTP 请求属性 映射算法
请求方法 对于 FTP STOR 使用“PUT”。否则 GET?
请求 URI ftp://host/ (目前;参见未来增强功能)
请求协议和版本 HTTP/1.1 (对于 Squid 核心而言,这些包装消息就是这个。此外,一些 ICAP 服务可能无法处理 FTP/x.y)
Host 头部 FTP 服务器名称,后跟非标准端口(如果存在)
FTP-Command FTP 命令名称
FTP-Arguments FTP 命令参数(即,FTP 命令名称和 CRLF 之间的所有内容)。如果 CRLF 紧跟命令名称,则不存在。如果 SP CRLF 紧跟命令名称,则存在但为空。

🔗 FTP 回复到 HTTP 响应的映射

HTTP 响应属性 映射算法
响应状态码和原因短语 对于任何被识别的 FTP 1xx 回复,为 100 Continue;对于任何其他被识别的 FTP 服务器回复,为 200 OK;否则为 500 Server Error。
请求协议和版本 HTTP/1.1 (这样 ICAP 服务就不会因 FTP/x.y 而失败)
日期 FTP 回复开始日期
Cache-Control “private”(在跟踪请求 URI 之前,Squid 无法缓存这些)
Content-Length 如果有关联的文件传输,则无;否则为零。
FTP-Status FTP 回复代码(例如,431)
FTP-Reason FTP 解释性文本(例如,“目录不存在”)。

🔗 FTP 主体传输的映射

Squid 不使用 HTTP 构造在内部转发 HTTP 主体。代码将必须使用现有的 Squid 主体转发 API(请求主体的 BodyPipe 和响应主体的 Store)。

🔗 传输失败

像 HTTP 主体传输失败一样终止主体传输。对于回复主体,向客户端发送一个 1xx 控制消息,指示最终的 FTP 状态码。

🔗 映射示例

标签 FTP-C Squid-C FTP-S Squid-S
发送内容 FTP 命令 HTTP 请求 FTP 回复 HTTP 响应
发送者和接收者 客户端到 Squid Squid 客户端侧到服务器侧 服务器到 Squid Squid 服务器侧到客户端侧
Squid 到服务器 Squid 到客户端      
 FTP client <--> Squid Squid client-side <--> Squid server-side Squid <--> FTP server
 ------------------------------- ------------------------------------------ -------------------------------
 
 USER anonymous@ftp.example.com 
 
 GET ftp://ftp.example.com/ HTTP/1.1
 Host: ftp.example.com
 FTP-Command: USER
 FTP-Arguments: anonymous@ftp.example.com
 
 USER anonymous@ftp.example.com
 
 331 User name okay, need password.
 
 HTTP/1.1 200 OK
 Date: ...
 Cache-Control: private
 Content-Length: 0
 FTP-Status: 331
 FTP-Reason: User name okay, need password.
 
 331 User name okay, need password.
 ...
 RETR test.gz
 
 GET ftp://ftp.example.com/ HTTP/1.1
 Host: ftp.example.com
 FTP-Command: RETR
 FTP-Arguments: test.gz
 
 RETR test.gz
 
 150 File status okay; about to open data...
 
 HTTP/1.1 100 Continue
 Date: ...
 Cache-Control: private
 FTP-Status: 150
 FTP-Reason: File status okay; about to open data...
 
 150 File status okay; about to open data...

🔗 日志记录

单独的 FTP 事务(命令和回复)被记录为 HTTP 事务(缺少 HTTP 特定信息),并使用现有的访问日志功能。访问日志中应包含以下详细信息:

请注意,Squid 不会在 HTTP 包装消息中将 FTP 状态码映射到 HTTP 状态码,因此 FTP 和/或日志代码可能需要调整记录的值,以反映真实的 FTP 状态,而不是包装 HTTP 消息的 HTTP 状态。

🔗 未来增强功能

一个非常有用的但难以支持的功能是跟踪通过 CD 等命令的 FTP 当前目录或请求目录。 such tracking would allow simple access controls based on request URIs. 虽然基本的跟踪并不难支持,但 FTP 目录链接使得正确支持非常棘手(在某些情况下甚至不可能):在 FTP 中,“foo/bar/..”路径(即一系列“CD foo”、“CD bar”和“CD ..”命令)可能导致当前位置与“foo”不同(即,“PWD”命令不会打印“foo”)。最终,Squid 可能会使用一种或多种算法来跟踪 URI,但此项目不包含此类支持或决定实现哪种 URI 跟踪算法。

类别:功能

导航:站点搜索站点页面类别🔼 向上