CentOS搭建VSFTP配置(具有針對性)

來源:互聯網
上載者:User

軟體安裝和卸載
獲得軟體
vsftpd目前最新版本為2.0.5,:ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.5.tar.gz
軟體安裝
解壓軟體,編輯builddefs.h檔案
# tar zxvf vsftpd-2.0.5.tar.gz
# cd vsftpd-2.0.5
# vi builddefs.h
找到下面三行,其含義如右所示
#undef VSF_BUILD_TCPWRAPPERS //是否允許使用TCP Wrappers
#define VSF_BUILD_PAM //是否允許使用PAM認證
#undef VSF_BUILD_SSL //是否允許使用SSL
如果要允許以上所示某項功能,使把undef改為define即可,注意每行前的“#“號不是注釋,不能去掉(熟悉C語言的同志應該知道這個“#”是什麼意思)。其中TCP Wrappers是一個驗證IP地址合法性的程式,PAM認證讓vsftpd支援本機使用者登陸伺服器,使用SSL可以建立一個加密的資料轉送。這裡我們把三項都啟用。
編譯安裝。如果系統中安裝有舊版vsftpd,請先卸載它。預設安裝執行檔案在/usr/local/sbin中,man page放在/usr/local/man/man5與/usr/local/man/man8中。
# make
# make install
將預設設定檔考貝到/etc/vsftpd/
# mkdir /etc/vsftpd/
# cp vsftpd.conf /etc/vsftpd/
為了認vsftpd支援本機使用者登入,我們將身份認證模組檔案考入系統中。
# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd
建立ftp使用者及主目錄:
# mkdir /var/ftp
# useradd -d /var/ftp ftp

