1. 程式人生 > >vsftpd搭建ftp

vsftpd搭建ftp

12月10日任務

14.4 exportfs命令

14.5 NFS客戶端問題

15.1 FTP介紹

15.2/15.3 使用vsftpd搭建ftp

 

exportfs命令

在nfs執行後的一段時間內,如果需要新增共享目錄,這時需要修改exports檔案,並重啟服務使之生效。然而此時可能有客戶端已經掛載了共享目錄,並且正在執行讀寫操作。這時我們就不能直接關閉伺服器上的nfs服務,這樣極易導致客戶端上的讀寫nfs共享目錄內檔案的程序掛起,導致程序狀態不正常,既無法刪除也無法重啟,嚴重時將導致客戶端宕機。直接重啟nfs服務的前提是將掛載了共享目錄的客戶機解除安裝目錄,在客戶端很多的情況下,這種方法就變得十分繁瑣。

nfs-utils包內自帶了一個exportfs命令,可以在不關閉nfs服務的情況下生效修改後的exports檔案。

常用引數

  • -a 全部掛載或解除安裝
  • -r 重新掛載
  • -u 解除安裝某一個目錄
  • -v 顯示共享目錄

例如在伺服器進行如下修改

[root@server ~]# vim /etc/exports
/home/nfstestdir 192.168.65.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
# 新增如下程式碼
/tmp 192.168.65.134(rw,sync,no_root_squash)

此時客戶端上檢視的共享目錄資訊未變

[root@client ~]# showmount -e 192.168.65.133
Export list for 192.168.65.133:
/home/nfstestdir 192.168.65.0/24

執行exportfs目錄後重新檢視

[root@server ~]# exportfs -arv
exporting 192.168.65.134:/tmp
exporting 192.168.65.0/24:/home/nfstestdir

# 客戶端資訊更新
[root@client ~]# showmount -e 192.168.65.133
Export list for 192.168.65.133:
/home/nfstestdir 192.168.65.0/24
/tmp             192.168.65.134

測試配置是否生效

[root@client ~]# mount -t nfs 192.168.65.133:/tmp /mnt
[root@client ~]# vim /mnt/11.txt
# no_root_squash引數生效
[root@client ~]# ls -l /mnt/11.txt 
-rw-r--r--. 1 root root 11 1月  10 20:00 /mnt/11.txt

[root@server ~]# ls -l /tmp/11.txt 
-rw-r--r--. 1 root root 11 1月  10 20:00 /tmp/11.txt

NFS客戶端問題

在centos6版本中,NFSv4偶爾會出現一個問題:客戶端在掛載共享目錄後,即便是在服務端設定好no_root_squash引數後,無論是root使用者還普通使用者,在建立新檔案時,檔案的屬主和屬組都為nobody。

解決上述問題的方法:

  1. 在客戶端掛載時加上-o nfsvers=3,即指定nfs版本為3,不去使用v4版本。
# 方法1:先umount,後mount
[root@client ~]# umount /mnt
[root@client ~]# mount -t nfs -o nfsvers=3 192.168.65.133:/tmp /mnt

# 使用-o remount命令(前提已經掛載)
[root@client~]# mount -t nfs -oremount,nfsvers=3 192.168.65.133:/tmp /mnt
  1. 編輯/etc/idmapd.conf
# 客戶端、伺服器都需要進行配置
[root@localhost ~]# vim /etc/idmapd.conf
/Domain定義到該行
在下一行新增
Domain = xxx.com //域名可以隨意,客戶端、伺服器對應即可

# 完成後在伺服器上重啟rpcbind服務
[root@localhost ~]# systemctl restart rpcbind

FTP介紹

FTP是File Transfer Protocol檔案傳輸協議)的英文簡稱,用於在Internet上控制檔案的雙向傳輸。

ftp的主要作用就是讓使用者連線一個遠端計算機(執行ftp訪問的伺服器),並檢視遠端計算機中的檔案,然後把檔案從遠端計算機複製到本地計算機,或把本機計算機的檔案傳輸到遠端計算機。

