天天看點

redhat linux 下FTP配置

3.2 VSFTP—安全與效能兼備的ftp 伺服器

3.2.1 VSFTP 概述

FTP,file transfer protocol,這是檔案傳輸的通訊協定,也是一般最常用來傳送檔案的方式。讀者在使用RedHat9 的時候,可能會感受到ftp server 有一些改變:第一,就是ftp server 隻剩下vsftp,原有的wuftp 等都沒放入﹔第二,就是vsftp 從XINETD 中獨立出來,并将設定檔從/etc/vsftpd.conf 之中移到/etc/vsftpd/vsftpd.conf。

為什麼做這樣的改變?可以想見的是vsftp 已有獨立運作的能力,不需要XINETD 來做更進一步的管控,并且類似sendmail、httpd、ssh、samba 等,将設定檔案的放入/etc 下獨立的目錄。

FTP 分為兩類,一種為PORT FTP,也就是一般的FTP﹔另一類是PASVFTP,分述如下: PORT FTP

這是一般形式的FTP,首先會建立控制頻道,預設值是port 21,也就是跟

port 21 建立聯機,并透過此聯機下達指令。第二,由FTP server 端會建立資料

傳輸頻道,預設值為20,也就是跟port 20 建立聯機,并透過port 20 作資料的

傳輸。

PASV FTP

跟PORT FTP 類似,首先會建立控制頻道,預設值是port 21,也就是跟

port 21 建立聯機,并透過此聯機下達指令。第二,會由client 端做出資料傳輸

的請求,包括資料傳輸port 的數字。

這兩者的差異為何?PORT FTP 當中的資料傳輸port 是由FTP server 指定,

而PASV FTP 的資料傳輸port 是由FTP client 決定。通常我們使用PASV FTP,

是在有防火牆的環境之下,透過client 與server 的溝通,決定資料傳輸的port。

3.2.2 範例

3.2.1. 直接啟動VSFTP 服務

這個範例是套用RedHat 的預設範例,直接啟動vsftp。

[[email protected] vsftpd]# /sbin/service vsftpd start

Starting vsftpd for vsftpd: OK ]

3.2.2. 更換port 提供服務:将預設的port 21 更換為2121

為了安全,或是以port 來區隔不同的ftp 服務,我們可能會将ftp port 改為

21 之外的port,那麼,可參考以下步驟。

Step1. 修改/etc/vsftpd/vsftpd.conf

新增底下一行

listen_port=2121

Step2. 重新啟動vsftpd

[[email protected] vsftpd]# /sbin/service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpd for vsftpd: OK ]

3.2.3. 特定使用者peter、john 不得變更目錄

使用者的預設目錄為/home/username,若是我們不希望使用者在ftp 時能夠

切換到上一層目錄/home,則可參考以下步驟。

Step1. 修改/etc/vsftpd/vsftpd.conf

将底下三行

#chroot_list_enable=YES

# (default follows)

#chroot_list_file=/etc/vsftpd.chroot_list

改為

chroot_list_enable=YES

# (default follows)

chroot_list_file=/etc/vsftpd/chroot_list

Step2. 新增一個檔案: /etc/vsftpd/chroot_list

内容增加兩行:

peter

john

Step3. 重新啟動vsftpd

[[email protected] vsftpd]# /sbin/service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpd for vsftpd: OK ]

若是peter 欲切換到根目錄以外的目錄,則會出現以下警告:

ftp> cd /home

550 Failed to change directory.

3.2.4. 取消anonymous 登入

若是讀者的主機不希望使用者匿名登入,則可參考以下步驟。

Step1. 修改/etc/vsftpd/vsftpd.conf

anonymous_enable=YES

改為

anonymous_enable=NO

Step2. 重新啟動vsftpd

[[email protected] vsftpd]# /sbin/service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpd for vsftpd: OK ]

3.2.5. 安排歡迎話語

若是我們希望使用者在登入時,能夠看到歡迎話語,可能包括對該主機的

說明,或是目錄的介紹,可參考以下步驟。

首先确定在/etc/vsftpd/vsftpd.conf 當中是否有底下這一行

dirmessage_enable=YES

RedHat9 的預設值是有上面這行的。

接着,在各目錄之中,新增名為.message 的檔案,再這邊假設有一個使用

者test1,且此使用者的根目錄下有個目錄名為abc,那首先我們在/home/test1

之下新增.message,内容如下:

Hello~ Welcome to the home directory

This is for test only...

接着,在/home/test1/abc 的目錄下新增.message,内容如下:

Welcome to abc's directory

This is subdir...