如果本來就已經存在ftp使用者,則執行下面兩條命令:
# chown root:root /var/ftp
# chmod 755 /var/ftp
建立vsftpd需要的特殊目錄:
# mkdir /usr/share/empty/
軟體卸載
如果需要卸載,使用如下命令:
# rm /usr/local/sbin/vsftpd
# rm /usr/local/man/man5/vsftpd.conf.5
# rm /usr/local/man/man8/vsftpd.8
# rm /etc/xinetd.d/vsftpd
# rm -rf /etc/vsftpd
三、配置vsftpd服務
服務的啟動與停止
啟動服務之前,我們先編輯設定檔/etc/vsftpd/vsftpd.conf. 開啟設定檔後可以看到許多以“#”開始的行,這些行都是注釋行,大多是協助資訊,可以仔細閱讀。vsftpd.conf檔案的所有項目都是以“參數=值”來設定的,對格式要求比較嚴格,必須嚴格區分大小寫,等號兩邊不能有空格,每行的最後也不能有空格。每個參數都有一個預設值,沒有在設定檔中明確指定的參數就會使用預設值。我們這裡不理會設定檔本來的資訊,把所有內容都刪掉或注釋掉,最後加上下面四行,每行右邊的//及後的文字是含義說明,不要輸入到檔案中:
listen=yes //vsftpd工作在standalone 模式下
anonymous_enable=yes //允許匿名使用者登陸伺服器
local_enable=yes //允許本機使用者登入到伺服器
pam_service_name=vsftpd //使用PAM認證
vsftpd有兩種工作模式,standalone模式和xinetd守護進程模式,第1行就是讓其工作在standalone模式下。此種模式中,每次修改設定檔必須重新啟動vsftpd服務才會生效,關於兩種模式在後面有詳細介紹。我們安裝時還把 Redhat 目錄下的 vsftpd.pam 檔案複製成了/etc/pam.d/vsftpd 檔案。這個檔案就是本機使用者登陸的 pam 驗證設定檔。關於這個檔案我們會在後面具體介紹。這裡我們要知道,必須得有這個設定檔,而且主設定檔裡要加上pam_service_name=vsftpd語句,我們才能讓本機使用者登陸。用以下命令啟動服務:
# /usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf &
為保證服務確實啟動,我們用如下命令檢測:
# netstat -an |grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
我們看到伺服器已經開啟了tcp21連接埠,表明ftp確實已經啟動。再登入伺服器:
# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): ftp
331 Please specify the password.
Password:
230 Login successful.
這時我們已經用匿名使用者(使用者名稱ftp或anonymous,密碼任意)登入到伺服器了,還可以用本機使用者登入。我們做測試時建議使用如上所示的ftp命令(windows、Linux及Unix都帶這個命令,用法都是一樣的)來登入伺服器,這樣可以看到更詳細的資訊,對於我們調試伺服器是非常有協助的。最簡單的ftp伺服器就已經達建起來了。使用如下命令關閉ftp服務:
# killall vsftpd
服務啟動指令碼的製作
在standalone 模式中,經常用上面的命令啟動服務比較麻煩,我們做一個指令碼來啟動和停止服務。
建立一個新檔案/etc/rc.d/init.d/vsftpd,把以下內容複寫到檔案中:
#!/bin/bash
#
# vsftpd This shell script takes care of starting and stopping
# standalone vsftpd.
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program \
# that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x /usr/local/sbin/vsftpd ] || exit 0
RETVAL=0
prog="vsftpd"
start() {
# Start daemons.
if [ -d /etc/vsftpd ] ; then
for i in `ls /etc/vsftpd/*.conf`; do
site=`basename $i .conf`
echo -n $"Starting $prog for $site: "
/usr/local/sbin/vsftpd $i &
RETVAL=$?
[ $RETVAL -eq 0 ] && {
touch /var/lock/subsys/$prog
success $"$prog $site"
}
echo
done
else
RETVAL=1
fi
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
RETVAL=$?
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac
exit $RETVAL
儲存檔案,再給該檔案加上執行許可權:
# chmod 755 /etc/rc.d/init.d/vsftpd
這樣我們就可以通過下面的方法來管理服務了:
# service vsftpd {start|stop|restart|condrestart|status}
例如重新啟動服務:
# service vsftpd restart
Shutting down vsftpd: [OK ]
Starting vsftpd for vsftpd: [OK ]
四、設定檔詳解
vsftpd設定檔只有一個,就是/etc/vsftpd/vsftpd.conf,上一小節我們就已經加入了兩行參數了。在修改了設定檔之後,需要重新啟動服務才會生效。下面我們就來詳細解釋其中的參數。
1. 匿名及本機使用者共同參數
write_enable=yes/no //是否允許全域可寫
download_enable=yes/no //是否允許所有使用者可以下載
dirlist_enable=yes/no //是否允許所有使用者可以瀏覽(列出檔案清單)
我們將write_enable=no、download_enable=yes兩行加入設定檔,再測試:
# ftp 127.0.0.1
……
ftp> ls
227 Entering Passive Mode (127,0,0,1,230,192)
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 4 May 13 11:43 ioo_file
226 Directory send OK.
ftp> get ioo_file
local: ioo_file remote: ioo_file
227 Entering Passive Mode (127,0,0,1,160,26)
150 Opening BINARY mode data connection for ioo_file (4 bytes).
226 File send OK.
4 bytes received in 0.062 seconds (0.063 Kbytes/s)
ftp> put scsrun.log
local: scsrun.log remote: scsrun.log
227 Entering Passive Mode (127,0,0,1,176,84)
550 Permission denied.
如上所示,我們看到了ftp上的檔案,可以下載檔案,但不可以上傳檔案。如果把dirlist_enable=no 也加上,便無法看到ftp上的檔案(無法列出檔案清單),但是如果你知道具體的檔案名稱及路徑,仍然可以下載檔案的。實驗結果就不貼上來了。
再看下一組:
ftpd_banner=歡迎語字串
banner_file=檔案
dirmessage_enable=yes/no
message_file=檔案
參數ftpd_banner設定的歡迎語字串將在登入時看到,如果想做出多行歡迎語,就要把內容單獨存為banner_file參數指定的檔案,應用中這兩個參數二選一即可。dirmessage_enable和message_file參數是進入某個目錄後顯示的歡迎資訊,用法與前兩個參數一樣。
2. 本機使用者管理
2.1 本機使用者常規配置參數
local_root=/path //本機使用者登陸伺服器後直接進入的目錄
local_umask=八位元 //本機使用者上傳檔案許可權的 umask值
local_max_rate=數字 //本機使用者傳輸速率單位為 bps
chmod_enable=yes/no // 是否允許本機使用者改變ftp 伺服器上檔案的許可權
我們知道使用本機使用者登入ftp後進入的是使用者的主目錄,locla_root這個參數允許我們登入伺服器後直接進入其它的目錄。此功能結合Apache的userdir模組來實現網站內容更新上傳是非常方便的。Linux系統中的任何檔案都是有許可權值的,上傳的檔案也不例外,這個預設的許可權值就由local_umask參數指定。其計算方法為:
預設建立檔案的許可權+local_umask =0666
預設建立目錄的許可權+local_umask =0777
由此我們可以看出,上傳的檔案無論如何都不可能有執行許可權的。這也是vsftp安全性的體現啊!
local_max_rate參數限定了資料轉送速率,包括上傳和下載。chmod_enable參數限制使用者是否可以改變檔案許可權(使用chmod, site命令)。
我們可能想讓為每個使用者進行單獨的配置,或者想配置個別使用者的許可權。這樣就得為每個本機使用者配置一個檔案。這些設定檔必須是在同一個目錄下,所以我們可以設定本機使用者單獨設定檔所在的目錄:
user_config_dir=/path //使用者單獨設定檔所在目錄
我們在設定檔中加入以下幾行:
local_umask=077
local_max_rate=20000
user_config_dir=/etc/vsftpd/vsftpd_user_dir
給予使用者上傳許可權:
write_enable=yes
建立一個普通使用者ioo,再建立一個目錄/etc/vsftpd/vsftpd_user_dir,其下建一個檔案ioo,裡面加入下面幾行:
local_root=/var/www/html
local_umask=022
local_max_rate=50000
把/var/www/html的所有者改為ioo:
chown ioo:ioo /var/www/html
測試之後我們發現,使用ioo使用者登入後就直接進入var/www/html了,上傳的檔案(夾)許可權為644(755),傳輸速率為50k,自訂的設定覆蓋了主設定檔中的設定。
2.2 本機使用者登入限制參數
在我們的伺服器上本來就有很多的本機使用者,這些本機使用者應該都是可以登陸 ftp 伺服器的。但是 ftp 服務是以明文傳輸的,如果允許管理員登陸的話,這種機制顯然不好。又或者我們想讓一些本機使用者可以登陸,或者一些不能登陸我們的 ftp 伺服器,這樣我們可以怎麼設定呢?
Vsftpd 提供了 userlist 功能。它使用一個檔案來儲存一些使用者名稱,然後根據配置來決定是檔案中的使用者可以登入還是檔案中沒有列出的使用者可以登陸 ftp 伺服器,這樣就對本機使用者的登陸起到了限制作用。其配置參數有如下幾個:
userlist_enable=yes/no //是否啟用 userlist 功能模組
userlist_deny=yes/no //是否拒絕 userlist 檔案中使用者登陸 ftp 服務
userlist_file=/path/to/file //指定的 userlist 檔案名稱

當第1個參數值為yes時,第2、3行才起作用。我們將設定檔加上如下3行:
userlist_enable=yes
userlist_deny=yes
userlist_file=/etc/vsftpd/vsftpd.userlist
然後再建立一個檔案/etc/vsftpd/vsftpd.userlist,在裡面加入使用者名稱,每個使用者名稱一行,比如我這裡加入使用者root,再登入服務時出現以下資訊:
# ftp 127.0.0.1
Connected to 127.0.0.1.
……
Name (127.0.0.1:root): root
530 Permission denied.
Login failed.
root使用者已經不能登入了,在輸入密碼之前就被拒絕,但其它使用者還可以登入的。如果把userlist_deny的值改為no,則只有檔案中的使用者才可以登入伺服器。
2.3 本機使用者的根目錄參數
大家再來看下面這一段:
# ftp 127.0.0.1
……
Name (127.0.0.1:root): ioo
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/ioo"
ftp> cd /
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (127,0,0,1,163,193)
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 May 12 21:22 bin
drwxr-xr-x 3 0 0 4096 Apr 30 19:57 boot
drwxr-xr-x 12 0 0 3840 May 13 10:29 dev
……
是不是感到吃驚了!我們用本機使用者登入ftp伺服器,卻可以看到整個伺服器的目錄和檔案,甚至還可以把/etc/passwd檔案下載下來,這是非常不安全的,我們應該禁止這個功能,限制使用者只能在自己的目錄裡瀏覽,這就要用到chroot功能。看下面三個參數:
chroot_list_enable=yes/no //是否啟用 chroot_list 檔案
chroot_local_user=yes/no //是否限制本機使用者的根目錄為自己的主目錄
chroot_list_file=/path/to/file //設定 chrootlist 檔案名稱
我們建立一個使用者woo,再建立一個檔案/etc/vsftpd/vsftpd.chroot_list,其中加入woo。然後在設定檔中添加以下幾行:
chroot_list_enable=yes
chroot_local_user=yes
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
登入伺服器測試:
# ftp 127.0.0.1
……
Name (127.0.0.1:root): woo
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/woo"
Name (127.0.0.1:root): ioo
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
我們看到,在檔案中的使用者woo根目錄仍然是系統根目錄,但檔案外的使用者根目錄已經變成了“/”,就是說列在檔案外的使用者已經不能在自己主目錄範圍外瀏覽了。
更改chroot_list_enable和chroot_local_user的值,得到以下幾種組合:

參數

取值

取值

取值

取值

chroot_list_enable

yes

yes

no

no

chroot_local_user

yes

no

yes

no

意義

檔案中列出的使用者根目錄為系統根目錄,其它使用者根目錄為自己主目錄。

檔案中列出的使用者根目錄為自己主目錄,其它使用者根目錄為系統根目錄。

全部使用者根目錄都是自己主目錄。

全部使用者根目錄都是系統根目錄。

3. 匿名使用者參數
我們可以認為,本機使用者進入自己主目錄本身就應有比較大的許可權,所以我們看到本機使用者受限的語句不多。但是匿名使用者通常涉及到一個公開、公用的互連網環境,所以限制匿名使用者的許可權語句就比較多,限制也比較細緻。看看這一組參數:

anon_upload_enable=yes/no //是否允許匿名使用者上傳
anon_mkdir_write_enable=yes/no //是否允許匿名使用者建立檔案夾
anon_other_write_enable=yes/no //是否允許匿名使用者可以使用除了建立檔案夾和上傳檔案以外其他的ftp寫操作命令。例如:delete、rename 等等
anon_world_readable_only=yes/no //匿名使用者是否允許下載所有使用者都可以訪問的檔案
我們先把設定檔清理一下,現在設定檔只有下面幾行:
listen=yes
anonymous_enable=yes
write_enable=yes
download_enable=yes
dirlist_enable=yes
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
我們希望匿名使用者有上傳檔案的許可權,但這裡還只是在ftp服務裡給了寫入權限,還必須在檔案許可權考慮實現。於是我們給/var/ftp加上寫入權限:
chmod a+w /var/ftp
然後登入伺服器:
# ftp 127.0.0.1
……
Name (127.0.0.1:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable anonymous root
Login failed.
421 Service not available, remote server has closed connection
結果我們連伺服器都登陸不了了!這是因為vsftpd出於在安全方面的考慮,不允許匿名使用者對根目錄有寫入權限。為此,我們只有去掉/var/ftp的寫入權限,再在其中建立一個目錄,給予其寫入權限,讓匿名使用者上傳檔案到這個目錄中。
# chmod 755 /var/ftp
# mkdir /var/ftp/upload
# chmod 777 /var/ftp/upload
現在我們可以匿名在upload裡上傳檔案、建立檔案夾、還可以刪除改名等,但是卻無法將上傳的檔案下載回來。如果你上傳的檔案是在一個建立的檔案夾裡,那麼上傳的檔案不但下載不下來,而且連看都看不到:
ftp> mkdir asm
257 "/upload/asm" created
ftp> cd asm
250 Directory successfully changed.
ftp> put file1
local: file1 remote: file1
227 Entering Passive Mode (127,0,0,1,135,56)
150 Ok to send data.
226 File receive OK.
5 bytes sent in 0.063 seconds (0.077 Kbytes/s)
ftp> get file1
local: file1 remote: file1
227 Entering Passive Mode (127,0,0,1,20,101)
550 Failed to open file.
ftp> ls
227 Entering Passive Mode (127,0,0,1,133,186)
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
ftp>
這就要研究anon_world_readable_only這個參數了,它的預設值是yes。如果其值為yes,則匿名使用者只可以下載所有使用者都可訪問的檔案。比如:
# ll
total 40
-rw----r-- 1 ftp ftp 34935 05-13 17:38 install.log
-rw------- 1 ftp ftp 209 05-13 18:16 scsrun.log
這裡install.log檔案許可權其它位上有r許可權,那麼這個檔案就可以被下載;scsrun.log檔案其它位上沒有任何許可權,所以這個檔案就不能被匿名使用者下載。
因此解決方案有兩個,一是把參數anon_world_readable_only的值改為no;二是把上傳檔案預設許可權的其它位上加上執行許可權,這就用到下面這個參數:
anon_umask=八位元
這個參數值的計算方法與本機使用者local_umask參數一樣,不在贅述。
在以上的實驗中,大家可能已經注意到匿名使用者上傳的檔案所有者為ftp,這們也可能用下面兩個參數來改變檔案所有者:
chown_uploads=yes/no //是否開啟修改預設匿名上傳檔案所有者的功能
chown_username=本機使用者名 //匿名上傳檔案的所有者名
匿名使用者使用任何密碼都是可以登陸伺服器的,那麼我們可以免了匿名使用者登陸必須輸入密碼的步驟,只要我們在設定檔中加入:
no_anon_password=yes
匿名使用者的參數還有很多,我們就不一一介紹了
到此,我們已經可以達建出的ftp伺服器已經可以滿足很多場合的需要了,如果有要求更加苛刻的場合,那就還需要進一步設定。

4. IP監聽與串連控制
vsftpd工作在獨立模式(standalone)下的啟動參數有兩項:
listen=yes/no
listen_ipv6=yes/no
其中第一條已經前面已經提過了,第二條應用在ipv6網路環境中,這兩相參數只能有一條值為yes。
在實際的網路環境中,伺服器通常都有多個IP地址,而每個IP地址串連不同的網段,我們可能並不希望在所有網段的上的電腦都能訪問伺服器。而預設情況下,vsftpd將在所有的IP地址上監聽,因此,我們需要下面兩行:
listen_address=監聽 ip
listen_address6=監聽 ip
這兩行分別是針對IPv4和IPv6環境的。
下面的兩項是vsftpd並發串連控制:
max_clients=數字
max_per_ip=數字
參數max_clients設定了伺服器可以接受的最大並發串連數量,max_per_ip設定了每個用戶端IP可以發起的最大串連數。針對伺服器效能適當設定這兩個參數,可以在伺服器可接受的串連數量和連線速度之間找到平衡點。這兩項預設值均為0,表示無限制。
accept_timeout=數字
connect_timeout=數字
data_connection_timeout=數字
idle_session_timeout=數字
上面的數字都是以秒為單位的。其中 access_timeout 代表以 pasv資料連線模式的時候,資料連線的逾時;connect_timeout 表示以 port模式串連資料連線時的逾時時間;關於ftp服務串連模式下面會有詳細介紹。data_connection_timeout 表示資料連線後資料連線等待的空閑時間逾時,超過時間後,資料連線將中斷連線;idle_session_timeout 設定發獃時間,也就是用戶端隔多長時間不與伺服器有互動 ftp 命令,將自動斷開 ftp 服務串連。
5. 關於串連連接埠設定
我們知道 ftp 服務有一點是不同於其他的服務的是,ftp 服務使用的是 tcp 雙串連通道,也就是ftp-server 和 ftp-data 串連。我們可以這麼理解:ftp-server 串連接受用戶端串連請求、並發控制、身份和許可權認證以及傳輸用戶端下達的命令。ftp-data串連負責傳輸資料,也就是說當有資料轉送的時候才會有這條串連。我們先來看一下 ftp-server 的設定:
listen_port=連接埠號碼
那麼這條設定可以設定 ftp-server 連接埠號碼,預設為21,如果我們指定了其它連接埠號碼,那麼用戶端串連伺服器上時就得使用指定連接埠號碼了。我們將這一行加入主設定檔中:
listen_port=2121
# ftp 127.0.0.1
ftp: connect: Connection refused
ftp> open 127.0.0.1 2121
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
……
已經看到效果了,接下來我們討論ftp-data串連的問題。
FTP資料轉送有兩種模式:FTP Port模式和FTP Passive模式,兩種工作方式截然不同。
FTP Port模式
在FTP Port模式下,用戶端與伺服器建立ftp-server串連之後,如果某條指令涉及到資料傳送,就需要建立ftp-data串連。其實串連步驟如下:
(1) 用戶端啟用另一個高於1024的空閑連接埠xx做串連準備,並且使用port命令利用ftp-server通道向伺服器發送一個資料包,資料包裡包含用戶端的IP地址和xx連接埠,告訴伺服器用戶端xx連接埠已做好串連準備。Port命令還支援第三方(third-party)模式,第三方模式是用戶端告訴伺服器端開啟與另台主機的串連。
(2) 伺服器以ftp-data連接埠(預設為20)主動向用戶端xx連接埠進行串連。
(3) 用戶端響應伺服器串連,並繼續完成三向交握後,ftp-data串連建立,開始傳送資料。當資料轉送完畢後,伺服器ftp-data連接埠就處於等待關閉狀態。
我們看到,Port模式下ftp-data串連請求是由伺服器發起的。現在來看一下vsftpd中關於Port模式的語句設定:
port_enable=yes/no //是否啟用 port 模式
connect_from_port_20=yes/no //port 模式下是否預設使用固定的 20 連接埠
ftp_data_port=port_number //指定 port 模式的連接埠號碼
port_promiscuous=yes/no //是否使用安全的 port 模式
將port_enable 設定為 yes,就採用 port 模式。在 port 模式下連接埠如果採用固定的20 連接埠,就把connect_from_port_20選項就設為yes,這是很多伺服器預設的設定規則。我們也可以指定其他的連接埠,那麼這也就由ftp_data_port 來指定固定連接埠。port_promiscuous 預設值為no,表示ftp-data串連之前檢驗一下資料連線的目標ip 的是否是真正用戶端的IP,反之則不檢查。除非你確保伺服器是與真正的用戶端進行串連,否則不要將此參數值改為yes。
我們將下面兩行加入設定檔中:
port_enable=yes
connect_from_port_20=no
登入伺服器運行3次ls(顯示檔案清單)命令,再在伺服器端運行netstat命令查看效果:
# ftp 127.0.0.1
Connected to 127.0.0.1.
……
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode off.
ftp> ls
……
226 Directory send OK.
ftp> ls
……
ftp> ls
……
ftp> bye
# netstat -an|more
……
tcp 0 0 127.0.0.1:1069 127.0.0.1:1068 TIME_WAIT
tcp 0 0 127.0.0.1:21 127.0.0.1:1065 TIME_WAIT
tcp 0 0 127.0.0.1:1071 127.0.0.1:1070 TIME_WAIT
tcp 0 0 127.0.0.1:1067 127.0.0.1:1066 TIME_WAIT
……
我們看到伺服器開了3個大於1024的連接埠去串連用戶端,這3個串連就是3次ls命令產生的。如果我們把connect_from_port_20參數的值改為yes,再做上述實驗,就會探索服務器3次串連都固定開啟20連接埠。如果我們再加上ftp_data_port=2020語句,再做上述實驗,伺服器就會固定開啟2020連接埠。
[attach]167[/attach]
大家來看這張圖,區域網路客戶機使用私人IP地址,並採用出口路由器做的 NAT(網路位址轉譯)連到 internet。ftp 伺服器採用的是port模式。當用戶端使用port命令向伺服器發出包含自身IP地址和連接埠的包,此包通過路由器時路由器必須檢查其內容,把包中的IP地址和連接埠翻譯成分配給客戶的地址和連接埠,而這個操作要求路由器必須工作在應用程式層!我們不可能要求每個客戶的路由器都有此功能,但如果路由器沒有正常完成這步工作,ftp資料轉送就失敗了。
另外,由於第三方third-party模式的支援,駭客還可能在PORT命令中設定IP地址和連接埠號碼參數來指定一台其它主機的地址和連接埠號碼來發動攻擊(稱為FTP反彈攻擊)。雖然有的防火牆裝置已經修正了該問題,但對於大多數防火牆和路由器來說這個問題還是一個非常嚴重的。
FTP Passive模式
下面描述了Passive模式的ftp-data串連建立的步驟:
(1) 當使用者請求資料轉送的時候,用戶端軟體發送PASV命令給伺服器端表明用戶端希望進入Passive模式;
(2) 伺服器端進行應答,應答資料包內有伺服器的IP地址和一個臨時連接埠,這個臨時的連接埠是用戶端在開啟資料轉送串連時應該使用的連接埠;
(3) 用戶端伺服器發出串連請求,源連接埠為用戶端自己選擇的一個臨時連接埠,目的連接埠為伺服器在PASV應答命令中指定的臨時連接埠號碼;
(4) 伺服器響應用戶端請求,並繼續完成TCP三向交握之後,ftp-data串連建立,開始傳送資料。
接下來我們來看看vsftpd中關於Passive模式中設定語句:
pasv_enable=yes/no
pasv_min_port=yes/no
pasv_max_port=yes/no
pasv_promiscuous=yes/no
pasv_address=ip_address
第一行設定是否啟用 pasv 模式。pasv_min_port 和pasv_max_port 是設定在 pasv 模式下開啟的連接埠範圍。一般情況下,如果設定成 pasv 模式,我們最好指定連接埠範圍,便於防火牆設定開啟這個範圍的連接埠以接受用戶端的串連請求。pasv_promiscuous與port_promiscuous參數一樣是設定在pasv下是否設定安全的傳輸,我們也要將其值設為no(預設值即為no)。pasv_address 後接一個有效ip地址,來指定pasv開啟連接埠的ip地址。但是預設情況下這行是取消的,因為服務會在
tcp 串連的通訊端中知道串連的ip地址。我們把主設定檔改成這樣然後看一下設定效果:
listen=yes
anonymous_enable=yes
pasv_enable=yes
pasv_min_port=3000
pasv_max_port=3003
登入伺服器運行3次ls命令,再在伺服器端運行netstat命令查看效果:
# netstat -an
……
tcp 0 0 192.168.0.105:3000 192.168.0.122:11066 TIME_WAIT
tcp 0 0 192.168.0.105:3002 192.168.0.122:11065 TIME_WAIT
tcp 0 0 192.168.0.105:3001 192.168.0.122:11063 TIME_WAIT
我們看到,每次ls命令產生了一個串連,伺服器開的連接埠是3000和3003之間。在 vsftpd2.0.3 以後的版本中, pasv 連接埠允許我們重複開啟,在之前的版本裡是不允許的,也就是說同一個連接埠可以同時與用戶端建立多條串連,大家可以自己實驗一下。
大多數人認為在防火牆網路環境中Passive模式比Port模式的問題少,但我們注意到在Passive模式下,用戶端向伺服器端一個臨時的目的連接埠發起串連,一些防火牆或者裝置的存取控制清單(ACL)可能會阻止這種串連;同樣伺服器的回應也是從一個臨時的連接埠到另一個臨時的連接埠,防火牆或者訪問列表也會阻止這種串連。在許多路由器和防火牆上(包括iptables)允許你使用訪問列表關鍵字"established"來避免第二個問題,"established"關鍵字告訴路由器允許帶ACK標誌的包通過。而對於第一個問題,我們雖然使用pasv_min_port和pasv_max_port語句來限制伺服器開設臨時連接埠的範圍,從而在防火牆上開啟這些連接埠,但這樣做還是存在一定的安全性漏洞。好在多數狀態檢測防火牆例如Linux
netfileters支援ftp協議的深層狀態檢測,進行準確的PASV動態連接埠過濾。
5.其他進階操作參見http://galei402.blog.163.com

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.