檔案系統 FTP Ubuntu 安裝入門介紹

老马啸西风發表於2024-08-03

檔案服務系列

檔案儲存服務系統(File Storage Service System)-00-檔案伺服器是什麼?為什麼需要?

檔案儲存服務系統(File Storage Service System)-01-常見的檔案協議介紹

檔案系統 FTP Ubuntu 安裝入門介紹

檔案儲存服務系統(File Storage Service System)-02-SFTP 協議介紹

分散式檔案服務系統(Distributed File System, DFS)-00-分散式檔案服務系統是什麼?

分散式儲存系統-01-minio 入門介紹

分散式儲存系統-02-開源的分散式檔案系統 Fastdfs 安裝入門介紹

分散式儲存系統-03-ceph 一個可擴充套件的分散式儲存系統介紹

分散式儲存系統-04-GlusterFS 是一個基於物件的開源分散式檔案系統,適用於雲端儲存和媒體流等場景

分散式儲存系統-05-Lustre 是一個高效能的分散式檔案系統,主要用於大型超級計算機叢集

分散式儲存系統-06-MooseFS 是一個開源的分散式檔案系統,設計用於提供高可靠性和擴充套件性

分散式儲存系統-07-OpenAFS 是 Andrew File System 的開源實現,是一個分散式網路檔案系統

分散式儲存系統-08-OrangeFS 是 PVFS 的下一代版本,是一個面向高效能運算的開源並行檔案系統

FTP

環境: Ubuntu 14.04

blog zh_CN

ubuntu14.04

  • Install
全新安裝:apt-get install vsftpd
重新安裝:apt-get --reinstall install vsftpd
解除安裝並清除配置檔案:apt-get --purge remove vsftpd
  • Start & Restart
$   service vsftpd start
$   service vsftpd restart

注意:

網上文章很多有提及/etc/init.d/vsftpd start 之類的啟動方式。但是這個目錄下我不存在 vsftpd. 這個目錄確實有: /etc/init/vsftpd.conf

vsftpd 已經進化為 Upstart job
設定檔放在
/etc/init/vsftpd.conf
  • Create ftp user

1.此使用者只是用來使用ftp服務的
2.此使用者不可登入伺服器
3.此使用者不能訪問ftp指定資料夾之外的檔案

(1) 建立一個使用者ftp0

useradd -d /home/ftp0 -m ftp0

(2) 修改ftp0的密碼

passwd ftp0
  • Config /etc/vsftpd.conf
anonymous_enable=NO         # 不允許匿名訪問
write_enable=YES            # 允許寫
local_enable=YES            # 允許本地主機訪問
chroot_local_user=YES       # 只能訪問自身的目錄,此處有坑,需加上下面一行

報錯誤資訊:

“500 OOPS: vsftpd: refusing to run with writable root inside chroot()”

從2.3.5之後,vsftpd增強了安全檢查,如果使用者被限定在了其主目錄下,則該使用者的主目錄不能再具有寫許可權了!如果檢查發現還有寫許可權,就會報該錯誤。

(1) 啟用了chroot的話,根目錄要設定為不可寫

chmod a-w /home/ftp0

(2) 或者新增一句話

allow_writeable_chroot=YES #允許寫自身的目錄

可是新增這句話可能會導致服務重啟失敗。。。

無奈之下。。。chroot_local_user=YES這句話暫時不加。

  • 讓使用者不能登入
$   usermod -s /sbin/nologin ftp0

after all these, restart the ftp service:

# service vsftpd restart
vsftpd stop/waiting
vsftpd start/pre-start, process 10305
# service vsftpd status
vsftpd start/running, process 10305
  • Test
# ftp
ftp> open 192.168.2.108
Connected to 192.168.2.108.
220 (vsFTPd 3.0.2)
Name (192.168.2.108:hbb): ftp0
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

需要 vi /etc/shells, 最後一行新增:

/sbin/nologin

重新測試:

# ftp
ftp> open 192.168.2.108
Connected to 192.168.2.108.
220 (vsFTPd 3.0.2)
Name (192.168.2.108:hbb): ftp0
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

21 埠檢視:

netstat -npltu | grep 21
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      11398/vsftpd

Ftp Java code

  • Java 測試程式碼
package com.ryo.ftp;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.File;
import java.io.FileInputStream;

/**
 * @author houbinbin
 * @on 17/1/1
 */
public class FTPTest {

    private FTPClient ftp;

