天天看點

proftp配置

安裝proftp之前,必須先做一個工作,假如你的mysql是自己編譯的,那就必須先修改/etc/ld.so.conf,否則後面運作proftp會報錯。

vi /etc/ld.so.conf

添加下面一行:

/usr/local/mysql/lib/mysql

注意大家如果mysql的安裝路徑于我不一樣,則填寫相應的路徑,有關mysql的編譯安裝請參考《Linux+Apache+Mysql+PHP典型配置》。

1。下載下傳相關軟體

wget [url]ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.9.tar.gz[/url]

注:在proftpd-1.3.0的版本之後已經包含了資料庫和磁盤限額的子產品,不需要另添加子產品啦!在源代碼目錄下有contrib和modules目錄!裡面兩個目錄都裝載着一些子產品的代碼!

2。解壓編譯

tar zvxf proftpd-1.2.9.tar.gz

找到#include

編譯:

./configure \

--prefix=/usr/local/proftpd \

--with-modules=mod_sql:mod_sql_mysql:mod_quotatab\

:mod_quotatab_sql:mod_ratio \

--with-includes=/usr/local/mysql/include/mysql \

--with-libraries=/usr/local/mysql/lib/mysql

make
make install

這裡我們編譯的時候已經加進了mysql,quota,ratio等子產品的支援,我會在後面講他們的應用

ok, 現在我們可以來啟動proftp了,隻要

/usr/local/proftpd/sbin/proftpd

用你的ftp用戶端試驗以下,應該可以正常登陸,包括匿名和linux使用者名可以。

其實預設的proftp滿足日常的伺服器管理用還是綽綽有餘的,有個地方還是要修改一下,就是預設proftp的配置檔案不支援ftp續傳,是以我們隻要

vi /usr/local/proftpd/etc/proftpd.conf

添加以下兩行

AllowRetrieveRestart .

AllowStoreRestart .

重新啟動以下proftp,就可以正常續傳檔案了。

建立proftpd腳本

隻要在proftp的源代碼目錄

cp proftpd-1.2.9/contrib/dist/rpm/proftpd.init.d /etc/rc.d/init.d/proftpd

記得修改proftpd檔案,一般要修改proftpd的實際路徑

chmod 755 /etc/rc.d/init.d/proftpd

ok

以後就可以用這個教本來啟動,停止,重新開機proftp

這裡要講一個非常實用的指令,

/usr/local/proftpd/sbin/ftpshut

這個指令還是比較實用的,因為你可能需要不斷的調整你的伺服器,而這個指令就非常靈活,可以在不停止proftpd程序的前提下,定時停止ftp連接配接,這裡将會詳細說它是怎麼使用的。

ftpshut [ -l min ] [ -d min ] time [ warning-message ... ]

-l min: 在ftp關閉服務之前的幾分鐘内,嘗試建立新的ftp連接配接均不被接受

-d min: 在ftp關閉服務之前的幾分鐘内,已經建立的ftp連接配接将被中止

time: 在多少時間後,伺服器将關閉ftp服務,格式有兩種

+number 經過number分鐘後關閉

MMHH 在今天MM:HH伺服器将關閉

注意,這裡我們用這個指令是把ftp服務給停了,但實際的proftpd程序還沒停止,是以一般調試ftp會使用到這個指令。

舉例:

再經過30分鐘後,FTP服務将關閉,在這之前的20分鐘不可接受任何新的ftp連接配接,已經建立的在服務關閉前10分鐘強制斷線,并在用戶端顯示“FTP Server Will shutdown at time”

ftpshut -l 20 -d 10 +30 "FTP Server Will shutdown at time"

其實ftpshut就是産生/etc/shutmsg ,你隻要删除這個檔案ftp又可以重新服務,或者

直接

ftpshut -R

好了,開始講一些proftpd的基本配置吧,其實大家如果熟悉apache的配置的話,你會發現proftpd的設定基本都是類似的,它的配置基本格式是