那麼,當使用者test1 登入時,會看到以下訊息:

230- Hello~ Welcome to the home directory

230-

230- This is for test only...

230-

若是切換到abc 的目錄,則會出現以下訊息:

250- Welcome to abc's directory

250-

250- This is subdir ...

3.2.6. 對于每一個聯機,以獨立的process 來運作

一般啟動vsftp 時,我們隻會看到一個名為vsftpd 的process 在運作,但若

是讀者希望每一個聯機,都能以獨立的process 來呈現,則可執行以下步驟。

Step1. 修改/etc/vsftpd/vsftpd.conf

新增底下一行

setproctitle_enable=YES

Step2. 重新啟動vsftpd

[[email protected] vsftpd]# /sbin/service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpd for vsftpd: OK ]

使用ps -ef 的指令,可以看告不同使用者聯機的情形,如下圖所示:

[[email protected] vsftpd]# ps -ef|grep ftp

root 2090 1 0 16:41 pts/0 00:00:00 vsftpd: LISTENER

nobody 2120 2090 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244:

connected

test1 2122 2120 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244/test1:

IDLE

nobody 2124 2090 0 17:19 ? 00:00:00 vsftpd: 192.168.10.244:

connected

test2 2126 2124 0 17:19 ? 00:00:00 vsftpd: 192.168.10.244/test2:

IDLE

root 2129 1343 0 17:20 pts/0 00:00:00 grep ftp

[[email protected] vsftpd]#

3.2.7. 限制傳輸檔案的速度:本機的使用者最高速度為200KBytes/s,匿名登入

者所能使用的最高速度為50KBytes/s

Step1. 修改/etc/vsftpd/vsftpd.conf

新增底下兩行

anon_max_rate=50000

local_max_rate=200000

Step2. 重新啟動vsftpd

[[email protected] vsftpd]# /sbin/service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpd for vsftpd: OK ]

在這邊速度的機關為Bytes/s,其中anon_max_rate 所限制的是匿名登入的

使用者,而local_max_rate 所限制的是本機的使用者。VSFTPD 對于速度的限

制,範圍大概在80%到120%之間,也就是我們限制最高速度為100KBytes/s,

但實際的速度可能在80KBytes/s 到120KBytes/s 之間,當然,若是頻寬不足

時,數值會低于此限制。

3.2.8. 針對不同的使用者限制不同的速度:假設test1 所能使用的最高速度為

250KBytes/s,test2 所能使用的最高速度為500KBytes/s。

Step1. 修改/etc/vsftpd/vsftpd.conf

新增底下一行

user_config_dir=/etc/vsftpd/userconf

Step2. 新增一個目錄:/etc/vsftpd/userconf

mkdir /etc/vsftpd/userconf

Step3. 在/etc/vsftpd/userconf 之下新增一個名為test1 的檔案

内容增加一行:

local_max_rate=250000

Step4. 在/etc/vsftpd/userconf 之下新增一個名為test2 的檔案

内容增加一行:

local_max_rate=500000

Step5. 重新啟動vsftpd

[[email protected] vsftpd]# /sbin/service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpd for vsftpd: OK ]

3.2.9-1. 建置一個防火牆下的ftp server,使用PORT FTP mode:預設的ftp

port:21 以及ftp data port:20

啟動VSFTPD 之後執行以下兩行指令,隻允許port 21 以及port 20 開放,

其它關閉。

iptables -A INPUT -p tcp -m multiport --dport 21,20 -j ACCEPT

iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

3.2.9-2. 建置一個防火牆下的ftp server,使用PORT FTP mode:ftp port:2121

以及ftp data port:2020

Step1. 執行以下兩行指令,隻允許port 2121 以及port 2020 開放,其它關閉。

iptables -A INPUT -p tcp -m multiport --dport 2121,2020 -j ACCEPT

iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

Step2. 修改/etc/vsftpd/vsftpd.conf

新增底下兩行

listen_port=2121

ftp_data_port=2020

Step3. 重新啟動vsftpd

[[email protected] vsftpd]# /sbin/service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpd for vsftpd: OK ]

在這邊要注意,8、9 兩個例子中,ftp client(如cuteftp)的聯機方式不能

夠選擇passive mode,否則無法建立資料的聯機。也就是讀者可以連上ftp

server,但是執行ls、get 等等的指令時,便無法運作。

3.2.10. 建置一個防火牆下的ftp server,使用PASS FTP mode:ftp port:2121

以及ftp data port 從9981 到9986。

Step1. 執行以下兩行指令,隻允許port 2121 以及port 9981-9990 開放,其它關

