大規(guī)模集群FTP代理的解決方案
在日常工作中,我們經(jīng)常需要在某服務(wù)器上開FTP(Server)服務(wù)。但就是這么簡單的事情通常也會(huì)變得很復(fù)雜,原因如下:
1、需要開通FTP的服務(wù)器沒有公網(wǎng)IP地址;(即不能直接訪問到)
2、這樣的服務(wù)器很多,可能是成百上千臺(tái);
3、所有的FTP賬號(hào)必須為虛擬賬號(hào),不能為本地,而且需要集中存儲(chǔ)。
這種情況很多,比如企業(yè)中通常需要給開發(fā)、測(cè)試人員相應(yīng)的開發(fā)、測(cè)試環(huán)境,而這環(huán)境里面的機(jī)器通常只有有私網(wǎng)地址,開發(fā)人員需要通過FTP上傳自己的代碼等。
【解決方案】
1、對(duì)于問題1(無公網(wǎng)地址),解決的方法其實(shí)很多,比如使用Iptables做端口映射,甚至使用VPN,但這都太復(fù)雜、維護(hù)成本高;更好的辦法是使用一臺(tái)有公網(wǎng)(同時(shí)又有私網(wǎng))的服務(wù)器做FTP代理,而這種代理只要開啟即可,不需要為后面每臺(tái)真正的FTP Server設(shè)置NAT。(這和iptables的方式不一樣)
2、對(duì)于問題2,3只能使用虛擬賬號(hào),并將所有賬號(hào)信息集中存儲(chǔ)到某數(shù)據(jù)庫中。
大體架構(gòu)如下:
此架構(gòu)假設(shè):
* FTP代理服務(wù)器的IP地址為:8.8.8.8(公網(wǎng))和192.168.1.10(私網(wǎng))
* FTP Server使用pureftpd,地址為192.168.1.11
* MySQL Server IP地址為192.168.1.15
在這種架構(gòu)下,用戶登陸FTP的流程如圖所示:
1. 用戶提交用戶名和密碼給FTP Proxy
2.FTP Proxy訪問FTP Server
3.FTP Server訪問MySQL Server進(jìn)行用戶名密碼驗(yàn)證
【配置過程】
1. 配置FTP Proxy服務(wù)器-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 啟動(dòng)ftp.proxy
ftp.proxy -D 2121 -e -l -m -t 1800
參數(shù)說明如下:
1)-D 2121 指定端口為2121
2)-e 啟用客戶端服務(wù)器選擇(非常重要),通常我們的ftp賬號(hào)為ftpuser這種,那么使用此參數(shù)后,我們可以訪問后端的某臺(tái)服務(wù)器,比如192.168.1.15,使用的賬號(hào)名變成:ftpuser@192.168.1.15
3)-l Logging
4)-m monitor mode
5)-t 1800 超時(shí)時(shí)間
2.配置MySQL Server(192.168.1.15)
2.1 安裝mysql:(假設(shè)還沒安裝)
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 創(chuàng)建pure-ftpd需要的數(shù)據(jù)庫
mysql -u root -p rootpassword
執(zhí)行如下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服務(wù)器上(8.8.8.8)配置pureftpd PHP Manager:
3.1假設(shè)Apache2(沒有安裝自行安裝吧)已經(jīng)安裝在/usr/local/apache2目錄下,執(zhí)行如下命令:
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中相關(guān)信息:
MYSQLServer 192.168.1.15 MYSQLPort 3306 MYSQLSocket /var/lib/mysql/mysql.sock MYSQLUser root MYSQLPassword rootpassword MYSQLDatabase pureftpd MYSQLCrypt crypt(密碼加密方式)
4. 配置FTP服務(wù)器-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賬號(hào)為nobody這種權(quán)限,UID(通常為99)小于1024,需要修改MinUID參數(shù):
MinUID 98
否則出現(xiàn)錯(cuò)誤:
Can't login as [xxx] account disabled pureftpd
4.3. 修改/us/local/pureftpd/etc/pureftpd-mysql.conf:
和3.3內(nèi)容完全一樣。
4.4 啟動(dòng)pure-ftpd:
/usr/local/pureftpd/bin/pure-config.pl /usr/local/pureftpd/etc/pure-ftpd.conf
5.登陸Pureftpd PHP Manager頁面創(chuàng)建FTP虛擬賬號(hào):
登陸http://8.8.8.8/ftp,創(chuàng)建賬號(hào):
如圖創(chuàng)建的賬號(hào)名為:testftp, 主目錄為/opt/wwwroot還可以進(jìn)行其他的設(shè)置,自己看圖咯 :)
注意:
1.此賬號(hào)只是虛擬賬號(hào),并不存在于任何FTP Server上(/etc/passwd文件中),而是存儲(chǔ)于MySQL中。
2. IP Access設(shè)置為*,表示可以訪問任何FTP Server
6.測(cè)試登陸:
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(要訪問哪臺(tái),就加入@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這臺(tái)FTP Server
原文:http://www.sapub.net/html/y2010/ftp-proxy-large-scale-site.html
【編輯推薦】