一、FTP工作原理
(1)FTP使用端口
[root@localhost ~]# cat /etc/services | grep ftp ftp-data 20/tcp #數據鏈路:端口20 ftp 21/tcp #控制鏈路:端口21
(2)FTP連接方式
支持兩種連接模式:主動模式(Port)和被動模式(Pasv),這兩種模式都是針對數據鏈路進行的,與控制鏈路無關。
- 主動模式工作過程:
1.客戶端從自己的一個任意端口(N > 1024)和FTP服務器的21端口建立控制鏈路
2.然后客戶端發出Port指令告訴服務器連接自己的N+1端口來建立一條數據通道
3.當FTP服務器接到這一指令時,會使用20端口連接用戶在Port指令中指定的端口號N+1來發送數據
- 被動模式工作過程:
1.客戶端從自己的一個任意端口(N > 1024)和FTP服務器的21端口建立控制鏈路
2.然后客戶端發送Pasv指令,告訴服務器自己要連接服務器的某一個端口
3.如果服務器上的這個端口是空閑可用的,那么服務器會返回確認信息,之后數據傳輸通道被建立;但如果服務器上的這個端口被另一個資源所使用,那么服務器返回不確認的信息,那么這是客戶端會再次發送Pasv命令。
注意:
- 在FTP客戶連接服務器的整個過程中,控制信道是一直保持連接的,而數據傳輸通道是臨時建立的;
- 主動模式建立數據傳輸通道是由服務器端發起的,服務器使用20端口連接客戶端某一個大於1024的端口;
- 被動模式中建立數據傳輸通道是由客戶端發起的,它使用一個大於1024的端口連接服務器的1024端口以上的某一個端口。
二、ftp服務器搭建
需求:在Linux中搭建一個ftp服務器在存儲文件,創建一個ftp用戶:test,主目錄是:/home/test,設置該用戶不允許登錄服務器,並需要限制該用戶不能離開自己的主目錄。
【實現步驟】
1.查看系統有沒有安裝vsftpd
# rpm -qa | grep vsftpd
vsftpd-3.0.2-21.el7.x86_64
注:vsftp(Very Secure FTP)是Linux系統下使用最多的FTP服務端。
2.查看vsftpd服務是否開機自啟
# chkconfig --list vsftpd
vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
3.建立一個新用戶賬戶test,-d 參數指定用戶登入時的主目錄,參數-m 表示如果主目錄不存在則自動創建
# useradd -d /home/test -m test
為用戶設置密碼,輸入命令:
# passwd 密碼
4.vsftpd的配置
安裝完成后,執行命令【rpm -ql vsftpd】可以查看與vsftpd相關的配置文件和文檔,其中在/etc/vsftpd目錄下有三個主要配置文件:
- vsftpd.conf 主配置文件
- ftpusers 指定哪些用戶不能訪問FTP服務器
- user_list 指定的用戶是否可以訪問ftp服務器
查看vsftpd.conf配置文件
內容如下:
1 [root@localhost ~]# cat /etc/vsftpd/vsftpd.conf | grep -v '^#' 2 #----匿名用戶設置---- 3 anonymous_enable=NO #禁止匿名用戶登錄 4 5 #----本地用戶設置---- 6 local_enable=YES #允許本地用戶登錄ftp服務器 7 write_enable=YES #允許用戶想服務器執行寫入操作 8 local_umask=022 #設置服務器上本地用戶創建文件的權限掩碼 9 10 #----歡迎語設置---- 11 dirmessage_enable=YES #啟用目錄提示消息 12 13 #----日志文件設置---- 14 xferlog_enable=YES #啟用日志文件功能,記錄於/var/log/xferlog 15 xferlog_std_format=YES #啟用標准的日志格式 16 17 #----FTP工作方式與端口設置---- 18 connect_from_port_20=YES #主動模式下,是否啟用默認的20端口進行數據傳輸 19 20 #----與連接相關的設置---- 21 listen=NO #vsftpd不是以獨立的服務運行,要受到xinetd服務的管控,功能上會受到限制 22 listen_ipv6=YES 23 24 #----控制用戶是否允許切換到上級目錄---- 25 chroot_list_enable=YES #開啟限制用戶在主目錄的功能 26 chroot_list_file=/etc/vsftpd/chroot_list #在chroot_list文件中加入你要限制的用戶名,一行一個用戶 27 28 #----虛擬用戶設置---- 29 pam_service_name=vsftpd #虛擬用戶使用PAM認證方式 30 31 #----控制用戶訪問(通過vsftpd.user_list和ftpusers文件來實現)---- 32 userlist_enable=YES #是否啟用userlist_file文件 33 userlist_file=/etc/vsftpd/user_list #允許user_list文件中加入的用戶訪問ftp服務器 34 35 #----控制主機訪問---- 36 tcp_wrappers=YES #vsftpd服務器檢查/etc/hosts.allow和/etc/hosts.deny中的設置,來決定請求連接的主機,是否允許訪問該FTP服務器 37 38 #----其它設置---- 39 allow_writeable_chroot=YES #去除用戶主目錄的寫權限
在上述vsftpd.conf的相關選項的配置下,對ftpuser文件和user_list文件的配置如下:
- ftpusers文件:不添加test用戶,表示該用戶不能訪問ftp服務器
- user_list文件:在/etc/vsftpd.conf主配置文件中設置了userlist_deny=YES(默認情況),則不添加test用戶,表示該用戶不能訪問ftp服務器
5.開啟vsftpd服務
#service vsftpd start
6.訪問ftp服務器方法
- 瀏覽器:ftp://ip地址
- ftp客戶端軟件,比如FileZilla,輸入ftp服務器IP,用戶名,密碼,端口:21
- 命令行終端:ftp 用戶名@ftp服務器IP,或 ftp 127.0.0.1
注意:關閉ftp服務器上的防火牆及Selinux(防止端口限制)
-------------------------------
補充知識點
-
FTP日志功能配置
xferlog_enable=YES //開啟日志功能 xferlog_file=/var/log/xferlog //日志文件的存放位置 xferlog_std_format=YES //使用標准格式記錄日志
xferlog該日志文件記錄了FTP會話,可以顯示出用戶向從FTP服務器拷貝了什么文件。其中一條記錄如下:
Thu Feb 16 10:09:05 2017 1 10.10.10.9 990 ./home/ftpie.txt b _ o r test ftp 0 * c
含義:在某個時間test用戶向主機10.10.10.9上傳了哪些文件
數據參數說明
記錄數據 | 參數名稱 | 參數說明 |
Thu Feb 16 10:09:05 | 當前時間 | 當前服務器本地時間 |
1 | 傳輸時間 | 傳送文件所用時間,單位為秒 |
10.10.10.9 | 遠程主機名稱/IP | 遠程主機名稱/IP |
990 | 文件大小 | 傳送文件的大小,單位為byte |
./home/ftpie.txt | 文件名 | 傳輸文件名,包括路徑 |
b | 傳輸類型 | 傳輸方式的類型,包括兩種: |
– | 特殊處理標志 | 特殊處理的標志位,可能的值包括: |
o | 傳輸方向 | 文件傳輸方向,包括兩種: |
r | 訪問模式 | 用戶訪問模式,包括: |
test | 用戶名 | 用戶名稱 |
ftp | 服務名 | 所使用的服務名稱,一般為FTP |
0 | 認證方式 | 認證方式,包括: |
* | 認證用戶id | 認證用戶的id,如果使用*,則表示無法獲得該id |
c | 完成狀態 | 傳輸的狀態: |
-
匿名用戶ftp
服務器安裝完成vsftpd后是允許匿名用戶訪問的,匿名訪問的用戶名是ftp,密碼為空。這個用戶可以在/etc/passwd文件中找到
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
數據參數說明:
在ftp用戶這行中,一共有七個字段,每個字段之間用冒號分割;
- ftp 用戶名
- x 密碼字段,是隱藏的
- 14 用戶的UID字段,是唯一的
- 50 用戶組的GID,是唯一的
- FTP User 是用戶說明字段
- /var/ftp 是ftp用戶的家目錄
- /sbin/nologin 表示不能登錄系統;如果把/sbin/nologin改為/bin/bash,這樣ftp用戶可以通過本地或遠程工具ssh或telnet以真實用戶身份登錄到系統。
默認情況下,匿名用戶登錄所訪問的文件夾一般是/var/ftp,當然也可以由用戶自行添加或刪除。而且,匿名用戶的權限只能是下載,而不能上傳或是其它寫操作。
-
配置vsftpd服務器在非標准端口(非21端口)工作
在/etc/vsftpd.conf中,將list_port=10034或者其它端口號選項加入該文件中即可,然后重新啟動vsftp守護進程。
# ftp 127.0.0.1 10034 注:此時測試以前使用的21端口,該端口已經不再有用;如果要使用ftp默認的21端口工作,需要刪除或者使用#屏蔽掉前面加入的選項即可。