大规模集群FTP代理的解决方案

Share To Facebook Twitter

在日常工作中,我们经常需要在某服务器上开FTP(Server)服务。但就是这么简单的事情通常也会变得很复杂,原因如下:

1、需要开通FTP的服务器没有公网IP地址;(即不能直接访问到)

2、这样的服务器很多,可能是成百上千台;

3、所有的FTP账号必须为虚拟账号,不能为本地,而且需要集中存储。

这种情况很多,比如企业中通常需要给开发、测试人员相应的开发、测试环境,而这环境里面的机器通常只有有私网地址,开发人员需要通过FTP上传自己的代码等。

【解决方案】

1、对于问题1(无公网地址),解决的方法其实很多,比如使用Iptables做端口映射,甚至使用VPN,但这都太复杂、维护成本高;更好的办法是使用一台有公网(同时又有私网)的服务器做FTP代理,而这种代理只要开启即可,不需要为后面每台真正的FTP Server设置NAT。(这和iptables的方式不一样)

2、对于问题2,3只能使用虚拟账号,并将所有账号信息集中存储到某数据库中。

大体架构如下:

大规模集群FTP代理的解决方案

此架构假设:

* FTP代理服务器的IP地址为:8.8.8.8(公网)和192.168.1.10(私网)

* FTP Server使用pureftpd,地址为192.168.1.11

* MySQL Server IP地址为192.168.1.15

在这种架构下,用户登陆FTP的流程如图所示:

1. 用户提交用户名和密码给FTP Proxy

2.FTP Proxy访问FTP Server

3.FTP Server访问MySQL Server进行用户名密码验证

【配置过程】

1. 配置FTP Proxy服务器-8.8.8.8

1.1 下载和安装FTP proxy:

  wget ftp://ftp.ftpproxy.org/pub/ftp.proxy/ftpproxy-1.2.3.tgz  tar czvf ftpproxy-1.2.3.tgz  cd ftpproxy-1.2.3  make && make install

1.2 启动ftp.proxy

  ftp.proxy -D 2121 -e -l -m -t 1800

参数说明如下:

1)-D 2121 指定端口为2121

2)-e 启用客户端服务器选择(非常重要),通常我们的ftp账号为ftpuser这种,那么使用此参数后,我们可以访问后端的某台服务器,比如192.168.1.15,使用的账号名变成:ftpuser@192.168.1.15

3)-l Logging

4)-m monitor mode

5)-t 1800 超时时间

2.配置MySQL Server(192.168.1.15)

2.1 安装mysql:(假设还没安装)

  yum install mysql-server

2.2 修改/etc/my.cnf:

  bind-address=192.168.1.15

2.3

  service mysqld start

2.4 修改mysql root密码:

  mysqladmin -u root password rootpassword

2.5 创建pure-ftpd需要的数据库

  mysql -u root -p rootpassword

执行如下SQL语句:

  CREATE DATABASE pureftpd;  USE pureftpd;  CREATE TABLE `users` (  `id` int(32) unsigned NOT NULL auto_increment,  `User` varchar(16) NOT NULL default '',  `Password` varchar(64) NOT NULL default '',  `Uid` varchar(11) NOT NULL default '-1',  `Gid` varchar(11) NOT NULL default '-1',  `Dir` varchar(128) NOT NULL default '',  `QuotaSize` smallint(5) NOT NULL default '0',  `QuotaFiles` int(11) NOT NULL default '0',  `ULBandwidth` smallint(5) NOT NULL default '0',  `DLBandwidth` smallint(5) NOT NULL default '0',  `ULRatio` smallint(6) NOT NULL default '0',  `DLRatio` smallint(6) NOT NULL default '0',  `comment` tinytext NOT NULL,  `ipaccess` varchar(15) NOT NULL default '*',  `status` enum('0','1') NOT NULL default '0',  `create_date` datetime NOT NULL default '0000-00-00 00:00:00',  `modify_date` datetime NOT NULL default '0000-00-00 00:00:00',  PRIMARY KEY (`id`,`User`),  UNIQUE KEY `User` (`User`)  ) TYPE=MyISAM AUTO_INCREMENT=5 ;

