一、ftp工作原理簡介
ftp是工作於應用層的協議,21/tcp端口,ftp是C/S的模型,數據分爲兩種連接,分別是命令連接數據連接,命令連接是文件管理類命令,始終在線的連接;數據連接是數據傳輸,是按需創建及關閉的連接。數據在傳輸格式根據文件類型進行選擇傳輸格式,有文件傳輸、二進制傳輸。
ftp有兩連接模式主動和被動模式,在主動模式中由服務器創建連接,客戶端響應連接的方式,服務器選擇21/tcp端口,客戶端在響應連接選擇一個隨機端口的與服務器進行通信,在傳輸文件時服務器將使用20/tcp端口與客戶端的隨機端口加1進行數據傳輸;在被動模式中客戶端選擇一個隨機端口請求服務器的21/tcp端口,服務器用21號端口響應客戶端的請求,當文件傳輸時客戶端使用在隨機端口上加1的端口請求服務器的文件數據,服務器選擇一個隨機端口響應客戶端的文件傳輸請求。
二、ftp軟件種類
ftp的服務器和客戶端的軟件種類有很多軟件可以實現的
服務器端軟件:wu-ftpd、proftpd、pureftp、vsftpd、ServU
客戶端軟件:ftp、lftp、lftpget、wget、curl、filezilla、gftp
三、ftp響應碼
ftp和Web服務軟件一樣有請求響應碼,可以根據響應碼來確認故障;
1xx:信息
2xx:成功類的狀態碼
3xx:提示需進一步提供補充信息的狀態碼
4xx:客戶端錯誤
5xx:服務端錯誤
[root@stu09 ~]# ftp172.16.9.28 Connected to172.16.9.28 (172.16.9.28). 220 (vsFTPd 2.2.2) #:狀態碼 Name (172.16.9.28:root): ftp #匿名用戶被映射成爲ftp 331 Please specifythe password. Password: 230 Loginsuccessful. Remote system typeis UNIX. Using binary mode totransfer files. ftp> ls 227 Entering Passive Mode (172,16,9,28,254,240). #被動模式,172.16.9.28:(254+150+1)*240) IP:端口 150 Here comes thedirectory listing. drwxr-xr-x 2 0 0 4096 Aug 04 2014 pub 226 Directory sendOK.
四、ftp實現軟件vsftpd
ftp可以使用登錄的用戶認證類型有虛擬用戶、系統用戶、匿名用戶。
在CentOS 6.6中安裝vsftpd還是很方便的,直接yum install vsftpd就可以了。安裝完後生成的文件如下:
用戶認證配置文件:/etc/pam.d/vsftpd
服務腳本:/etc/rc.d/init.d/vsftpd
日誌滾動程序:/etc/logrotate.d/vsftpd
配置文件:/etc/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
匿名用戶(映射爲ftp用戶)共享資源位置:/var/ftp
系統用戶通過ftp訪問的資源的位置:用戶自己的家目錄
虛擬用戶通過ftp訪問產資源的位置:給虛擬用戶指定的映射在爲成系統用戶的家目錄
五、vsftpd的配置說明
(1)匿名用戶的配置
anonymous_enable=YES #啓用匿名用戶
anon_upload_enable=YES #啓用匿名用戶上傳功能
anon_mkdir_write_enable=YES #啓用匿名用戶創建目錄功能
anon_other_write_enable=YES #啓用匿名用戶刪除文件功能
注意:上傳的功能取決於系統的權限和是否有上傳的權限
(2)系統用戶的配置
local_enable=YES #開啓系統用戶
write_enable=YES #開啓寫的權限
local_umask=022 #系統用戶上傳文件完文件的權限
禁錮所有的ftp本地用戶其家目錄中
chroot_local_user=YES
禁錮指定的ftp本地用戶其家目錄中
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
(3)虛擬用戶
所有的虛擬用戶會被統一映射爲一個指定的系統賬號,訪問的共享位置即爲系統賬號的家目錄;各虛擬用戶可被賦予不同的訪問權限,通過匿名用戶的權限控制參數進行指定;虛擬用戶賬號可存儲在文件和關係型數據庫表中。
(4)其它配置信息說明
開啓目錄消息,就是切換此目錄時,會顯示此目錄中以.message文件的內容,此.messages是隱藏文件
dirmessage_enable=YES
日誌
xferlog_enable=YES #開啓上傳,下載日誌
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
改變上傳文件的屬主
chown_uploads=YES
chown_username=whoever
會話:
idle_session_timeout=600 #空閒會話超時時長
data_connection_timeout=120 #數據連接超時時長
vsftp使用pma完成使用認證,其用到的pam配置文件
pam_service_name=vsftpd
是否啓用控制用戶登錄的列表文件
userlist_enable=YES
userlist_deny=YES|NO
默認的文件爲/etc/vsftpd/user_list
連接限制:
max_clients:最大併發連接數;
max_per_ip:每個IP可同時發起的併發請求數;
傳輸速率:
anon_max_rate:匿名用戶的最大傳輸速率,單位是“字節/秒”
local_max_rate:本地用戶的最大傳輸速率,單位是“字節/秒”
六、實現vsftp+pam+mysql
通過pam_mysql模塊實現把用戶名和密碼存儲在MySQL數據庫,當客戶端登錄進行認證時就在MySQL數據庫進行查找,以實現用戶的管理。
1、安裝所需要程序
1)安裝mysql和pam_mysql
# yum -y install vsftpd mysql-servermysql-devel pam_mysql
注意:pam_mysql由epel源提供。
2、準備數據庫及相關表
1)準備數據庫和表
首先請確保mysql服務已經正常啓動,而後,按需要建立存儲虛擬用戶的數據庫即可,這裏將其創建爲vsftp數據庫
MariaDB [(none)]> CREATE DATABASE vsftp MariaDB [vsftp]> grant select on vsftp.*to vsftp@'172.16.%.%' identified by 'vsftpd'; Query OK, 0 rows affected (0.04 sec) MariaDB [vsftp]> flush privileges; Query OK, 0 rows affected (0.00 sec) MariaDB [vsftp]> CREATE TABLE users (id INT UNSIGNED NOT NULL AUTO_INCREMENTPRIMARY KEY, name VARCHAR(50) BINARY NOT NULL, password CHAR(48)BINARY NOTNULL);
2)添加測試的虛擬賬號
根據需要添加所所需要的用戶,需要說明的是,這裏將其密碼爲了安全起見應該使用PASSWORD函數加密後存儲;
MariaDB [vsftp]> INSERT INTO users(name,password) VALUES ('tom',password('ftp')),('jerry',password('vsftp')); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 MariaDB [vsftp]> select * from users; +----+-------+-------------------------------------------+ | id | name | password | +----+-------+-------------------------------------------+ | 1| tom |*89DED2CC215FEBF4D5077792E8CBF7B3A3CE6A53 | | 2| jerry | *EDE7E32F5C826747A362F47049DF433214ADBFE6 | +----+-------+-------------------------------------------+
3、配置vsftpd
1)建立pam認證所需文件
#vi /etc/pam.d/vsftpd.mysql
添加如下兩行
auth required pam_mysql.so user=vsftppasswd=vsftpd host=172.16.9.20 db=vsftp table=users usercolumn=namepasswdcolumn=password crypt=2 account required pam_mysql.so user=vsftppasswd=vsftpd host=172.16.9.20 db=vsftp table=users usercolumn=namepasswdcolumn=password crypt=2
注意:由於mysql的安裝方式不同,pam_mysql.so基本unix sock連接mysql服務器時可能會出問題,此時建議授權一個遠程連接的mysql並訪問vsftpd數據庫的用戶;
2)修改vsftpd的配置文件,使其適應mysql認證
建立虛擬用戶映射的系統用戶及對應的目錄
[root@stu09 ~]# mkdir /ftpserver [root@stu09 ~]# useradd -s /sbin/nologin -d /ftpserver/pub vuser
請確保/etc/vsftpd.conf中已經啓用了以下選項
anonymous_enable=YES local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES
而後添加以下選項
guest_enable=YES guest_username=vuser
並確保pam_service_name選項的值如下所示
pam_service_name=vsftpd.mysql
3)重啓vsftpd服務
4、配置虛擬用戶具有不同的訪問權限
vsftpd可以在配置文件目錄中爲每個用戶提供單獨的配置文件以定義其ftp服務訪問權限,每個虛擬用戶的配置文件名同虛擬用戶的用戶名。配置文件目錄可以是任意未使用目錄,只需要在vsftpd.conf指定其路徑及名稱即可。
1)配置vsftpd爲虛擬用戶使用配置文件目錄
#vim vsftpd.conf
添加如下選項
user_config_dir=/etc/vsftpd/vuser_config
2)創建所需要目錄,併爲虛擬用戶提供配置文件
mkdir /etc/vsftpd/vuser_config/ cd /etc/vsftpd/vuser_config/ touch tom jerry
3)配置虛擬用戶的訪問權限
虛擬用戶對vsftpd服務的訪問權限是通過匿名用戶的的相關指令進行的,比如,如果需要讓tom用戶具有上傳文件的權限,可以修改/etc/vsftpd/vuser_config/tom文件,在裏面添加如下選項即可。
anon_upload_enable={YES|NO} anon_mkdir_write_enable={YES|NO} anon_other_write_enable=(YES|NO}