# ftp server
[TOC]
## FTP
### history
+ 1971年4月16日由 Abhay Bhushan 編寫作為 RFC 114 發布。
+ 1980 年,FTP 才在 TCP/IP 的前身 NCP 上執行。該協定先被 TCP/IP 版本,RFC 765(1980年6月)取代,
+ 1985 年 10 月後來又被 RFC 959 所取代,這也是當前規範。RFC 959 提出了若干標準修改,例如 RFC 1579(1994年2月)使 FTP 能夠穿越NAT與防火牆(被動模式),RFC 2228(1997年6月)提出安全擴充,RFC 2428(1998年9月)增加了對 IPv6 的支援,並定義了一種新型的被動模式


>[圖自](https://www.geeksforgeeks.org/file-transfer-protocol-ftp-in-application-layer/)
+ FTP 主要是應用於檔案傳輸使用,將共享檔案存放於 FTP 伺服器,讓一般使用者可以透過網路來下載或上傳。它的重點是在異質性電腦之間、以及遠距離的檔案共享使用
### Active模式
+ Port mode
+ 由服務器主動發起傳送資料請求
+ 
+ 
1. Client 端主動向 Server 端發送連線需求( SYN )
+ 隨機選取一個大於 1024 以上的 port 來主動的連線到 FTP 主機提供的 FTP 埠口 (通常是21)
2. Server 端接受後,回應給 Client 端 (SYN & ACK)
3. Client 端回應確認封包 (ACK)
+ 完成三項交握
4. Client 端發送資料傳輸要求的命令給 Server
+ 注意這裡是用命令的通道發送命令
+ 告訴 Server 說:『我已經準備好一個資料傳輸的埠口了,請準備進行傳輸吧』
5. Server 端以 ftp-data 埠口主動連線到 Client
+ Server 用自己的port(通常是20) 主動去連線到剛剛client告知的port
+ Server 端主動向 Client 端的連線(SYN)
6. Client 端回應主機端,並繼續完成三向交握(ACK)
:::info
# TCP header

+ Control bit
+ SYN: 1 為希望與對方線進行同步處理(建立連線)
+ ACK: 1 為回應封包
+ FIN: 1 為通知對方結束連線(等對方確認)。
:::
+ **BUT 很多在防火牆內的 client 不被允許開啟某個 Port 給他人連線**
+ 許多機器設置在防火牆內,在防火牆內的機器只能透過防火牆有開啟的 Port 與外部連線,在 active mode 下這些機器就不能主動開啟某個 Port 給 Server 連線
### passive 被動模式
+ 服務器被動等待client!!
+ 
+ 
1. ~3 如active 一樣的三項交握
4. Client 端發送資料傳輸要求的命令給 Server
+ 告訴 FTP Server 說『我要使用 PASV 模式(就是 passive 啦!)的方式來進行資料傳輸』
5. Server 端挑選 > 1024 的埠口等待連線
+ 在接受 client 的 PASV 要求之後,如果沒有特別的設定時 (目前的 FTP 伺服器版本已經可以指定 passive port 來規定被動式連接的埠口號碼 ) ,Server 會隨機選取一個大於 1024 的埠口
+ 由命令通道告訴 client 端說:『我已經開了一個 ftp-data 的埠口等妳連線喔!』
6. Client 端主動向 Server 端建立連線並繼續完成三向交握
:::info
### 自我檢測
+ FTP 在 Client 與 Server 進行連線時,主要使用到的 port 有幾個?分別具有什麼用途?
+ Client 與 Server 進行 FTP 連線時,其模式分為 Active 與 Passive ,這兩種模式的差異為何?
+ 當 FTP 架設在防火牆內部時,則這個 FTP 需要使用的連線模式為何?
+ 如果希望防火牆支援FTP,需要下什麼指令
:::
## proftpd
`sudo apt install proftpd`
### proftpd.conf
+ ServerType:可以設為 inetd 與 standlone 其中之一。
+ standalone持續運作在伺服器內,inetd不持續運作
:::info
## inetd
+ Inetd(internet service daemon)
+ 只有當其他人對他發出 request 才會運作,因此不需持續地執行它。
:::
+ TimeoutNoTransfer
+ 沒有傳輸的狀況下等多久會 time out
+ modules.conf:存放啟用的module看看
+ 
+ TLS
+ SQL
+ LDAP
:::info
### LADAP
+ **L**ightweight **D**irectory **A**ccess **P**rotocol
+ 開放中立的工業標準的應用協定,通過IP協定提供存取控制和維護分散式資訊的目錄資訊
+ 
:::
+ AllowOverwrite:允許覆寫已存在的檔案。
+ DenyFilter:指定 FTP 指令裡禁止使用的字串,格式為常規表示式。第 13 行的設定 \*.*/ 禁止了萬用字元。
+ Port:指定伺服器使用的通訊埠,21 是 FTP 的標準通訊埠。如果把 Port 設為 0,表示關閉伺服器。
+ Umask: 設定預設上傳檔案權限遮罩
+ Anonymous(匿名登入):
+ 泛指不用帳號密碼就可以登入的模式,就可以開匿名者權限,任何人都可以用這個權限登入
+ 當使用 ftp client ( 如filezilla) 不打帳密時,就會自動幫你填入 Anonymous 的帳密
+ Default
+ User: anonymous
+ Password: anonymous@domain.com
+ User, Group:指定 ProFTPd 伺服器執行所使用的帳號與群組。第 16, 17 行設為作業系統裡權限最低的 nobody, nogroup。
+ MaxInstances:指定伺服器可產生子行程的最大值。雖然它不等於,但會影響到可同時連線客戶端的最大數目。
+ <Anonymous ~ftp> </Anonymous> 設定匿名登入的相關設定
+ 
+ User, Group:指定匿名伺服器執行時的帳號與群組身份。使用者在存取時,會套用成這裡指定的帳號與群組所具備的權限。
### log
+ `/var/log/proftpd/`
+ 
:::info
## 加密方式
### TLS
+ 啟用TLS 加密變成ftps
+ 
### ssh
+ 利用local tunnel 的方式將管理的通道加密
> [ProFTPD: Configuring FTP over SSH](http://www.proftpd.org/docs/howto/SSH.html)
:::
## ftp vs ftps vs sftp
+ FTP (File Transfer Protocol)
+ 明文傳輸
+ 使用 21 port 作為命令通道,讓主從雙方先握手建立連線 ACK x SYN 驗證,再依照是否啟用被動模式與否決定是否傳送 PASV 或指定 port 來確認資料傳輸 port (通常是 20),接著就開始進行 STOR 下載檔案或RETR傳送檔案,最後使用 FIN 結束連接(以上的通訊內容全部都是明文喔)。
+ FTPS (FTP over SSL/TLS)
+ 加密內文後傳輸
+ 透過安全通訊端層 (SSL) 或傳輸層安全 (TLS) 通訊協定,讓檔案傳輸受到加密保護,減少不必要風險。
:::info
### TLS
+ Transport Layer Security
+ SSL 的後繼協議
+ 1999 年 IETF 將 SSL 標準化,時改名為 TLS, 而 TLS 1.0 也支援相容 SSL 3.0 的功能
+ TLS handshake
+ 在 TCP 三向交握後進行
+ 指定它們將使用的 TLS 版本(TLS 1.0、1.2、1.3等)
+ 決定它們將使用的密碼套件
+ 通過伺服器的公開密鑰和 SSL 憑證頒發機構的電子簽名驗證伺服器的身份
+ 生成工作階段金鑰,以便在握手完成後使用對稱加密
:::
+ SFTP(SSH File Transfer Protocol) SSH Protocol standard
+ 加密傳輸管道
+ 透過 Secure Shell(SSH)通訊協定傳輸,是SSH 內建的檔案傳輸服務
+ 預設 port 22
:::info
### 答案
+ FTP 在 Client 與 Server 進行連線時,主要使用到的 port 有幾個?分別具有什麼用途?
+ 4 個,兩個命令通道 兩個資料通道
+ Client 與 Server 進行 FTP 連線時,其模式分為 Active 與 Passive ,這兩種模式的差異為何?
+ Active 由 client 開啟 port 讓 server 主動發起連線
+ passive 由 server 開啟 port 讓 server 被動等待連線
+ 當 FTP 架設在防火牆內部時,則這個 FTP 需要使用的連線模式為何?
+ Passive
+ 如果希望防火牆支援FTP,需要下什麼指令
+ `iptables -A INPUT -p tcp --dport 21 -j ACCEPT`
+ `iptables -A INPUT -p tcp --dport 20 -j ACCEPT`
+ `iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT`
+ `iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT`
:::
## REF
[資料傳輸安全ithome](https://ithelp.ithome.com.tw/articles/10188645)
[SFTP FTP ](https://www.xuehua.us/a/5eb6168b86ec4d433b2dba31?lang=zh-tw)
[FTP](https://www.baeldung.com/cs/active-vs-passive-ftp)
[FTP in application layer](https://www.geeksforgeeks.org/file-transfer-protocol-ftp-in-application-layer/)
[ProFTPD: Configuring FTP over SSH](http://www.proftpd.org/docs/howto/SSH.html)
[ProFTPD config](https://yungyuc.github.io/oldtech/debian/ProFTPdConf.html#id1)
[Proftpd other setting](https://datahunter.org/proftpd)