1. 程式人生 > >詳解FTP服務之vsftpd(附三種用戶安裝腳本)

詳解FTP服務之vsftpd(附三種用戶安裝腳本)

公開 控制進程 down write 用戶驗證 步驟 動向 transfer mes

FTP(File Transfer Protocol,文件傳輸協議)可以在網絡中傳輸文檔、圖像、視頻以及應用程序等多種類型的文件。在企業中大多數情況下,則是用戶使用FTP從服務器上下載文件。
一個完整的FTP文件傳輸需要建立兩種類型的連接,一種為控制文件傳輸的命令,稱為控制連接;另一種實現真正的文件傳輸,稱為數據連接
控制連接:客戶端希望與FTP服務器建立上傳下載的數據傳輸時,它首先向服務器TCP協議的21端口發起一個建立連接的請求,FTP服務器接受來自客戶端的請求,完成連接的建立過程,這樣的連接就稱為FTP控制連接
數據連接:FTP控制連接建立後,即可開始傳輸文件,傳輸文件的連接稱為FTP數據連接。FTP數據連接就是FTP傳輸數據的過程,它有主動傳輸模式和被動傳輸模式兩種。
FTP數據傳輸原理
用戶在使用FTP傳輸數據時,整個FTP建立連接的過程經過以下幾個步驟
1、FTP服務器會自動對默認端口21進行監聽,當某個客戶端向這個端口請求建立連接時,便激活了FTP服務器上的控制進程,通過這個控制進程,FTP服務器對連接用戶名、密碼以及連接權限等進行身份驗證
2、當FTP服務器身份驗證完成後,FTP服務器和客戶端之間還會建立一條用來傳輸數據的專有連接
3、FTP服務器在傳輸數據過程中的控制將一直工作,並不斷發出指令控制整個FTP傳輸數據,數據傳輸完畢後控制進程給客戶端發送結束指令。
FTP傳輸模式
在建立數據傳輸的時候有兩種傳輸模式,即主動模式和被動模式
主動模式(PORT模式)
主動模式的數據傳輸專有連接是在建立控制連接(用戶身份驗證完成後),首先由FTP服務器使用20端口主動向客戶端進行連接,建立專用於傳輸數據的連接,這種方式在網絡管理上比較好控制。FTP服務器上的端口21用於用戶驗證,端口20用於數據傳輸,只要將這兩個端口開放就可以使用FTP功能了,此時客戶端只是出於接收狀態。
被動模式(PASV模式)
被動模式與主動模式不同,數據傳輸專有連接是在建立控制連接(用戶身份驗證後)由客戶端向FTP服務器發起連接的。客戶端使用哪個端口,連接到FTP服務器的哪個端口都是隨機產生的,服務器並不參與數據的主動傳輸,只是被動接受。
FTP用戶
匿名用戶:它是指在FTP服務器中沒有指定賬戶,但是他仍然可以匿名訪問某些公開的資源。
本地用戶:它是指在FTP服務器上擁有賬戶。在這類用戶訪問FTP服務器的時候,其默認的主目錄就是賬戶命名的家目錄。但是他還可以變更到其他目錄中去。
虛擬用戶:在FTP服務器中,使用這類用戶只能訪問其主目錄下的文件,而不能訪問目錄以外的文件,FTP服務器通過這種方式來保障服務器上其他文件的安全性。

vsftpd簡介
vsftpd(very secure FTP daemon,非常安全的FTP守護進程)是一款可以運行在Unix/Linux操作系統上,安全、易用、開放源代碼的FTP服務器軟件。

1、匿名用戶登錄
vsftps服務啟動後,默認就允許匿名用戶(anonymous或ftp)連接到vsftpd服務器。默認匿名用戶不能離開vsftpd服務器匿名用戶目錄/var/ftp,匿名用戶只能下載文件,而沒有權限上傳文件到vsftpd服務器上。
[root@linux-node1 ~]# yum install -y vsftpd
[root@linux-node1 ~]# cat /etc/vsftpd/vsftpd.conf|egrep -v ‘^#|^$‘ ##默認配置
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@vsftpd ~]# vim /var/ftp/pub/.message
hello world
技術分享圖片