閉。

iptables -A INPUT -p tcp -m multiport --dport

2121,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990 -j ACCEPT

iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

Step2. 修改/etc/vsftpd/vsftpd.conf

新增底下四行

listen_port=2121

pasv_enable=YES

pasv_min_port=9981

pasv_max_port=9986

Step3. 重新啟動vsftpd

[[email protected] vsftpd]# /sbin/service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpd for vsftpd: OK ]

在這邊要注意,在10 這個例子中,ftp client(如cuteftp)的聯機方式必須

選擇passive mode,否則無法建立資料的聯機。也就是讀者可以連上ftp

server,但是執行ls,get 等等的指令時,便無法運作。

8.2.11. 将vsftpd 與TCP_wrapper 結合

若是讀者希望直接在/etc/hosts.allow 之中定義允許或是拒絕的來源位址,

可執行以下步驟。這是簡易的防火牆設定。

Step1. 确定/etc/vsftpd/vsftpd.conf 之中tcp_wrappers 的設定為YES,如下圖所

示:

tcp_wrappers=YES

這是RedHat9 的預設值,基本上不需修改。

Step2. 重新啟動vsftpd

[[email protected] vsftpd]# /sbin/service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpd for vsftpd: OK ]

Step3. 設定/etc/hosts.allow,譬如提供111.22.33.4 以及10.1.1.1 到10.1.1.254 連

線,則可做下圖之設定:

vsftpd : 111.22.33.4 10.1.1. : allow

ALL : ALL : DENY

8.2.12. 将vsftpd 并入XINETD

若是讀者希望将vsftpd 并入XINETD 之中,也就是7.x 版的預設設定,那

麼讀者可以執行以下步驟。

Step1. 修改/etc/vsftpd/vsftpd.conf

listen=YES

改為

listen=NO

Step2. 新增一個檔案: /etc/xinetd.d/vsftpd

内容如下:

service vsftpd

{

disable = no

socket_type = stream

wait = no

user = root

server = /usr/sbin/vsftpd

port = 21

log_on_success += PID HOST DURATION

log_on_failure += HOST

}

Step3. 重新啟動xinetd

[[email protected] vsftpd]# /sbin/service xinetd restart

Stopping xinetd: OK ]

Starting xinetd: OK ]

3.2.3 設定檔說明

在範例中,有些省略的設定可以在這邊找到,譬如聯機的總數、同一個位

址的聯機數、顯示檔案擁有者的名稱等等,希望讀者細讀後,可以做出最适合

自己的設定。

格式

vsftpd.conf 的内容非常單純,每一行即為一項設定。若是空白行或是開頭為#的一行,

将會被忽略。内容的格式隻有一種,如下所示

option=value

要注意的是,等号兩邊不能加空白,不然是不正确的設定。

===ascii 設定=====================

ascii_download_enable

管控是否可用ASCII 模式下載下傳。預設值為NO。

ascii_upload_enable

管控是否可用ASCII 模式上傳。預設值為NO。

===個别使用者設定===================

chroot_list_enable

如果啟動這項功能,則所有的本機使用者登入均可進到根目錄之外的資料夾,除了列

在/etc/vsftpd.chroot_list 之中的使用者之外。預設值為NO。

userlist_enable

用法:YES/NO

若是啟動此功能,則會讀取/etc/vsftpd.user_list 當中的使用者名稱。此項功能可以在詢

問密碼前就出現失敗訊息,而不需要檢驗密碼的程式。預設值為關閉。

userlist_deny

用法:YES/NO

這個選項隻有在userlist_enable 啟動時才會被檢驗。如果将這個選項設為YES,則在

/etc/vsftpd.user_list 中的使用者将無法登入﹔ 若設為NO , 則隻有在

/etc/vsftpd.user_list 中的使用者才能登入。而且此項功能可以在詢問密碼前就出現錯誤

訊息,而不需要檢驗密碼的程式。

user_config_dir

定義個别使用者設定檔案所在的目錄,例如定義user_config_dir=/etc/vsftpd/userconf,

且主機上有使用者test1,test2,那我們可以在user_config_dir 的目錄新增檔案名為

test1 以及test2。若是test1 登入,則會讀取user_config_dir 下的test1 這個檔案内的設

定。預設值為無。

===歡迎語設定=====================

dirmessage_enable

如果啟動這個選項,使用者第一次進入一個目錄時,會檢查該目錄下是否有.message

這個檔案,若是有,則會出現此檔案的内容,通常這個檔案會放置歡迎話語,或是對

