FTP是一種在互聯網中進行文件傳輸的協議,基於客戶端/服務器模式,默認使用20、21號端口,其中端口20(數據端口)用於進行數據傳輸,端口21(命令端口)用於接受客戶端發出的相關FTP命令與參數。python
FTP服務器是按照FTP協議在互聯網上提供文件存儲和訪問服務的主機,FTP客戶端則是向服務器發送鏈接請求,以創建數據傳輸鏈路的主機。FTP協議有下面兩種工做模式。算法
主動模式:FTP服務器主動向客戶端發起鏈接請求。 被動模式:FTP服務器等待客戶端發起鏈接請求(FTP的默認工做模式)。
vsftpd(very secure ftp daemon,很是安全的FTP守護進程)是一款運行在Linux操做系統上的FTP服務程序。數據庫
[root@zhangjh ~]# yum install vsftpd -y
iptables防火牆管理工具默認禁止了FTP傳輸協議的端口號,所以在正式配置vsftpd服務程序以前,爲了不這些默認的防火牆策略「搗亂」,還須要清空iptables防火牆的默認策略vim
[root@zhangjh ~]# iptables -F [root@zhangjh ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
經過在grep命令後面添加-v參數,過濾並反選出沒有包含井號(#)的參數行(即過濾掉全部的註釋信息),而後將過濾後的參數行經過輸出重定向符寫回原始的主配置文件中安全
[root@zhangjh ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak [root@zhangjh ~]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf [root@zhangjh ~]# cat /etc/vsftpd/vsftpd.conf 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
vsftpd服務程序經常使用的參數以及做用:服務器
參數 | 做用 |
listen=[YES|NO] | 是否以獨立運行的方式監聽服務 |
listen_address=IP地址 | 設置要監聽的IP地址 |
listen_port=21 | 設置FTP服務的監聽端口 |
download_enable=[YES|NO] | 是否容許下載文件 |
userlist_enable=[YES|NO] userlist_deny=[YES|NO] |
設置用戶列表爲「容許」仍是「禁止」操做 |
max_clients=0 | 最大客戶端鏈接數,0爲不限制 |
max_per_ip=0 | 同一IP地址的最大鏈接數,0爲不限制 |
anonymous_enable=[YES|NO] | 是否容許匿名用戶訪問 |
anon_upload_enable=[YES|NO] | 是否容許匿名用戶上傳文件 |
anon_umask=022 | 匿名用戶上傳文件的umask值 |
anon_root=/var/ftp | 匿名用戶的FTP根目錄 |
anon_mkdir_write_enable=[YES|NO] | 是否容許匿名用戶建立目錄 |
anon_other_write_enable=[YES|NO] | 是否開放匿名用戶的其餘寫入權限(包括重命名、刪除等操做權限) |
anon_max_rate=0 | 匿名用戶的最大傳輸速率(字節/秒),0爲不限制 |
local_enable=[YES|NO] | 是否容許本地用戶登陸FTP |
local_umask=022 | 本地用戶上傳文件的umask值 |
local_root=/var/ftp | 本地用戶的FTP根目錄 |
chroot_local_user=[YES|NO] | 是否將用戶權限禁錮在FTP目錄,以確保安全 |
local_max_rate=0 | 本地用戶最大傳輸速率(字節/秒),0爲不限制 |
vsftpd做爲更加安全的文件傳輸的服務程序,容許用戶以三種認證模式登陸到FTP服務器上。網絡
匿名開放模式:是一種最不安全的認證模式,任何人均可以無需密碼驗證而直接登陸到FTP服務器。 本地用戶模式:是經過Linux系統本地的帳戶密碼信息進行認證的模式,相較於匿名開放模式更安全。 虛擬用戶模式:是這三種模式中最安全的一種認證模式,它須要爲FTP服務單獨創建用戶數據庫文件,虛擬出用來進行口令驗證的帳戶信息, 而這些帳戶信息在服務器系統中其實是不存在的,僅供FTP服務程序進行認證使用。這樣,即便黑客破解了帳戶信息也沒法登陸服務器,從而有效下降了破壞範圍和影響。
ftp是Linux系統中以命令行界面的方式來管理FTP傳輸服務的客戶端工具。 app
[root@zhangjh ~]# yum install ftp -y
匿名用戶開放的權限參數以及做用:less
參數 | 做用 |
anonymous_enable=YES | 容許匿名訪問模式 |
anon_umask=022 | 匿名用戶上傳文件的umask值 |
anon_upload_enable=YES | 容許匿名用戶上傳文件 |
anon_mkdir_write_enable=YES | 容許匿名用戶建立目錄 |
anon_other_write_enable=YES | 容許匿名用戶修改目錄名稱或刪除目錄 |
[root@zhangjh ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES anon_umask=022 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_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
在vsftpd服務程序的主配置文件中正確填寫參數,而後保存並退出。還須要重啓vsftpd服務程序,讓新的配置參數生效;socket
生產環境必定要把配置過的服務程序加入到開機啓動項中,以保證服務器在重啓後依然可以正常提供傳輸服務:
[root@zhangjh ~]# systemctl restart vsftpd [root@zhangjh ~]# systemctl enable vsftpd ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service'
如今就能夠在客戶端執行ftp命令鏈接到遠程的FTP服務器了。在vsftpd服務程序的匿名開放認證模式下,其帳戶統一爲anonymous,密碼爲空。
並且在鏈接到FTP服務器後,默認訪問的是/var/ftp目錄。咱們能夠切換到該目錄下的pub目錄中,而後嘗試建立一個新的目錄文件,以檢驗是否擁有寫入權限:
在vsftpd服務程序的匿名開放認證模式下,默認訪問的是/var/ftp目錄。查看該目錄的權限得知,只有root管理員纔有寫入權限。因此將目錄的全部者身份改爲系統帳戶ftp便可
[root@zhangjh ~]# chown -Rf ftp /var/ftp/pub [root@zhangjh ~]# ftp 192.168.38.251 Connected to 192.168.38.251 (192.168.38.251). 220 (vsFTPd 3.0.2) Name (192.168.38.251:root): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd pub 250 Directory successfully changed. ftp> mkdir files 257 "/pub/files" created ftp> rename files database 350 Ready for RNTO. 250 Rename successful. ftp> rmdir database 250 Remove directory operation successful. ftp> exit 221 Goodbye.我
本地用戶模式使用的權限參數以及做用:
參數 | 做用 |
anonymous_enable=NO | 禁止匿名訪問模式 |
local_enable=YES | 容許本地用戶模式 |
write_enable=YES | 設置可寫權限 |
local_umask=022 | 本地用戶模式建立文件的umask值 |
userlist_deny=YES | 啓用「禁止用戶名單」,名單文件爲ftpusers和user_list |
userlist_enable=YES | 開啓用戶做用名單文件功能 |
[root@zhangjh ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=NO 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
在vsftpd服務程序的主配置文件中正確填寫參數,而後保存並退出。還須要重啓vsftpd服務程序,讓新的配置參數生效。
[root@zhangjh ~]# systemctl restart vsftpd
嘗試本地用戶登陸ftp
[root@zhangjh ~]# ftp 192.168.38.251 Connected to 192.168.38.251 (192.168.38.251). 220 (vsFTPd 3.0.2) Name (192.168.38.251:root): 530 Permission denied. Login failed. ftp>
可見,在輸入root管理員的密碼以前,就已經被系統拒絕訪問了。這是由於vsftpd服務程序所在的目錄中默認存放着兩個名爲「用戶名單」的文件(ftpusers和user_list)。
vsftpd服務程序目錄中的這兩個文件,只要裏面寫有某用戶的名字,就再也不容許這位用戶登陸到FTP服務器上。
也能夠選擇ftpusers和user_list文件中沒有的一個普通用戶嘗試登陸FTP服務器
[root@zhangjh ~]# vim /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root #把root用戶刪除掉
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@zhangjh ~]# vim /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
這樣修改以後就能夠用root用戶來登陸ftp了,也能夠選擇ftpusers和user_list文件中沒有的一個普通用戶嘗試登陸FTP服務器
其餘用戶登陸:
[root@zhangjh ~]# ftp 192.168.38.251 Connected to 192.168.38.251 (192.168.38.251). 220 (vsFTPd 3.0.2) Name (192.168.38.251:root): jianghua 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>
root用戶登陸:
[root@zhangjh ~]# ftp 192.168.38.251 Connected to 192.168.38.251 (192.168.38.251). 220 (vsFTPd 3.0.2) Name (192.168.38.251:root): root 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>
在採用本地用戶模式登陸FTP服務器後,默認訪問的是該用戶的家目錄,也就是說,訪問的是/home/jianghua目錄。並且該目錄的默認全部者、所屬組都是該用戶本身,所以不存在寫入權限不足的狀況。
最安全的一種認證模式,由於安全性較之於前面兩種模式有了提高,因此配置流程也會稍微複雜一些。
第1步:建立用於進行FTP認證的用戶數據庫文件,其中奇數行爲帳戶名,偶數行爲密碼。例如,咱們分別建立出zhangjianghua和jianghua兩個用戶,密碼均爲password
[root@zhangjh ~]# vim /etc/vsftpd/vuser.list zhangjianghua password jianghua password
可是,明文信息既不安全,也不符合讓vsftpd服務程序直接加載的格式,所以須要使用db_load命令用哈希(hash)算法將原始的明文信息文件轉換成數據庫文件,而且下降數據庫文件的權限(避免其餘人看到數據庫文件的內容),而後再把原始的明文信息文件刪除。
[root@zhangjh ~]# db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db [root@zhangjh ~]# file /etc/vsftpd/vuser.db /etc/vsftpd/vuser.db: Berkeley DB (Hash, version 9, native byte-order) [root@zhangjh ~]# chmod 600 /etc/vsftpd/vuser.db [root@zhangjh ~]# rm -f /etc/vsftpd/vuser.list
第2步:建立vsftpd服務程序用於存儲文件的根目錄以及虛擬用戶映射的系統本地用戶。FTP服務用於存儲文件的根目錄指的是,當虛擬用戶登陸後所訪問的默認位置。
[root@zhangjh ~]# useradd -d /var/ftproot -s /sbin/nologin virtual [root@zhangjh ~]# ls -ld /var/ftproot/ drwx------. 3 virtual virtual 74 Jun 13 15:54 /var/ftproot/ [root@zhangjh ~]# chmod -Rf 755 /var/ftproot/
第3步:創建用於支持虛擬用戶的PAM文件。
新建一個用於虛擬用戶認證的PAM文件vsftpd.vu,其中PAM文件內的「db=」參數爲使用db_load命令生成的帳戶密碼數據庫文件的路徑,但不用寫數據庫文件的後綴:
[root@zhangjh ~]# vim /etc/pam.d/vsftpd.vu auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser
第4步:在vsftpd服務程序的主配置文件中經過pam_service_name參數將PAM認證文件的名稱修改成vsftpd.vu,PAM做爲應用程序層與鑑別模塊層的鏈接紐帶,
可讓應用程序根據需求靈活地在自身插入所需的鑑別功能模塊。當應用程序須要PAM認證時,則須要在應用程序中定義負責認證的PAM配置文件,實現所需的認證功能。
利用PAM文件進行認證時使用的參數以及做用:
參數 | 做用 |
anonymous_enable=NO | 禁止匿名開放模式 |
local_enable=YES | 容許本地用戶模式 |
guest_enable=YES | 開啓虛擬用戶模式 |
guest_username=virtual | 指定虛擬用戶帳戶 |
pam_service_name=vsftpd.vu | 指定PAM文件 |
allow_writeable_chroot=YES | 容許對禁錮的FTP根目錄執行寫入操做,並且不拒絕用戶的登陸請求 |
[root@zhangjh ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES guest_enable=YES guest_username=virtual allow_writeable_chroot=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.vu #修改成vsftpd.vu userlist_enable=YES tcp_wrappers=YES
第5步:爲虛擬用戶設置不一樣的權限。
[root@zhangjh ~]# mkdir /etc/vsftpd/vusers_dir [root@zhangjh ~]# cd /etc/vsftpd/vusers_dir/ [root@zhangjh vusers_dir]# touch jianghua [root@zhangjh vusers_dir]# vim zhangjianghua anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
而後再次修改vsftpd主配置文件,經過添加user_config_dir參數來定義這兩個虛擬用戶不一樣權限的配置文件所存放的路徑。
爲了讓修改後的參數當即生效,須要重啓vsftpd服務程序並將該服務添加到開機啓動項中:
[root@zhangjh ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES guest_enable=YES guest_username=virtual allow_writeable_chroot=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.vu userlist_enable=YES tcp_wrappers=YES user_config_dir=/etc/vsftpd/vusers_dir #在最後一行添加這一句
[root@zhangjh ~]# systemctl restart vsftpd.service
第6步:測試
zhangjianghua用戶能夠增刪改查
[root@zhangjh ~]# ftp 192.168.38.251 Connected to 192.168.38.251 (192.168.38.251). 220 (vsFTPd 3.0.2) Name (192.168.38.251:root): zhangjianghua 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> mkdir 111222 257 "/111222" created ftp> rename 111222 database 350 Ready for RNTO. 250 Rename successful. ftp> rmdir database 250 Remove directory operation successful.
jianghua用戶只有查詢的權限:
[root@zhangjh ~]# ftp 192.168.38.251 Connected to 192.168.38.251 (192.168.38.251). 220 (vsFTPd 3.0.2) Name (192.168.38.251:root): jianghua 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> mkdir files 550 Permission denied.
簡單文件傳輸協議(Trivial File Transfer Protocol,TFTP)是一種基於UDP協議在客戶端和服務器之間進行簡單文件傳輸的協議。顧名思義,它提供不復雜、開銷不大的文件傳輸服務(可將其看成FTP協議的簡化版本)。
TFTP的命令功能不如FTP服務強大,甚至不能遍歷目錄,在安全性方面也弱於FTP服務。並且,因爲TFTP在傳輸文件時採用的是UDP協議,佔用的端口號爲69,所以文件的傳輸過程也不像FTP協議那樣可靠。
可是,由於TFTP不須要客戶端的權限認證,也就減小了無謂的系統和網絡帶寬消耗,所以在傳輸瑣碎(trivial)不大的文件時,效率更高。
安裝TFTP的軟件包:
[root@zhangjh ~]# yum install -y tftp-server tftp
在RHEL 7系統中,TFTP服務是使用xinetd服務程序來管理的。xinetd服務能夠用來管理多種輕量級的網絡服務,並且具備強大的日誌功能。
簡單來講,在安裝TFTP軟件包後,還須要在xinetd服務程序中將其開啓,把默認的禁用(disable)參數修改成no:
[root@zhangjh ~]# vim /etc/xinetd.d/tftp # default: off # description: The tftp server serves files using the trivial file transfer \ # protocol. The tftp protocol is often used to boot diskless \ # workstations, download configuration files to network-aware printers, \ # and to start the installation process for some operating systems. service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 }
而後,重啓xinetd服務並將它添加到系統的開機啓動項中,以確保TFTP服務在系統重啓後依然處於運行狀態。
[root@zhangjh ~]# systemctl restart xinetd.service [root@zhangjh ~]# systemctl enable xinetd
TFTP的根目錄爲/var/lib/tftpboot,可使用剛安裝好的tftp命令嘗試訪問其中的文件,親身體驗TFTP服務的文件傳輸過程。
在使用tftp命令訪問文件時,須要用到的參數以下:
tftp命令中可用的參數以及做用:
命令 | 做用 |
? | 幫助信息 |
put | 上傳文件 |
get | 下載文件 |
verbose | 顯示詳細的處理信息 |
status | 顯示當前的狀態信息 |
binary | 使用二進制進行傳輸 |
ascii | 使用ASCII碼進行傳輸 |
timeout | 設置重傳的超時時間 |
quit | 退出 |
[root@zhangjh ~]# echo "i am gelute" > /var/lib/tftpboot/readme.txt [root@zhangjh ~]# tftp 192.168.38.251 tftp> get readme.txt tftp> quit [root@zhangjh ~]# cat readme.txt i am gelute