公司内部有多个研发部门,每个研发部门都需要利用ftp来上传代码,但是外网地址只有一个,一开始我们采用的是利用haproxy加上代理主动端口来实现ftp的反向代理,但是这个方法有一个缺陷就是需要开放大量的主动端口,这样对于服务器的安全性就不是很好,后来找到proftpd的mod_proxy模块具备了类似于nginx的反向代理功能。我这里采用的是基于每个用户的反向代理,这要求每台ftp服务器都配置不同的用户。
1.安装依赖
我用的是centos7.5的环境,可能有一些包默认就已经安装了,所以我安装的依赖就只有下面这些。
yum install -y gcc openssl openssl-devel sqlite sqlite-devel unzip wget
cd /data/tools/
2.下载proftpd
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.6.tar.gz
3.下载mod_proxy模块
wget https://github.com/Castaglia/proftpd-mod_proxy/archive/master.zip
4.解压proftpd
tar -zxf proftpd-1.3.6.tar.gz
ln -s /data/tools/proftpd-1.3.6 /usr/local/proftpd
5.解压mod_proxy模块
cd /data/tools/proftpd-1.3.6 && unzip /data/tools/master.zip -d .
6.将mod_proxy模块移动到contrib目录
mv proftpd-mod_proxy-master/ contrib/mod_proxy
7.编译proftpd并加载mod_proxy模块
./configure --prefix=/usr/local/proftpd/ --with-includes=/usr/include/openssl:/usr/include:/usr/local/src/proftpd-1.3.6/contrib:/usr/local/src/proftpd-1.3.6/contrib/mod_proxy/include --with-libraries=/usr/lib/ssl:/usr/lib/x86_64-linux-
gnu/:/usr/local/src/proftpd-1.3.6/contrib/mod_proxy/lib --enable-openssl --with-modules=mod_sql:mod_sql_sqlite:mod_tls:mod_sftp:mod_proxy --enable-dso
8.安装proftpd
make && make install
9.配置proftpd反向代理
在原生的配置文件中添加如下配置
<IfModule mod_proxy.c>
ProxyEngine on
ProxyLog /var/log/proftpd/proxy.log
ProxyTables /var/ftp/proxy
ProxyRole reverse
ProxyReverseConnectPolicy PerUser
# We need to provide a pool of backend servers as a fallback
ProxyReverseServers ftp://192.168.83.128:2121 ftp://192.168.83.129:2121 ftp://192.168.83.131:2121 ftp://192.168.83.132:2121
# Look up per-user backend servers from user-specific JSON files
ProxyReverseServers file:/var/ftp/proxy/backends/%U.json
</IfModule>
10.配置json文件
因为我们的反向代理策略是基于用户的,所以每台设备的用户名要不一致
在json文件的指定目录下创建以用户名为名字的json文件
例如:
vim /var/ftp/proxy/backends/test128.json
["ftp://192.168.83.128:2121"]
11.后端服务器配置
安装步骤同上
因为我这个是做测试用的,所以只修改了以下这些地方。具体的参数自己去关网上面查看http://www.proftpd.org/
<Anonymous ~test128>
User test128
Group test128
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias anonymous ftp
# Limit the maximum number of anonymous logins
MaxClients 10
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayChdir .message
# Limit WRITE everywhere in the anonymous chroot
<Limit WRITE>
AllowAll
</Limit>