檔案服務系列
檔案儲存服務系統(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 協議採用客戶端-伺服器架構,主要涉及兩個通訊通道:
- 控制連線:用於傳輸控制資訊(如命令和響應),使用 TCP 埠 21。
- 資料連線:用於傳輸實際的檔案資料,使用 TCP 埠 20 或動態分配的埠。
傳輸模式
FTP 有兩種傳輸模式:
-
主動模式(Active Mode):
- 客戶端透過隨機的高位埠連線到伺服器的控制埠(21)。
- 客戶端在傳輸資料時告訴伺服器監聽一個隨機高位埠。
- 伺服器從其資料埠(20)連線到客戶端指定的高位埠進行資料傳輸。
-
被動模式(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 協議沒有加密機制,傳輸的資料和憑證都是以明文形式傳送的,這會導致安全風險。因此,衍生出了以下更安全的版本:
- FTPS(FTP Secure/SSL):透過 SSL/TLS 對 FTP 連線進行加密。
- 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 等替代方案。