允許匿名用戶上傳、下載文件和創建目錄
[root@linux-node1 ~]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@vsftpd ~]# cd /var/ftp/pub/
[root@vsftpd pub]# mkdir test
[root@vsftpd pub]# chmod o+w test/
[root@vsftpd vsftpd]# chmod 777 /var/ftp/pub/
[root@vsftpd vsftpd]# ll /var/ftp/
total 4
-rw-r--r-- 1 root root 0 Nov 19 16:25 123
drwxrwxrwx 3 root root 4096 Nov 19 23:05 pub
[root@vsftpd vsftpd]# /etc/init.d/vsftpd start
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
技術分享圖片
技術分享圖片
2、認證用戶配置:
[root@vsftpd ~]# useradd -d /var/ftp ftpuser
[root@vsftpd ~]# echo ‘123456‘|passwd --stdin ftpuser
[root@vsftpd vsftpd]# vim vsftpd.conf
anonymous_enable=NO
local_root=/var/ftp
chroot_local_user=YES
[root@vsftpd ~]# systemctl restart vsftpd
技術分享圖片
技術分享圖片
拒絕指定用戶連接vsftpd服務器
1、編輯/etc/vsftpd/ftpusers文件
在默認情況下,這個文件內已經有一些拒絕連接的用戶,在該文件的最後添加拒絕的用戶就可以了
[root@vsftpd ~]# vim /etc/vsftpd/ftpusers
ftpuser
[root@vsftpd ~]# systemctl restart vsftpd
技術分享圖片
[root@linux-node2 ~]# wget ftp://ftpuser:[email protected]:21/123
--2018-11-23 20:53:55-- ftp://ftpuser:password@10.0.0.100/123
=> “123.1”
Connecting to 10.0.0.100:21... connected.
Logging in as ftpuser ... Logged in!
==> SYST ... done. ==> PWD ... done.
==> TYPE I ... done. ==> CWD not needed.
==> SIZE 123 ... done.
==> PASV ... done. ==> RETR 123 ... done.
[<=> ] 0 --.-K/s in 0s
2018-11-23 20:53:55 (0.00 B/s) - “123.1” saved [0]
3、虛擬用戶設置:
匿名用戶可以很好地保證服務器的安全性,但是對匿名用戶的權限管理不夠靈活。如果想對訪問FTP的賬戶給予更多的權限,就可以使用本地賬戶來實現。但是本地賬戶默認情況下是可以登錄Linux系統的,這樣對Linux系統來說是一個安全隱患。使用虛擬用戶能在靈活地賦予FTP用戶權限的前提下,保證服務器乃至系統的安全。
虛擬用戶並不是一個合法的Linux系統賬戶,但是他可以來登錄系統上運行的vsftpd服務器,當用戶在連接上vsftpd服務器後,會被要求輸入用戶名和密碼。服務器在拿到這個用戶名和密碼後,會調用相應的PAM認證模塊對,和系統中的FTP認證文件進行比較。如果該用戶名和密碼與FTP認證文件中的某條記錄相符就通過認證,該賬戶就被映射成一個Linux下的本地賬戶,然後根據該本地賬戶對FTP資源進行訪問,負責就斷開該連接請求。
3.1、建立虛擬用戶帳號口令庫文件
[root@linux-node1 vsftpd]# vim vulist
tom
123
[root@linux-node1 vsftpd]# yum install db4-utils -y
[root@linux-node1 vsftpd]# db_load -T -t hash -f vulist vuser.db (轉化為伯克利格式)
[root@linux-node1 vsftpd]# chmod 600 vuser.*
3.2、建立虛擬用戶映射的系統用戶及根目錄
[root@linux-node1 vsftpd]# useradd -d /var/vftp -s /sbin/nologin vuser
[root@linux-node1 vsftpd]# chmod 755 /var/vftp
3.3、建立虛擬用戶的PAM認證文件
[root@linux-node1 vsftpd]# vim /etc/pam.d/vupam
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
3.4、修改vsftpd.conf,開啟虛擬用戶支持
[root@linux-node1 vsftpd]# vim vsftpd.conf
listen=YES
listen_address=10.0.0.103
listen_port=21
connect_from_port_20=YES
#pasv_min_port=2222
#pasv_max_port=2225
write_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
#pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
#max_clients=0
#max_per_ip=0