#全局設定

設定項目1 參數1

設定項目2 參數2

#某個目錄的設定

<Directory "路徑名">

...

</Directory>

#關于匿名使用者的設定

<Anonymous "匿名登陸的目錄">

<Limit 限制動作>

</Limit>

</Anonymous>

我們用到的比較多的可能是Limit的使用,Limit大緻有以下動作,基本能覆寫全部的權限了,大家靈活使用就是了。

CMD:Change Working Directory 改變目錄

MKD:MaKe Directory 建立目錄的權限

RNFR: ReName FRom 更改目錄名的權限

DELE:DELEte 删除檔案的權限

RMD:ReMove Directory 删除目錄的權限

RETR:RETRieve 從服務端下載下傳到用戶端的權限

STOR:STORe 從用戶端上傳到服務端的權限

READ:可讀的權限,不包括列目錄的權限,相當于RETR,STAT等

WRITE:寫檔案或者目錄的權限,包括MKD和RMD

DIRS:是否允許列目錄,相當于LIST,NLST等權限,還是比較實用的

ALL:所有權限

LOGIN:是否允許登陸的權限

針對上面這個Limit所應用的對象,又包括以下範圍

AllowUser 針對某個使用者允許的Limit

DenyUser 針對某個使用者禁止的Limit

AllowGroup 針對某個使用者組允許的Limit

DenyGroup 針對某個使用者組禁止的Limit

AllowAll 針對所有使用者組允許的Limit

DenyAll 針對所有使用者禁止的Limit

關于限制速率的參數為:

TransferRate STOR|RETR 速度(Kbytes/s) user 使用者

下面我們以例子來解說proftp的配置,這樣大家可能更加容易了解。

1。ftp伺服器支援斷點續傳,且最大支援同時10人線上,每個ip隻允許一個連接配接;

2。允許ftpusers使用者組隻能通路自己的目錄,而不能通路上級或者其他目錄;

3。使用者登陸伺服器時不顯示ftp伺服器版本資訊,以增加安全性;

4。建立一個kaoyan的ftp帳戶,屬于ftpusers組,kaoyan使用者隻允許下載下傳,沒有可寫的權限。下載下傳速率限制在50Kbytes/s。

5。建立一個upload使用者,也屬于ftpusers組,同kaoyan使用者的宿主目錄一樣,允許upload使用者上傳檔案和建立目錄的權限,但不允許下載下傳,并且不允許删除目錄和檔案的權限,上傳的速率控制在100Kbytes/s

先是前期的使用者群組添加以及目錄的權限設定

group add ftpusers

useradd -d /home/kaoyan -g ftpusers -s /bin/fales kaoyan

useradd -d /home/kaoyan -g ftpusers -s /bin/fales upload

chown -R kaoyan:upload /home/kaoyan

chmod -R 775 /home/kaoyan

如果你隻想ftpusers組的使用者通路,可以設定成770都行。

設定/usr/local/proftpd/etc/proftpd.conf

注意#表示注釋,對設定沒影響,可以不寫

ServerName "Frank's FTP Server"

ServerType standalone

DefaultServer .

Port 21

Umask 022

MaxInstances 30 #最多有30個proftpd的PID

User nobody

Group nobody

TimeoutStalled 10

MaxClients 10 #最多允許10個使用者線上

MaxClientsPerHost 1 "對不起,一個IP隻允許一個連接配接"

AllowStoreRestart . 

#允許斷點續傳(上傳),斷點續續(下載下傳)是預設支援的,不用設定

DisplayLogin welcome.msg #歡迎詞檔案

ServerIdent off #屏蔽伺服器版本資訊

DefaultRoot ~ ftpusers #設定ftpusers組隻能通路自己的目錄

<Directory />

AllowOverwrite .

<Directory /home/kaoyan>

<Limit WRITE> #不允許寫