出於安全性的考慮,ftp在小公司用的比較多。大企業幾乎不怎麼使用,而是使用專門的自動化釋出平臺,相對而言更加安全。

搭建FTP服務

centos上的ftp軟體包 vsftpd

vsftpd可以由系統級別的使用者去登入ftp,登入後用戶會進入其家目錄下。由於這些ftp使用者(系統級別用戶)設定密碼後,可以登入到系統,極易產生一些安全問題。我們可以通過給FTP服務設定一個虛擬的使用者,並對映為系統內的普通使用者,這些虛擬使用者就無法直接登入伺服器,安全性就比較好。

  • 安裝vsftpd
[root@localhost ~]# yum install -y vsftpd
  • 建立使用者
# 建立使用者指定shell為/sbin/nologin,不讓使用者登入系統
[root@localhost ~]# useradd -s /sbin/nologin virftp
  • 編輯虛擬使用者的密碼檔案
# 密碼檔案格式:奇數行為使用者名稱,偶數行為密碼
[root@localhost ~]# vim /etc/vsftpd/vsftpd_login
test
1

# 修改許可權,只有屬主有讀寫許可權
[root@localhost ~]# chmod 600 /etc/vsftpd/vsftpd_login
  • 將密碼檔案轉換為二進位制檔案
# 文字型的密碼檔案不被識別,需要轉換為計算機可識別的二進位制檔案
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vsftpd_login /etc/vsftpd/vsftpd_login.db

[root@localhost ~]# ls -l /etc/vsftpd/vsftpd_login*
-rw-r--r--. 1 root root     7 1月  11 18:31 /etc/vsftpd/vsftpd_login
-rw-r--r--. 1 root root 12288 1月  11 18:37 /etc/vsftpd/vsftpd_login.db
  • 建立虛擬使用者的配置檔案
# 儲存配置檔案的目錄需要直接建立,目錄名自定義
[root@localhost ~]# mkdir /etc/vsftpd/vsftpd_user_conf
[root@localhost ~]# cd /etc/vsftpd/vsftpd_user_conf

# 配置檔案的檔名需要跟密碼檔案內的使用者名稱對應
# 比如我在/etc/vsftpd/vsftpd_login下定義的使用者時test,這裡配置檔案就是test
[root@localhost vsftpd_user_conf]# vim test
// 輸入以下程式碼

// 定義虛擬使用者的家目錄,使用者在該目錄讀寫檔案
local_root=/home/virftp/test
// 不允許匿名使用者
anonymous_enable=NO
// 允許寫
write_enable=YES
// 虛擬使用者建立新檔案、目錄的umask值
local_umask=022
// 不允許匿名使用者上傳
anon_upload_enable=NO
// 不允許匿名使用者建立目錄並寫檔案
anon_mkdir_write_enable=NO
// 空閒使用者時間,超過自動斷開連線
idle_session_timeout=600
// 資料傳輸的超時時間
data_connection_timeout=120
// 最大連線的客戶端數
max_clients=10
  • 建立虛擬使用者家目錄
[root@localhost vsftpd_user_conf]# mkdir /home/virftp/test
[root@localhost vsftpd_user_conf]# touch /home/virftp/test/1.txt
# 修改目錄的許可權,防止因許可權導致的無法讀寫問題
[root@localhost vsftpd_user_conf]# chown -R virftp:virftp /home/virftp/
  • 定義使用者密碼檔案路徑
# /etc/pam.d/vsftpd 用來認證的檔案,登入ftp時,通過該檔案比對使用者及密碼十分準確
[root@localhost vsftpd_user_conf]# vim /etc/pam.d/vsftpd 
#%PAM-1.0
# 在開頭新增下面兩行程式碼
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

對於/etc/pam.d/vsftpd內新增的程式碼說明:/lib64/security/pam_userdb.so是64位系統內的庫檔案路徑,在centos6版本內還有32位的系統,這時需要修改為/lib/security/pam_userdb.so。

  • 編輯vsftpd配置檔案
