Ubuntu22.04 vsftpd

啊里个东發表於2024-10-26

Ubuntu22.04 LTS上搭建FTP服務

一、安裝vsftpd軟體包
sudo apt install vsftpd -y
sudo systemctl enable vsftpd 
sudo systemctl start vsftpd

檢視版本,驗證是否安裝成功

vsftpd -v
二、配置FTP引數

1、ftp工作目錄

sudo mkdir -p /home/ftp/uftp

2、ftp工作使用者

sudo useradd -d /home/ftp/uftp -m uftp    \\建立FTP使用者名稱
sudo passwd uftp    \\設定密碼
chmod -R 777 /home/ftp    \\設定ftp許可權

3、修改vsftpd.conf

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig   \\備份vsftpd.conf檔案
sudo vim /etc/vsftpd.conf      \\編輯vsftpd.conf
修改和新增內容

修改

listen=YES
listen_ipv6=NO
chroot_local_user=YES   \\去註釋

增加

userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/allowed_users
local_enable=YES
write_enable=YES
pasv_promiscuous=YES
anonymous_enable=NO
allow_writeable_chroot=YES 

在/etc目錄下建立檔案allowed_users,用於儲存允許登入ftp伺服器的本地使用者,可以在root下面直接用命令:

echo uftp   >> /etc/allowed_users