anonymous_enable=NO
anon_umask=022
#anon_root=/var/ftp
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
#anon_max_rate=0

local_enable=YES
local_umask=022
#local_root=/var/ftp
#chroot_local_user=YES
#local_max_rate=0

guest_enable=YES
virtual_use_local_privs=YES ##centos7中一定要有
guest_username=vuser
pam_service_name=vupam
3.5、為不同虛擬用戶建立獨立的配置文件
listen=YES
listen_address=10.0.0.103
listen_port=21
connect_from_port_20=YES
#pasv_min_port=2222
#pasv_max_port=2225
write_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
#pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
#max_clients=0
#max_per_ip=0

anonymous_enable=NO
anon_umask=022
#anon_root=/var/ftp
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
#anon_max_rate=0

local_enable=YES
local_umask=022
#local_root=/var/ftp
#chroot_local_user=YES
#local_max_rate=0

guest_enable=YES
virtual_use_local_privs=YES ##centos7中一定要有
guest_username=vuser
pam_service_name=vupam
user_config_dir=/etc/vsftpd/vuconf
[root@linux-node1 vsftpd]# mkdir /etc/vsftpd/vuconf
[root@linux-node1 vsftpd]# vim /etc/vsftpd/vuconf/tom
anon_upload_enable=YES
anon_mkdir_write_enable=YES
local_root=/var/ftp/pub/tom
[root@linux-node1 vsftpd]# mkdir /var/ftp/pub/tom
[root@linux-node1 vsftpd]# chmod 777 /var/ftp/pub/tom
[root@linux-node1 vsftpd]# vim /var/ftp/pub/tom/23
121234
[root@linux-node1 vsftpd]# /etc/init.d/vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
技術分享圖片
技術分享圖片
技術分享圖片
[root@linux-node2 ~]# wget ftp://tom:[email protected]:21/23
--2018-11-23 22:42:01-- ftp://tom:password@10.0.0.103/23
=> “23”
Connecting to 10.0.0.103:21... connected.
Logging in as tom ... Logged in!
==> SYST ... done. ==> PWD ... done.
==> TYPE I ... done. ==> CWD not needed.
==> SIZE 23 ... 5
==> PASV ... done. ==> RETR 23 ... done.
Length: 5 (unauthoritative)
100%[===================================>] 5 --.-K/s in 0s
2018-11-23 22:42:01 (662 KB/s) - “23” saved [5]

附一鍵安裝腳本:

#!/bin/bash

time=$(date +%F-%H:%M)
Kernel=$(uname -r|awk -F. ‘{print $1}‘)

menu(){
cat <<EOF
1.[anonymous install]

2.[local_user(ftpuser) install]

3.[vuser_user(tom and andy) install]

4.[vuser_user(tom‘s home) install]

5.[exit]
EOF
echo -e "\033[36m ###################\033[0m"
read -p " please input your number:" a
num=$a
}

install(){
yum install -y vsftpd
}

sever-restart(){
if [ $Kernel -eq 3 ]
then
systemctl restart vsftpd
else
/etc/init.d/vsftpd restart
fi
}

anonymous(){
mkdir /var/ftp/pub/test
chmod o+w /var/ftp/pub/test
cat >>/etc/vsftpd/vsftpd.conf <<EOF

anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
EOF

sever-restart
}