DenyUser kaoyan

<Limit RMD RNFR DELE RETR> #不允許删除,改名,下載下傳

DenyUser upload

TransferRate RETR 50 user kaoyan

TransferRate STOR 100 user upload

我這裡實作的方式還可以通過

<Anonymous ~kaoyan>

<><Anonymous ~upload>

而且更加靈活,具體用那種方式,看大家了,我隻是給大家入個門而已

這裡我們再講一些proftp的其他參數配置:

MaxHostsPerUser 1 "對不起,每個帳戶最多允許來源ip為1個"

#MaxHostsPerUser 對防止ftp帳号還是比較有用的。

MaxClientsPerUser 1 "對不起,每個帳戶在每個用戶端最多可以同時登陸1次"

#這個參數可以防止多線程軟體下載下傳對伺服器的破壞

MaxClientsPerHost 1 "對不起,同一個用戶端隻能最多1個帳号可以登陸"

#比如ftp服務端有好多帳戶你都有,但也隻能用1個帳号登陸

呵呵,這三個Max參數比較容易搞暈,大家可要搞清他們的含義哦:)

WtmpLog . 

#是否要把ftp記錄在日志中,如果不想可以設定成off屏蔽掉log日志。

TimeoutIdle 600

#用戶端idel時間設定,預設就是600秒

DisplayLogin welcome.msg

#設定ftp登陸歡迎資訊檔案

關于歡迎檔案的設定包含如下參數

%T 目前的時間 

%F 所在硬碟剩下的容量 

%C 目前所在的目錄 

%R Client 端的主機名稱 

%L Server 端的主機名稱 

%U 使用者帳戶名稱 

%M 最大允許連接配接人數 

%N 目前的伺服器連接配接人數 

%E FTP伺服器管理者的 email 

%i 本次上傳的檔案數量 

%o 本次下載下傳的檔案數量 

%t 本次上傳+下載下傳的檔案數量

知道這些參數,我們就可以寫出一個友好的歡迎語

vi /home/kaoyan/welcome.msg

歡迎您%U,這是Frank的測試FTP伺服器;

目前時間是:%T;

本伺服器最多允許%M個使用者連接配接數;

目前伺服器上已有%N個使用者連接配接數;

目前你所在的目錄是%C;

目錄所在的硬碟還剩下%F位元組。

讓proftp支援現在流行的FXP傳輸方式,預設是不支援的。

隻要在服務端設定

AllowForeignAddress .

PassivePorts 49152 65534 #端口也可自己指定喜歡的

千萬别忘了在用戶端也要設定成支援FXP哦,否則想我試驗了好幾次,一直以為伺服器沒設定好,其實就是用戶端沒設定,呵呵。

如何讓root能登陸,預設proftp是不支援root登陸,我們可以設定讓root也能登陸ftp,不過我在這裡還是建議大家最好不要讓root能登陸ftp,設定如下

RootLogin .

如何禁止某個位址通路ftp

比如禁止10.1.1網段的機器通路ftp,可以這麼設定

<Limit LOGIN>

Order deny,allow

Deny from 10.1.1.

Allow from all

虛拟ftp的建立,一般用于一台ftp伺服器有好多ip位址,或者ftp用不同的端口,基本設定文法是:

比如我們要做一個端口是5555的ftp伺服器:

<VirtualHost 210.51.0.124>

ServerName "Frank FTP Server"

Port 5555

<Directory 目錄>

<Limit 動作>

</VirtualHost>

至于虛拟主機中的其他設定跟我以前講的基本差不多

上傳/下載下傳比率設定,我想用過Serv_U的朋友一定知道這個功能的使用,我們這裡讓proftp也實作這個功能。

要實作功能注意編譯的時候加入ratio子產品,否則proftp預設是不支援,假設有個帳戶ftp1的ftp目錄在/home/kaoyan ,然後我們設定ftp1的上傳/下載下傳比率是1:2(即上傳1M,就可以下載下傳2M)