    /**
     * @param path     上傳到ftp伺服器哪個路徑下
     * @param addr     地址
     * @param port     埠號
     * @param username 使用者名稱
     * @param password 密碼
     * @return
     * @throws Exception
     */
    private boolean connect(String path, String addr, int port, String username, String password) throws Exception {
        boolean result = false;
        ftp = new FTPClient();
        int reply;
        ftp.connect(addr, port);
        ftp.login(username, password);
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            return result;
        }
        ftp.changeWorkingDirectory(path);
        result = true;
        return result;
    }

    /**
     * @param file 上傳的檔案或資料夾
     * @throws Exception
     */
    private void upload(File file) throws Exception {
        if (file.isDirectory()) {
            ftp.makeDirectory(file.getName());
            ftp.changeWorkingDirectory(file.getName());
            String[] files = file.list();
            for (int i = 0; i < files.length; i++) {
                File file1 = new File(file.getPath() + "\\" + files[i]);
                if (file1.isDirectory()) {
                    upload(file1);
                    ftp.changeToParentDirectory();
                } else {
                    File file2 = new File(file.getPath() + "\\" + files[i]);
                    FileInputStream input = new FileInputStream(file2);
                    ftp.storeFile(file2.getName(), input);
                    input.close();
                }
            }
        } else {
            File file2 = new File(file.getPath());
            FileInputStream input = new FileInputStream(file2);
            ftp.storeFile(file2.getName(), input);
            input.close();
        }
    }

    //測試即使指定其他使用者的資料夾,還要沒有寫的許可權也無法上傳。
    public static void main(String[] args) throws Exception {
        FTPTest t = new FTPTest();
        t.connect("/home/ftp0/", "192.168.2.108", 21, "ftp0", "123456");
        File file = new File("/Users/houbinbin/Downloads/ftptest.txt");
        t.upload(file);
    }

}

chat

詳細介紹一下 FTP 協議

FTP(File Transfer Protocol)是用於在網路上進行檔案傳輸的標準協議。

它是應用層協議,使用 TCP 埠 21 進行通訊,主要用於在客戶端和伺服器之間上傳、下載和管理檔案。以下是對 FTP 協議的詳細介紹:

FTP 協議概述

工作原理

FTP 協議採用客戶端-伺服器架構,主要涉及兩個通訊通道:

  1. 控制連線:用於傳輸控制資訊(如命令和響應),使用 TCP 埠 21。
  2. 資料連線:用於傳輸實際的檔案資料,使用 TCP 埠 20 或動態分配的埠。

傳輸模式

FTP 有兩種傳輸模式:

  1. 主動模式(Active Mode)

    • 客戶端透過隨機的高位埠連線到伺服器的控制埠(21)。
    • 客戶端在傳輸資料時告訴伺服器監聽一個隨機高位埠。
    • 伺服器從其資料埠(20)連線到客戶端指定的高位埠進行資料傳輸。
  2. 被動模式(Passive Mode)

    • 客戶端透過隨機的高位埠連線到伺服器的控制埠(21)。
    • 客戶端請求伺服器進入被動模式,伺服器選擇一個隨機高位埠並告知客戶端。
    • 客戶端從其隨機高位埠連線到伺服器的該隨機高位埠進行資料傳輸。

FTP 命令和響應

常見 FTP 命令

  • USER:提供使用者名稱
  • PASS:提供密碼
  • CWD:改變工作目錄
  • PWD:列印工作目錄
  • LIST:列出檔案和目錄
  • RETR:下載檔案
  • STOR:上傳檔案
  • DELE:刪除檔案
  • QUIT:退出會話

常見 FTP 響應程式碼

  • 1xx:積極的初始答覆(如150,表示檔案狀態良好,準備開啟資料連線)
  • 2xx:成功(如200,表示命令成功)
  • 3xx:需要進一步的資訊(如331,表示使用者名稱正確,需要密碼)
  • 4xx:暫時的負面答覆(如421,表示服務不可用,關閉控制連線)
  • 5xx:永久的負面答覆(如530,表示未登入)

安全性

傳統的 FTP 協議沒有加密機制,傳輸的資料和憑證都是以明文形式傳送的,這會導致安全風險。因此,衍生出了以下更安全的版本:

  1. FTPS(FTP Secure/SSL):透過 SSL/TLS 對 FTP 連線進行加密。
  2. SFTP(SSH File Transfer Protocol):雖然名稱相似,但 SFTP 是基於 SSH 的完全獨立的協議,提供加密的資料傳輸。

使用場景

  • 檔案共享:FTP 伺服器可用於在組織內部或與客戶之間共享大檔案。
  • 網站管理:許多網站管理員使用 FTP 來上傳和管理網站檔案。
  • 資料備份:FTP 可用於將資料備份到遠端伺服器。

FTP 的優缺點

優點

  • 簡單:易於實現和使用。
  • 跨平臺:廣泛支援各種作業系統和裝置。
  • 效率高:傳輸大檔案時效能較好。

缺點

  • 不安全:傳統的 FTP 缺乏加密機制,容易被攻擊。
  • 防火牆問題:主動模式和被動模式的連線建立可能會被防火牆阻止。
  • 過時:相對於現代檔案傳輸協議,FTP 的功能和安全性不足。

相關工具

  • FTP 客戶端:FileZilla、WinSCP、Cyberduck 等。
  • FTP 伺服器:vsftpd、ProFTPD、FileZilla Server 等。

結論

FTP 協議作為一種古老而廣泛使用的檔案傳輸協議,儘管在現代安全要求下顯得不夠完善,但在一些場景中仍然非常有用。

對於需要更高安全性的場景,可以選擇 FTPS 或 SFTP 等替代方案。

相關文章