local_user(){
useradd -d /var/ftp ftpuser
echo ‘123456‘|passwd --stdin ftpuser

sed -i ‘s|anon_upload_enable=YES|#anon_upload_enable=YES|g‘ /etc/vsftpd/vsftpd.conf
sed -i ‘s|anon_mkdir_write_enable=YES|#anon_mkdir_write_enable=YES|g‘ /etc/vsftpd/vsftpd.conf
sed -i ‘s|anon_other_write_enable=YES|#anon_other_write_enable=YES|g‘ /etc/vsftpd/vsftpd.conf
sed -i ‘s|anonymous_enable=YES|anonymous_enable=NO|g‘ /etc/vsftpd/vsftpd.conf
cat >>/etc/vsftpd/vsftpd.conf <<EOF

local_enable=YES
local_umask=022
local_root=/var/ftp
chroot_local_user=YES
EOF

sever-restart
}

vuser(){
cat >/etc/vsftpd/vulist <<EOF
tom
123
andy
321
EOF

/usr/bin/db_load -T -t hash -f /etc/vsftpd/vulist /etc/vsftpd/vuser.db
if [ $? -ne 0 ]
then
/usr/bin/yum install pam pam- db4 db4-
/usr/bin/db_load -T -t hash -f /etc/vsftpd/vulist /etc/vsftpd/vuser.db
fi

chmod 600 /etc/vsftpd/vu*
cat /etc/passwd|grep vuser >>/dev/null 2>&1
if [ $? -ne 0 ]
then
useradd -d /var/vftp -s /sbin/nologin vuser
else
echo ‘vuser is exsit,please change user name !‘
exit 1
fi
chmod 700 /var/vftp
cat >/var/vftp/test <<EOF
hello world
ftpuser
EOF

cat >/etc/pam.d/vupam <<EOF
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
EOF

mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak_$time
cat >/etc/vsftpd/vsftpd.conf <<EOF
listen=YES
listen_port=21
connect_from_port_20=YES
#pasv_enable=YES
#pasv_min_port=2222
#pasv_max_port=2225
write_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
#pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
#max_clients=0
#max_per_ip=0

anonymous_enable=NO
#anon_umask=022
#anon_root=/var/ftp
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
#anon_max_rate=0

local_enable=YES
local_umask=022
#local_root=/var/ftp
#chroot_local_user=YES
#local_max_rate=0

guest_enable=YES
virtual_use_local_privs=YES
guest_username=vuser
pam_service_name=vupam
EOF

sever-restart
}

vuser-tom(){
cat >>/etc/vsftpd/vsftpd.conf <<EOF
user_config_dir=/etc/vsftpd/vuconf
EOF

mkdir /etc/vsftpd/vuconf
cat >/etc/vsftpd/vuconf/tom <<EOF
anon_upload_enable=YES
anon_mkdir_write_enable=YES
local_root=/var/ftp/pub/tom
EOF

mkdir -p /var/ftp/pub/tom
chmod 777 /var/ftp/pub/tom
cat >/var/ftp/pub/tom/test.txt <<EOF
hello world
tom
EOF

sever-restart
}
main(){
menu
netstat -antup|grep 22 >/dev/null 2>&1
if [ $? != 0 ]
then
install
fi

case "$num" in
1)echo ‘Start installing vsftpd of anonymous!‘
anonymous
;;
2)echo ‘Start installing vsftpd of local_user(ftpuser)!‘
local_user
;;
3)echo ‘Start installing vsftpd of vuser_user(tom and andy)!‘
vuser
;;
4)echo "Start installing vsftpd of vuser_user(tom‘s home)!"
vuser-tom
;;
5)echo "EXIT...."
exit 1
;;
)
echo "USAGE:please input your number:{1|2|3|4|5}"
exit 2
;;
esac
}
main $

註:不管能否解決你遇到的問題,歡迎相互交流,共同提高, QQ:931389630!

詳解FTP服務之vsftpd(附三種用戶安裝腳本)