touch /home/kaoyan/ratio.dat

touch /home/kaoyan/ratio.tmp

chmod -R 666 /home/kaoyan

在proftpd.conf設定如下

Ratios .

SaveRatios .

RatioFile /home/kaoyan/ratio.dat

RatioTempFile /home/kaoyan/ratio.tmp

在相應的

UserRatio ftp1 0 0 2 1000

#UserRatio "使用者帳戶" fileratio filequota byteratio bytequota

#  fileratio :以檔案為基礎的比率,通常不限制,故為 0 

#  filequota :預設定能下載下傳多少檔案,不限制時為 0 

#  byteratio :就是上傳/下載下傳的比例,如果數字為2,表示1:2 

#  bytequota :預設定能下載下傳多少 KBytes 的檔案

#上面設定的就是1:2的比率,預設隻允許下載下傳1M的檔案

ok,重新開機一下,以後ftp1就可以啟用上傳/下載下傳比率了

proftp+mysql+quota的應用

1.首先我們建立相應的使用者和使用者組

groupadd -g 5500 ftpgroup

adduser -u 5500 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

2.操作資料庫

mysql mysql -uroot -ppassword

create database ftpdb

grant select, update . ftpdb.* to proftpd@localhost identified by 'password'

use ftpdb

CREATE TABLE `ftpgroup` (

`groupname` varchar(16) NOT NULL default '',

`gid` smallint(6) NOT NULL default '5500',

`members` varchar(16) NOT NULL default '',

KEY `groupname` (`groupname`)

) TYPE=MyISAM COMMENT='ProFTP group table';

INSERT INTO `ftpgroup` VALUES ('ftpgroup', 5500, 'ftpuser');

CREATE TABLE `ftpquotalimits` (

`name` varchar(30) default NULL,

`quota_type` enum('user','group','class','all') NOT NULL default 'user',

`per_session` enum('false','true') NOT NULL default 'false',

`limit_type` enum('soft','hard') NOT NULL default 'soft',

`bytes_in_avail` float NOT NULL default '0',

`bytes_out_avail` float NOT NULL default '0',

`bytes_xfer_avail` float NOT NULL default '0',

`files_in_avail` int(10) unsigned NOT NULL default '0',

`files_out_avail` int(10) unsigned NOT NULL default '0',

`files_xfer_avail` int(10) unsigned NOT NULL default '0'

) TYPE=MyISAM;

