目录
与 HTTP 代理相比,FTP 代理要特殊很多,因为 FTP 要使用随机端口来传输数据,端口号在运行时确定并通过控制链路(控制链路传输 FTP 命令和响应,数据链路传输文件内容)传输,因此代理服务器必须要解析控制链路的响应或请求并替换。
HTTP 代理就要简单很多,客户端与 proxy 通信,并将 Host header 填成 real server 的地址,proxy 之间将整个 TCP message body 转发即可,也就是说,HTTP 代理即可使用四层代理,也可以使用三层代理(端口转发),但 FTP 只能使用四层代理,因为 FTP client 要解析 FTP server reply 取得数据链路地址,三层代理会导致 proxy 只代理控制链路,数据链路依然直连 real server.
FTP proxy 的局限性非常大,如果对客户端透明(即客户端连 proxy 或 real server 只需修改 ip:host),一组 FTP proxy 实例只能代理一个 FTP server, 因为 proxy 无法知晓客户端要连的 real server 的地址(HTTP proxy 能通过 Host header 知道 real server 地址是多少)。
ftp.proxy
在常用的开源代理软件中,Apache 和 Squid 都支持 FTP 代理,但都不是真正意义上的 FTP 代理。详细信息可以见官方文档:
Apache Module mod_proxy_ftp
squid-cache wiki - Feature: Native FTP proxying
ftp.proxy 不太出名,应用也不广,但是功能满足 FTP 代理服务器的需求。
安装
yum install ctags
tar -xzf ftpproxy-1.2.3.tgz && \
cd ftpproxy-1.2.3 && \
sed -i 's/\/usr\/local\/man\/man1/\/usr\/local\/share\/man\/man1/g' Makefile && \
make &