vsftpd.conf翻譯

  1 # 示例配置檔案,地址: /etc/vsftpd.conf
  2 #
  3 # vsftpd的預設編譯設定比較謹慎,這個示例檔案會放寬一些限制,使ftp服務更加易用。
  4 # 同時建議檢視vsftpd.conf.5檔案以瞭解所有編譯預設值。
  5 #
  6 # 特別提醒:這個示例檔案並不包含vsftpd選項的所有內容,建議閱讀vsftpd.conf.5手冊頁以充分了解vsftpd的功能。
  7 #
  8 #
  9 # 
 10 # 用來設定vsftpd是否以獨立守護程序執行。
 11 # 如果設定為"listen=YES",則表示vsftpd將作為獨立守護程序執行;
 12 # 如果設定為"listen=NO",則表示vsftpd將不會以獨立守護程序執行,而是透過inetd或者initscript啟動。
 13 listen=NO
 14 #
 15 # 設定vsftpd是否啟用IPv6監聽。
 16 # 如果設定為"listen_ipv6=YES",則表示vsftpd將啟用IPv6監聽;
 17 # 如果設定為"listen_ipv6=NO",則表示vsftpd將不會啟用IPv6監聽。
 18 # 預設情況下,IPv6監聽地址為"::",同時可以接受IPv6和IPv4客戶端的連線。
 19 # 如果你只需要監聽IPv4或IPv6地址,則不需要同時啟用兩種監聽,如果你需要同時監聽特定的IPv4和IPv6地址,則需要執行兩個vsftpd例項,並使用兩個不同的配置檔案來進行配置。
 20 listen_ipv6=YES
 21 #
 22 # 設定是否允許匿名FTP登入。
 23 anonymous_enable=NO
 24 #
 25 # 設定是否允許本地使用者登入FTP伺服器。
 26 local_enable=YES
 27 #
 28 # 設定是否允許FTP使用者執行寫入操作。
 29 # write_enable=YES
 30 #
 31 # 設定本地使用者的預設umask值。
 32 # umask是一個三位八進位制數,用來控制新建檔案或目錄的訪問許可權。
 33 # 在FTP伺服器中,local_umask選項用來設定本地使用者上傳檔案或建立目錄時的預設許可權。
 34 # 預設情況下,local_umask的值為077,表示新建的檔案或目錄許可權為只有所有者可讀、可寫、可執行,其他使用者無權訪問。
 35 # 如果你的使用者希望預設許可權為所有者可讀、可寫、可執行,其他使用者可讀、可執行,則可以將local_umask的值設定為022。
 36 local_umask=022
 37 #
 38 # 設定是否允許匿名FTP使用者上傳檔案。
 39 # 如果將該選項的註釋去掉(即將“#”刪去),並將其值設定為YES,則表示允許匿名FTP使用者上傳檔案。
 40 # 但是,這個選項只有在全域性寫入許可權被啟用時才會生效。此外,你還需要建立一個由FTP使用者可寫的目錄,以便匿名FTP使用者可以上傳檔案。
 41 # 需要注意的是,開啟匿名FTP使用者上傳檔案功能可能存在一定的安全風險,因此需要謹慎使用。
 42 # anon_upload_enable=YES
 43 #
 44 # 設定是否允許匿名FTP使用者建立新目錄。
 45 # 如果將該選項的註釋去掉(即將“#”刪去),並將其值設定為YES,則表示允許匿名FTP使用者建立新目錄。
 46 # 需要注意的是,開啟匿名FTP使用者建立新目錄功能可能存在一定的安全風險,因此需要謹慎使用。
 47 # anon_mkdir_write_enable=YES
 48 #
 49 # 這段配置檔案是用來設定是否啟用目錄訊息功能。
 50 # 如果設定為YES,則表示啟用目錄訊息功能。當遠端使用者進入某個目錄時,會顯示該目錄的訊息。
 51 dirmessage_enable=YES
 52 #
 53 # 設定是否啟用本地時間功能。
 54 # 啟用本地時間功能後,vsftpd將會在目錄列表中顯示本地時間而非GMT時間。
 55 use_localtime=YES
 56 #
 57 # 啟用上傳和下載日誌記錄功能。
 58 # 啟用該功能後,vsftpd會記錄每個使用者的上傳和下載操作,並將其記錄到指定的日誌檔案中。
 59 xferlog_enable=YES
 60 #
 61 # 設定資料傳輸的埠號。
 62 # 將其值設定為YES,則表示資料傳輸使用的埠號為20。
 63 connect_from_port_20=YES
 64 #
 65 # 設定匿名使用者上傳的檔案的所有者。
 66 # 設定為YES,則表示上傳的檔案將會被轉換為指定使用者的所有權。
 67 # chown_uploads=YES
 68 # 設定為指定的使用者名稱。
 69 # chown_username=whoever
 70 #
 71 # 設定vsftpd日誌檔案的路徑。該路徑必須具有可寫許可權,並且對於vsftpd程序來說,必須具有可訪問許可權。
 72 # xferlog_file=/var/log/vsftpd.log
 73 #
 74 # 設定vsftpd日誌檔案的格式。裝置為YES則儲存為標準ftpd xferlog格式。
 75 # xferlog_std_format=YES
 76 #
 77 # 設定vsftpd空閒會話超時的時間(以秒為單位)。
 78 # idle_session_timeout=600
 79 #
 80 # 設定vsftpd資料連線超時的時間(以秒為單位)。
 81 # data_connection_timeout=120
 82 #
 83 # vsftpd建議在系統中定義一個唯一的使用者,供FTP伺服器使用,作為完全隔離和無特權的使用者。
 84 # nopriv_user選項可以用來指定該使用者的使用者名稱。
 85 # nopriv_user=ftpsecure
 86 #
 87 # 用於啟用非同步ABOR請求的識別。
 88 # 非同步ABOR請求是一種FTP客戶端請求,用於取消當前正在進行的資料傳輸操作。
 89 # 啟用該選項可以提高FTP伺服器的效能,但也會增加安全風險。因為非同步ABOR請求的程式碼比較複雜,可能會被駭客利用進行惡意攻擊。
 90 # 所以,如果安全性是首要考慮因素,則不建議啟用該選項。
 91 # async_abor_enable=YES
 92 #
 93 # 用於控制FTP伺服器是否啟用ASCII模式下的檔案轉換功能。
 94 # 預設情況下,FTP伺服器會假裝允許ASCII模式,但實際上會忽略該請求。
 95 # 如果需要啟用ASCII模式下的檔案轉換功能,則可以將ascii_upload_enable和ascii_download_enable選項的註釋去掉,並將它們的值設定為YES。
 96 # 在ASCII模式下,FTP伺服器會將文字檔案中的換行符和回車符進行轉換,以便在不同作業系統之間進行傳輸。
 97 # 但是,需要注意的是,ASCII模式下可能存在一些安全風險。例如,攻擊者可以利用SIZE命令在ASCII模式下傳送一個超大檔名,導致FTP伺服器崩潰。
 98 # 因此,建議謹慎使用ASCII模式,並確保FTP伺服器已經做好了相應的安全措施。
 99 # ascii_upload_enable=YES