[root@localhost vsftpd_user_conf]# vim /etc/vsftpd/vsftpd.conf 
anonymous_enable=NO           //原為:anonymous_enable=YES
anon_upload_enable=NO         //原為:#anon_upload_enable=YES
anon_mkdir_write_enable=NO    //原為:#anon_mkdir_write_enable=YES

#再新增如下程式碼
chroot_local_user=YES    
guest_enable=YES
guest_username=virftp           // 指定虛擬使用者
virtual_use_local_privs=YES     //表示現在使用了虛擬使用者
user_config_dir=/etc/vsftpd/vsftpd_user_conf  //定義虛擬配置檔案所在目錄
allow_writeable_chroot=YES
  • 重啟服務
[root@localhost vsftpd_user_conf]# systemctl start vsftpd

# 服務已啟動
[root@localhost vsftpd_user_conf]# ps aux| grep vsftp
root       2486  0.0  0.0  53216   580 ?        Ss   19:17   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root       2488  0.0  0.0 112680   976 pts/0    S+   19:19   0:00 grep --color=auto vsftp

# 21埠已開
[root@localhost vsftpd_user_conf]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
...
tcp6       0      0 :::21                   :::*                    LISTEN      2486/vsftpd         
...                  

啟動時報錯“Job for vsftpd.service failed because the control process exited with error code.”,其原因是配置檔案vsftpd.conf內參數寫錯,所以遇到啟動不了可以檢視配置引數是否正確。

服務測試

Windows上推薦使用filezilla,為了測試的方便,在測試機安裝lftp軟體即可。

  • 安裝lftp
[root@localhost vsftpd_user_conf]# yum install -y lftp
  • 登入、操作
# 登入ftp伺服器:使用者名稱@127.0.0.1,輸入密碼
[root@localhost vsftpd_user_conf]# lftp [email protected]
口令: 

# 成功登入
# ls檢視當前目錄下的檔案
lftp [email protected]:~> ls           
-rw-r--r--    1 1002     1002            0 Jan 11 10:47 1.txt
# ?檢視可操作的命令
lftp [email protected]:/> ?
    !<shell-command>                     (commands)
    alias [<name> [<value>]]             attach [PID]
    bookmark [SUBCMD]                    cache [SUBCMD]
    cat [-b] <files>                     cd <rdir>
    chmod [OPTS] mode file...            close [-a]
    [re]cls [opts] [path/][pattern]
    debug [<level>|off] [-o <file>]      du [options] <dirs>
    exit [<code>|bg]
    get [OPTS] <rfile> [-o <lfile>]
    glob [OPTS] <cmd> <args>             help [<cmd>]
    history -w file|-r file|-c|-l [cnt]  jobs [-v] [<job_no...>]
    kill all|<job_no>                    lcd <ldir>
    lftp [OPTS] <site>                   ln [-s] <file1> <file2>
    ls [<args>]                          mget [OPTS] <files>
    mirror [OPTS] [remote [local]]       mkdir [-p] <dirs>
    module name [args]                   more <files>
    mput [OPTS] <files>                  mrm <files>
    mv <file1> <file2>                   [re]nlist [<args>]
    open [OPTS] <site>
    pget [OPTS] <rfile> [-o <lfile>]
    put [OPTS] <lfile> [-o <rfile>]      pwd [-p]
    queue [OPTS] [<cmd>]                 quote <cmd>
    repeat [OPTS] [delay] [command]      rm [-r] [-f] <files>
    rmdir [-f] <dirs>                    scache [<session_no>]
    set [OPT] [<var> [<val>]]            site <site-cmd>
    source <file>
    torrent [-O <dir>] <file|URL>...
    user <user|URL> [<pass>]             wait [<jobno>]
    zcat <files>                         zmore <files>
    
# get命令從ftp伺服器上下載檔案到本機
lftp [email protected]:/> get 1.txt 

lftp [email protected]:/> quit
# get命令下載的檔案預設在登入前的使用者所在目錄
[root@localhost vsftpd_user_conf]# ls
1.txt  test