3. 在FTP Proxy服务器上(8.8.8.8)配置pureftpd PHP Manager:

3.1假设Apache2(没有安装自行安装吧)已经安装在/usr/local/apache2目录下,执行如下命令:

  mkdir -p /usr/local/apache2/htdocs/ftp  cd /usr/local/apache2/htdocs/ftp  chown -R nobody:nobody /usr/local/apache2/htdocs/ftp  wget http://bbs.chinaunix.net/attachments/month_0701/pureftpd_php_manager_BbPy87OS0Gaj.zip  unzip pureftpd_php_manager_BbPy87OS0Gaj.zip  cp pureftpd-mysql.conf.sample pureftpd-mysql.conf

3.2修改pureftp.config.php(pureftp_php_manager连接mysqld的配置文件地址)

  $PUREFTP_CONFIG_FILE = '/usr/local/apache2/htdocs/ftp/pureftpd-mysql.conf';

3.3 修改/usr/local/apache2/htdocs/ftp/pureftpd-mysql.conf中相关信息:

  MYSQLServer 192.168.1.15  MYSQLPort 3306  MYSQLSocket /var/lib/mysql/mysql.sock  MYSQLUser root  MYSQLPassword rootpassword  MYSQLDatabase pureftpd  MYSQLCrypt crypt(密码加密方式)

4. 配置FTP服务器-192.168.1.11(安装和配置pure-ftpd)

4.1 安装pure-ftpd(加入MySQL支持)

  wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.29.tar.bz2  tar jxvf pure-ftpd-1.0.29.tar.bz2  cd pure-ftpd-1.0.29  ./configure --prefix=/usr/local/pureftpd --with-mysql --with-shadow --with-pam --with-paranoidmsg --with-welcomemsg --with-uploadscript --with-cookie --with-virtualchroot --with-virtualhosts --with-diraliases --with-quotas --with-sysquotas --with-ratios --with-ftpwho --with-throttling  make && make install  cd configuration-file  cp pure-config.pl /usr/local/pureftpd/bin/  chmod +x/usr/local/pureftpd/bin/pure-config.pl  mkdir -p /usr/local/pureftpd/etc  cp pure-ftpd.conf /usr/local/pureftpd/etc  cd ..  cp pureftpd* /usr/local/pureftpd/etc/

4.2 修改/usr/local/pureftpd/etc/pure-ftpd.conf:

  MySQLConfigFile /usr/local/pureftpd/etc/pureftpd-mysql.conf

提示:如果FTP账号为nobody这种权限,UID(通常为99)小于1024,需要修改MinUID参数:

  MinUID 98

否则出现错误:

Can't login as [xxx] account disabled pureftpd

4.3. 修改/us/local/pureftpd/etc/pureftpd-mysql.conf:

和3.3内容完全一样。

4.4 启动pure-ftpd:

  /usr/local/pureftpd/bin/pure-config.pl /usr/local/pureftpd/etc/pure-ftpd.conf

5.登陆Pureftpd PHP Manager页面创建FTP虚拟账号:

登陆http://8.8.8.8/ftp,创建账号:

大规模集群FTP代理的解决方案
如图创建的账号名为:testftp, 主目录为/opt/wwwroot还可以进行其他的设置,自己看图咯 :)

注意:

1.此账号只是虚拟账号,并不存在于任何FTP Server上(/etc/passwd文件中),而是存储于MySQL中。

2. IP Access设置为*,表示可以访问任何FTP Server

6.测试登陆:

  ftp 8.8.8.8 2121  Connected to 8.8.8.8.  220 server ready - login please  530 login first  530 login first  KERBEROS_V4 rejected as an authentication type  Name (8.8.8.8:root): testftp@192.168.1.11(要访问哪台,就加入@ip 后缀)  331 password required  Password:  230 login accepted  Remote system type is UNIX.  Using binary mode to transfer files.  ftp>

注意:如果FTP Server还有192.168.1.12等地址,也可以用testftp@192.168.1.12来登陆192.168.1.12这台FTP Server

原文:http://www.sapub.net/html/y2010/ftp-proxy-large-scale-site.html

(责任编辑:IT)

发表评论