本篇文章介绍下 ProFTPD 配合 mod_proxy 模块部署 FTP/S 应用层代理服务器,实现正向代理和反向代理。
可以达到的目的:
也就是支持各种协议的组合代理: client --- FTPS ---> proxy --- FTP ---> server client --- FTP ---> proxy --- FTPS ---> server client --- FTPS ---> proxy --- FTPS ---> server client --- FTP ---> proxy --- FTP ---> server
当使用mod_proxy进行代理时,所有数据传输(例如文件上传/下载、目录列表等)都通过mod_proxy; 数据传输不会直接发生在“前端”客户端和“后端”服务器之间。这使得客户端完全不知道后端服务器的网络结构; 这在反向代理时尤为重要,这意味着客户端将mod_proxy视为真正的FTP服务器。
在官网 http://www.proftpd.org/ 下载最新的软件包,解压:
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.9rc3.tar.gz
tar xzf proftpd-1.3.9rc3.tar.gz
在github下载mod_proxy模块:
cd proftpd-1.3.9rc3/contrib
wget https://github.com/Castaglia/proftpd-mod_proxy/archive/refs/tags/v0.9.4.tar.gz
tar zxf v0.9.4.tar.gz
mv proftpd-mod_proxy-0.9.4 mod_proxy
cd ..
配置:
./configure --enable-nls \
--enable-openssl \
--with-modules=mod_proxy:mod_tls
然后
make
首先按前篇文章《使用 ProFTPD 搭建FTP/S 服务器》配置 FTP 或者 FTPS 服务器。
然后在配置中增加如下的代理配置,此时用户验证将会由被代理的服务器完成。
可以放到“主服务器配置” 或 <VirtualHost>, <Global>
标签中。
正向代理 需要由客户端告诉代理服务器最终要访问谁
<IfModule mod_proxy.c>
ProxyEngine on # 启用代理功能
ProxySourceAddress 1.2.3.4 # 配置连接后端服务器时使用的IP,用于多网卡多IP设备
ProxyTables /var/ftp/proxy # 指定数据库文件的路径,用于负载均衡等
ProxyLog /var/log/proftpd/proxy.log # 代理模块的日志文件
ProxyRole forward # 正向代理,客户端指定要代理谁
ProxyForwardMethod user@host # 代理模式, user@host 代表客户端把代理后要访问的最终服务器用@追加到用户名后边
<Class forward-proxy>
# Allow clients from this class to use FTP forward proxying
From 0.0.0.0/0 # 默认只代理私网客户端,在此配置可以代理公网IP客户端
ProxyForwardEnabled on
</Class>
# 正则表达式,配置允许代理的服务器地址格式,限制代理的服务器域名,
# [NC] 不是乱码,意为不区分大小写
ProxyForwardTo ^storage\.proxy\.net\:21$ [NC]
</IfModule>
反向代理 代理服务器已经配好被代理的服务器,对客户端透明。
<IfModule mod_proxy.c>
ProxyEngine on
ProxyTables /var/ftp/proxy
ProxyLog /var/log/proftpd/proxy.log
ProxyRole reverse # 开启反向代理
ProxyReverseConnectPolicy RoundRobin # 反向代理连接策略,详见文档
ProxyReverseServers "ftps://storage.xxxx.yyy:21" "ftps://storage1.xxxx.yyy:21"
</IfModule>
参考:https://htmlpreview.github.io/?https://github.com/Castaglia/proftpd-mod_proxy/blob/master/mod_proxy.html