該目錄的說明。預設值為開啟。

banner_file

當使用者登入時,會顯示此設定所在的檔案内容,通常為歡迎話語或是說明。預設值

為無。

ftpd_banner

這邊可定義歡迎話語的字元串,相較于banner_file 是檔案的形式,而ftpd_banner 是字

串的格式。預設為無。

===特殊安全設定====================

chroot_local_user

如果設定為YES,那麼所有的本機的使用者都可以切換到根目錄以外的資料夾。預設

值為NO。

hide_ids

如果啟動這項功能,所有檔案的擁有者與群組都為ftp,也就是使用者登入使用ls -al

之類的指令,所看到的檔案擁有者跟群組均為ftp。預設值為關閉。

ls_recurse_enable

若是啟動此功能,則允許登入者使用ls -R 這個指令。預設值為NO。

write_enable

用法:YES/NO

這個選項可以控制FTP 的指令是否允許更改file system,譬如STOR、DELE、

RNFR、RNTO、MKD、RMD、APPE 以及SITE。預設是關閉。

setproctitle_enable

用法:YES/NO

啟動這項功能,vsftpd 會将所有聯機的狀況已不同的process 呈現出來,換句話說,使

用ps -ef 這類的指令就可以看到聯機的狀态。預設值為關閉。

tcp_wrappers

用法:YES/NO

如果啟動,則會将vsftpd 與tcp wrapper 結合,也就是可以在/etc/hosts.allow 與

/etc/hosts.deny 中定義可聯機或是拒絕的來源位址。

pam_service_name

這邊定義PAM 所使用的名稱,預設為vsftpd。

secure_chroot_dir

這個選項必須指定一個空的資料夾且任何登入者都不能有寫入的權限,當vsftpd 不需

要file system 的權限時,就會将使用者限制在此資料夾中。預設值為/usr/share/empty

===紀錄檔案設定=====================

xferlog_enable

用法:YES/NO

如果啟動,上傳與下載下傳的資訊将被完整紀錄在底下xferlog_file 所定義的檔案中。預設

為開啟。

xferlog_file

這個選項可設定紀錄檔案所在的位置,預設值為/var/log/vsftpd.log。

xferlog_std_format

如果啟動,則紀錄檔案将會寫為xferlog 的标準格式,如同wu-ftpd 一般。預設值為關

閉。

===逾時設定======================

accept_timeout

接受建立聯機的逾時設定,機關為秒。預設值為60。

connect_timeout

響應PORT 方式的資料聯機的逾時設定,機關為秒。預設值為60。

data_connection_timeout

建立資料聯機的逾時設定。預設值為300 秒。

idle_session_timeout

發呆的逾時設定,若是超出這時間沒有資料的傳送或是指令的輸入,則會強迫斷線,

機關為秒。預設值為300。

===速率限制======================

anon_max_rate

匿名登入所能使用的最大傳輸速度,機關為每秒多少bytes,0 表示不限速度。預設值

為0。

local_max_rate

本機使用者所能使用的最大傳輸速度,機關為每秒多少bytes,0 表示不限速度。預設

值為0。

===新增檔案權限設定==================

anon_umask

匿名登入者新增檔案時的umask 數值。預設值為077。

file_open_mode

上傳檔案的權限,與chmod 所使用的數值相同。預設值為0666。

local_umask

本機登入者新增檔案時的umask 數值。預設值為077。

===port 設定======================

connect_from_port_20

用法:YES/NO

若設為YES,則強迫ftp-data 的資料傳送使用port 20。預設值為YES。

ftp_data_port

設定ftp 資料聯機所使用的port。預設值為20。

listen_port

FTP server 所使用的port。預設值為21。

pasv_max_port

建立資料聯機所可以使用port 範圍的上界,0 表示任意。預設值為0。

pasv_min_port

建立資料聯機所可以使用port 範圍的下界,0 表示任意。預設值為0。

===其它========================

anon_root

使用匿名登入時,所登入的目錄。預設值為無。

local_enable

用法:YES/NO

啟動此功能則允許本機使用者登入。預設值為YES。

local_root

本機使用者登入時,将被更換到定義的目錄下。預設值為無。

text_userdb_names

用法:YES/NO

當使用者登入後使用ls -al 之類的指令查詢該檔案的管理權時,預設會出現擁有者的

UID,而不是該檔案擁有者的名稱。若是希望出現擁有者的名稱,則将此功能開啟。

預設值為NO。

pasv_enable

若是設為NO,則不允許使用PASV 的模式建立資料的聯機。預設值為開啟。

===更換檔案所有權===================