CREATE TABLE `ftpquotatallies` (

`name` varchar(30) NOT NULL default '',

`bytes_in_used` float NOT NULL default '0',

`bytes_out_used` float NOT NULL default '0',

`bytes_xfer_used` float NOT NULL default '0',

`files_in_used` int(10) unsigned NOT NULL default '0',

`files_out_used` int(10) unsigned NOT NULL default '0',

`files_xfer_used` int(10) unsigned NOT NULL default '0'

CREATE TABLE `ftpuser` (

`id` int(10) unsigned NOT NULL auto_increment,

`userid` varchar(32) NOT NULL default '',

`passwd` varchar(32) NOT NULL default '',

`uid` smallint(6) NOT NULL default '5500',

`homedir` varchar(255) NOT NULL default '',

`shell` varchar(16) NOT NULL default '/sbin/nologin',

`count` int(11) NOT NULL default '0',

`accessed` datetime NOT NULL default '0000-00-00 00:00:00',

`modified` datetime NOT NULL default '0000-00-00 00:00:00',

PRIMARY KEY (`id`)

) TYPE=MyISAM COMMENT='ProFTP user table' ;

注意這裡大家根據實際情況填寫自己資料庫的使用者名和密碼,如果大家對資料庫操作不熟悉的話,不妨可以用phpmyadmin來操作。

3.配置proftp檔案

ServerName "Frank's FTP Server" ServerType standalone DefaultServer .

MaxInstances 30

MaxLoginAttempts 3

MaxHostsPerUser 1 "Sorry, you may not connect more than .e time."

MaxClientsPerUser 2 "Only .e such user at a time."

MaxClientsPerHost 3 "Sorry, you may not connect more than .e time."

RootLogin off

Requir.idShell off

MaxClients 10

ServerIdent off

DefaultRoot ~ ftpgroup

SQLAuthTypes Backend Plaintext

#Backend表示使用者認證方式為MySQL資料庫的認證方式 

#Plaintext表示明文認證方式,排在最前面的為最先使用的方式

SQLAuthenticate users* groups*

# databasename@host database_user user_password

SQLConnectInfo ftpdb@localhost proftpd password

SQLUserInfo ftpuser userid passwd uid gid homedir shell

SQLGroupInfo ftpgroup groupname gid members

SQLHomedirOnDemand .

#如果使用者主目錄不存在,則系統會根據此使用者在使用者資料表中的homedir字段的值建立一個目錄

# Update count every time user logs in

SQLLog PASS updatecount

SQLNamedQuery updatecount UPDATE "count=count+1,accessed=now() WHERE userid='%u'" ftpuser

# Update modified everytime user uploads or deletes a file

SQLLog STOR,DELE modified

SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

QuotaEngine .

QuotaDirectoryTally .

QuotaDisplayUnits Mb

QuotaShowQuotas .

QuotaLog "/var/log/quota"

SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avai

l, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}'

AND quota_type = '%{1}'"

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_i

n_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used

+ %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_

out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquota

tallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

QuotaLimitTable sql:/get-quota-limit

QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

ok,就這麼簡單,重新開機一下proftp服務就已經能使用proftp+mysql+quota的功能

我們可以在資料庫ftpuser添加一個虛拟使用者,

INSERT INTO `ftpuser` VALUES (1, 'test', 'ftppasswd', 5500, 5500, '/home/test', '/sbin/nologin');

大家可以在phpmyadmin裡直接操作添加一個使用者,相信不用我教大家怎麼添加吧:)

如果你想設定quota,隻要在ftpquotalimits表裡設定一下就行了,這個表裡的各個參數分别代表:

quotalimits表

name: - 使用者帳号

quota type: - user, group, class, all (we use user)

per_session: - true or false (we use true)

limit_type: - 硬限制 or 軟限制 (我們一般用硬限制)

bytes_in_avail: - 允許上傳的位元組數

bytes_out_avail: - 允許下載下傳的位元組數

bytes_xfer_avail: - 允許傳輸的位元組數(包括上傳/下載下傳)

files_in_avail: - 允許上傳的檔案數

files_out_avail: - 允許下載下傳的檔案數

files_xfer_avail: - 允許傳輸的檔案數(包括上傳/下載下傳)

老實說用mysql和quota子產品來驗證使用者和設定磁盤限額,但我總覺得還是不夠完善,因為在這個方法中,資料庫表裡還沒有相應的權限的字段,是以說相應使用者的權限還是得用實際得使用者即mysql對應得uid和gid來控制權限,那天要是mysql資料庫也能完全控制權限就好了。

最後附上自己的配置檔案# This is a basic ProFTPD configuration file (rename it to

# 'proftpd.conf' for actual use.    It establishes a single server

# and a single anonymous login.    It assumes that you have a user/group

# "nobody" and "ftp" for normal operation and anon.

ServerName      "Welcomk kang mei live"

ServerType      standalone  

DefaultServer      \on

# Port 21 is the standard FTP port.

Port       21  可以更改端口

# Umask 022 is a good standard umask to prevent new dirs and files

# from being group and world writable.

Umask        002

# To prevent DoS attacks, set the maximum number of child processes

# to 30.    If you need to allow more than 30 concurrent connections

# at .ce, simply increase this value.    Note that this .LY works

# in standalone mode, in inetd mode you should use an inetd server