100 # ascii_download_enable=YES
101 #
102 # vsftpd的登入橫幅的設定,你可以理解為登入成功後的歡迎詞。
103 # ftpd_banner=Welcome to blah FTP service.
104 #
105 # 裝置是否拒絕匿名電子郵件地址
106 # 有助於減輕利用匿名訪問FTP伺服器進行的拒絕服務(DoS)攻擊。如果檢測到被禁止的電子郵件地址,伺服器將拒絕該使用者的訪問。
107 # deny_email_enable=YES
108 # 如果啟用了拒絕匿名電子郵件地址的選項,則透過從指定的檔案“/etc/vsftpd.banned_emails”讀取被禁止的電子郵件地址列表。
109 # banned_email_file=/etc/vsftpd.banned_emails
110 #
111 # 裝置限制本地使用者僅訪問其home目錄。
112 # 如果啟用,則本地使用者將僅訪問其home目錄和其子目錄,無法訪問其他目錄。
113 # chroot_local_user=YES
114 #
115 # 是否允許本地使用者,是否將本地使用者限制在其主目錄中,如果設定為YES,則不會將列在chroot_list_file中的使用者限制在其主目錄中。
116 # chroot_local_user=YES
117 # 是否啟用chroot_list_file列表,用於指定哪些使用者不應該被限制在主目錄中。
118 # chroot_list_enable=YES
119 # 指定了chroot_list_file列表的路徑和名稱。一行一個使用者名稱。
120 # chroot_list_file=/etc/vsftpd.chroot_list
121 #
122 # 否啟用ls命令的遞迴選項“-R”,該選項可以在列出目錄內容時遞迴地列出子目錄。
123 # 預設情況下,該選項被禁用以避免遠端使用者在大型站點上引起過多的I/O。
124 # ls_recurse_enable=YES
125 #
126 # 自定義配置:
127 #
128 # 指定了一個空目錄作為安全chroot() jail。
129 # 在某些情況下,vsftpd不需要訪問檔案系統,因此可以將FTP使用者限制在這個空目錄中,以增強安全性。該目錄應該為空,並且不應該被FTP使用者寫入。
130 secure_chroot_dir=/var/run/vsftpd/empty
131 #
132 # 指定vsftpd將使用的PAM服務的名稱。
133 # 預設情況下,pam_service_name的值為“vsftpd”,這意味著vsftpd將使用名為“vsftpd”的PAM服務來進行認證。
134 # 如果需要使用其他的PAM服務,可以修改該選項的值。
135 pam_service_name=vsftpd
136 #
137 # 用於指定在SSL加密連線中使用的RSA證書的位置。
138 # 透過設定rsa_cert_file和rsa_private_key_file選項來指定RSA證書和私鑰的位置。
139 # 其中,rsa_cert_file選項用於指定證書檔案的位置,而rsa_private_key_file選項用於指定私鑰檔案的位置。
140 rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
141 rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
142 # 是否啟用SSL加密連線。
143 ssl_enable=NO
144 #
145 # 指定是否在vsftpd中使用UTF-8編碼的檔案系統。
146 # utf8_filesystem=YES
4、重啟FTP服務使配置生效
sudo systemctl restart vsftpd

三、驗證

1、本機驗證

輸入命令:ftp 127.0.0.1,輸入使用者名稱、密碼,顯示登入成功說明就OK啦!

2、ftp工具驗證

3、python程式碼上傳檔案驗證

from ftplib import FTP

def ftpconnect(host, username, password):
    ftp = FTP()
    ftp.set_debuglevel(2)
    ftp.connect(host, 21)
    ftp.login(username, password)
    return ftp

def downloadfile(ftp, remotepath, localpath):
    # 從ftp下載檔案
    bufsize = 1024
    with open(localpath, 'wb') as fp:
        ftp.retrbinary('RETR ' + remotepath, fp.write,bufsize)
    ftp.set_debuglevel(0)
    fp.close()


def uploadfile(ftp, localpath, remotepath):
    # 從本地上傳檔案到ftp
    bufsize = 1024
    with open(localpath, 'rb') as fp:
        ftp.storbinary('STOR ' + remotepath, fp,bufsize)
    ftp.set_debuglevel(0)
    fp.close()

if __name__ == "__main__":
    ftp = ftpconnect("10.111.112.92", "uftp", "123456")
    uploadfile(ftp, "test.py", "test.py")
    ftp.quit()

相關文章