chown_uploads

用法:YES/NO

若是啟動,所有匿名上傳資料的擁有者将被更換為chown_username 當中所設定的使

用者。這樣的選項對于安全及管理,是很有用的。預設值為NO。

chown_username

這裡可以定義當匿名登入者上傳檔案時,該檔案的擁有者将被置換的使用者名稱。預

設值為root。

===guest 設定=====================

guest_enable

用法:YES/NO

若是啟動這項功能,所有的非匿名登入者都視為guest。預設值為關閉。

guest_username

這裡将定義guest 的使用者名稱。預設值為ftp。

===anonymous 設定==================

anonymous_enable

用法:YES/NO

管控使否允許匿名登入,YES 為允許匿名登入,NO 為不允許。預設值為YES。

no_anon_password

若是啟動這項功能,則使用匿名登入時,不會詢問密碼。預設值為NO。

anon_mkdir_write_enable

用法:YES/NO

如果設為YES,匿名登入者會被允許新增目錄,當然,匿名使用者必須要有對上層目

錄的寫入權。預設值為NO。

anon_other_write_enable

用法:YES/NO

如果設為YES,匿名登入者會被允許更多于上傳與建立目錄之外的權限,譬如删除或

是更名。預設值為NO。

anon_upload_enable

用法:YES/NO

如果設為YES,匿名登入者會被允許上傳目錄的權限,當然,匿名使用者必須要有對

上層目錄的寫入權。預設值為NO。

anon_world_readable_only

用法:YES/NO

如果設為YES,匿名登入者會被允許下載下傳可閱讀的檔案。預設值為YES。

ftp_username

定義匿名登入的使用者名稱。預設值為ftp。

deny_email_enable

若是啟動這項功能,則必須提供一個檔案/etc/vsftpd.banner_emails,内容為email

address。若是使用匿名登入,則會要求輸入email address,若輸入的email address 在

此檔案内,則不允許聯機。預設值為NO。

===Standalone 選項==================

listen

用法:YES/NO

若是啟動,則vsftpd 将會以獨立運作的方式執行,若是vsftpd 獨立執行,如RedHat9

的預設值,則必須啟動﹔若是vsftpd 包含在xinetd 之中,則必須關閉此功能,如

RedHat8。在RedHat9 的預設值為YES。

listen_address

若是vsftpd 使用standalone 的模式,可使用這個參數定義使用哪個IP address 提供這

項服務,若是主機上隻有定義一個IP address,則此選項不需使用,若是有多個IP

address,可定義在哪個IP address 上提供ftp 服務。若是不設定,則所有的IP address

均會提供此服務。預設值為無。

max_clients

若是vsftpd 使用standalone 的模式,可使用這個參數定義最大的總聯機數。超過這個

數目将會拒絕聯機,0 表示不限。預設值為0。

max_per_ip

若是vsftpd 使用standalone 的模式,可使用這個參數定義每個ip address 所可以聯機

的數目。超過這個數目将會拒絕聯機,0 表示不限。預設值為0。

=============================

3.2.4 FTP 數字代碼的意義

110 重新啟動标記應答。

120 服務在多久時間内ready。

125 資料鍊路埠開啟,準備傳送。

150 檔案狀态正常,開啟資料連接配接端口。

200 指令執行成功。

202 指令執行失敗。

211 系統狀态或是系統求助響應。

212 目錄的狀态。

213 檔案的狀态。

214 求助的訊息。

215 名稱系統類型。

220 新的聯機服務ready。

221 服務的控制連接配接埠關閉,可以登出。

225 資料連結開啟,但無傳輸動作。

226 關閉資料連接配接端口,請求的檔案操作成功。

227 進入passive mode。

230 使用者登入。

250 請求的檔案操作完成。

257 顯示目前的路徑名稱。

331 使用者名稱正确,需要密碼。

332 登入時需要賬号資訊。

350 請求的操作需要進一部的指令。

421 無法提供服務,關閉控制連結。

425 無法開啟資料鍊路。

426 關閉聯機,終止傳輸。

450 請求的操作未執行。

451 指令終止:有本地的錯誤。

452 未執行指令:磁盤空間不足。

500 格式錯誤,無法識别指令。

501 參數文法錯誤。

502 指令執行失敗。

503 指令順序錯誤。

504 指令所接的參數不正确。

530 未登入。

532 儲存檔案需要賬戶登入。

550 未執行請求的操作。

551 請求的指令終止,類型未知。

552 請求的檔案終止,儲存位溢出。

553 未執行請求的的指令,名稱不正确。

繼續閱讀