# that allows you to limit maximum number of processes per service

# (such as xinetd).

MaxInstances      30

MaxClients       10  最大十個連接配接

WtmpLog        \on   打開日志

# Set the user and group under which the server will run.

User        nobody

Group        nobody

# To cause every FTP user to be "jailed" (chrooted) into their home

# directory, uncomment this line.

DefaultRoot ~ ftpuser   如果想拒絕多個組,那麼必須要另起一行。每一行指定一個組

ServerIdent  off 

RootLogin  off    禁止root登入

DeferWelcome   off  關閉歡迎詞

DirFakeUser     \on  FTP   #不顯示給使用者真實的使用者、組

DirFakeGroup    \on  FTP   

IdentLookups     off   #連接配接快些 禁止位址反向解析

UseReverseDNS    off

AllowForeignAddress \on

AllowRetrieveRestart  \on

AllowStoreRestart  \on

AllowOverwrite    \on

<Limit LOGIN>   設定登入權限

DenyAll

AllowGroup ftpuser  

Order Allow,Deny

Allow from 210.XX.XX.XXX 

Deny from all

#<Limit SITE_CHMOD>

#DenyAll

#</Limit>

# Normally, we want files to be overwriteable.

# Bar use of SITE CHMOD by default

<Directory 目錄名>

<Limit WRITE STOR DIRS RETR DELE RMD>

DenyAll                               上面這個limit比下面多了個dele權限,如果這裡不注明拒絕所有使用者,那麼下面這個使用者依然有dele權限

AllowUser  使用者名

<Limit WRITE STOR DIRS RETR >

AllowUser   使用者名

#<Limit RETR DELE RMD>

# A basic anonymous configuration, no upload directories.    If you do not

# want anonymous users, simply delete this entire <Anonymous> section.

#<Anonymous ~ftp>

#    User        ftp

#    Group        ftp

    # 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>

#     DenyAll

## </Limit>

#</Anonymous>

拒絕登入ftp的使用者可以寫在/etc/ftpusers檔案裡!

檔案虛拟使用者

所謂虛拟,就是說這個使用者不是系統使用者,而隻是ProFTPD自己的私有使用者。和windows中的FTP server軟體serv-U中的使用者很像。由于不是系統使用者,使用虛拟使用者可以提高安全性。

虛拟使用者的資訊可以從普通檔案、資料庫、LDAP伺服器等地方獲得。此處介紹最簡單的一種,讓ProFTPD從檔案獲得虛拟使用者資訊。

1. 在/etc/proftpd.conf中加入

AuthOrder mod_auth_file.c

AuthUserFile /usr/local/etc/proftpd/passwd

AuthGroupFile /usr/local/etc/proftpd/group

其中,AuthOrder指定了權限檢查的順序。這裡隻使用虛拟使用者。AuthUserFile和AuthGroupFile的檔案格式看passwd(5)和group(5)。如果使用者名群組名與系統的重複,看DirFakeUser和DirFakeGroup。

2. 使用ftpasswd建立passwd和group檔案

$ ftpasswd --passwd --file=/usr/local/etc/proftpd/passwd --name=test1 --uid=2001 \

 --home=/home/nohome --shell=/bin/false

$ ftpasswd --passwd --file=/usr/local/etc/proftpd/passwd --name=test2 --uid=2002 \

建立了一個test1和test2使用者

$ ftpasswd --group --name=test --gid=2001

建立了一個test組

$ ftpasswd --group --name=test --gid=2001 --member=test1 --member=test2

把test1和test2加入test組

注:UID和GID必須要指定為系統的UID和GID

3. 重新開機proftpd 

備注:

ftpasswd指令在proftpd的源代碼包裡就有,比如我的就在:

/usr/src/proftpd-1.3.1/contrib/ftpasswd

把ftpasswd改為可執行,拷貝到你可以用的任意地方就行了。

繼續閱讀