Highslide for Wordpress Plugin

FTP 簡介

FTP 是相當古老的傳輸協定之一,他最主要的功能是在伺服器與用戶端之間進行檔案的傳輸。 FTP 其實是以 TCP 封包的模式進行伺服器與用戶端電腦之間的連線,當連線建立後,使用者可以在用戶端端連上 FTP 伺服器來進行檔案的下載與上傳,此外,也可以直接管理用戶在 FTP 伺服器上面的檔案呢,相當的方便! 而這個古老的協定是使用明碼傳輸,且過去有相當多的安全危機歷史。為了更安全的使用 FTP 協定, 我們將選用較為安全但功能較少的 vsftpd 這個軟體。

FTP

伺服器的功能除了單純的進行檔案的傳輸與管理之外,依據伺服器軟體的設定架構, 他還可以提供幾個主要的功能,底下我們約略的來談一談:

· 不同等級的使用者身份:

FTP 伺服器在預設的情況下,依據使用者登入的情況而分為三種不同的身份,分別是 (1)實體帳號,real user(2)訪客, guest(3)匿名登入者, anonymous 這三種。這三種身份的使用者在系統上面的使用權限差異很大!

· 命令記錄與登錄檔記錄:

FTP 可以利用系統的 syslogd 這個 daemon 來進行資料的紀錄, 而記錄的資料包括了使用者曾經下達過的命令與使用者傳輸資料(傳輸時間、檔案大小等等)的紀錄呢! 所以你可以很輕鬆的在 /var/log/ 裡面找到各項登錄資訊喔!

· 限制或解除使用者家目錄所在(change root, 簡稱 chroot)

Reference Page:

http://linux.vbird.org/linux_server/0410vsftpd.php

FTP 的運作流程與使用到的埠口

FTP 的傳輸使用的是較為可靠的 TCP 封包協定,TCP 這種封包格式在建立連線前會先進行三向交握的。不過 FTP 伺服器是比較麻煩一些,因為 FTP 伺服器使用了兩個連線,分別是命令通道與資料流通道 (ftp-data) 這兩個連線都需要經過三向交握, 因為是 TCP 封包嘛!那麼這兩個連線通道的關係是如何呢?底下我們先以 FTP 預設的主動式 (active) 連線來作個簡略的說明囉:


5-1FTP 伺服器的主動式連線示意圖

簡單的連線就如上圖所示,至於連線的步驟是這樣的:

  1. 建立命令通道的連線
    如上圖5-1所示,用戶端會隨機取一個大於 1024 以上的埠口 (port AA) 來與 FTP 伺服器端的 port 21 達成連線, 這個過程當然需要三向交握了!達成連線後用戶端便可以透過這個連線來對 FTP 伺服器下達指令, 包括查詢檔名、下載、上傳等等指令都是利用這個通道來下達的;
  2. 通知 FTP 伺服器端使用 active 且告知連接的埠號
    FTP 伺服器的 21 埠號主要用在命令的下達,但是當牽涉到資料流時,就不是使用這個連線了。 用戶端在需要資料的情況下,會告知伺服器端要用什麼方式來連線,如果是主動式 (active) 連線時, 用戶端會先隨機啟用一個埠口 (圖一當中的 port BB) ,且透過命令通道告知 FTP 伺服器這兩個資訊,並等待 FTP 伺服器的連線;
  3. FTP 伺服器『主動』向用戶端連線
    FTP 伺服器由命令通道瞭解用戶端的需求後,會主動的由 20 這個埠號向用戶端的 port BB 連線, 這個連線當然也會經過三向交握啦!此時 FTP 的用戶端與伺服器端共會建立兩條連線,分別用在命令的下達與資料的傳遞。 而預設 FTP 伺服器端使用的主動連線埠號就是 port 20 囉!

如此一來則成功的建立起『命令』與『資料傳輸』兩個通道!不過,要注意的是, 『資料傳輸通道』是在有資料傳輸的行為時才會建立的通道喔!並不是一開始連接到 FTP 伺服器就立刻建立的通道呢!留意一下囉!

一般來說,很多的區域網路 (LAN) 都會使用防火牆 (iptables) NAT 功能,那麼在 NAT 主機後端的 FTP 用戶如何連接到 FTP 伺服器呢? 我們可以簡單的以下圖來說明:

5-2、若 FTP 用戶端與伺服器端連線中間具有防火牆的連線狀態

FTP 的主動式連線當中,NAT 主機將會被視為用戶端,但 NAT 主機其實並非用戶端啊, 這就造成問題了。如果你曾經在 IP 分享器後面連接某些 FTP 伺服器時,可能偶爾會發現明明就連接上 FTP 伺服器了 (命令通道已建立),但是就是無法取得檔案名稱的列表,而是在超過一段時間後顯示『 Can’t build data connection: Connection refused,無法進行資料傳輸』之類的訊息, 那肯定就是這個原因所造成的困擾了。

那有沒有辦法可以克服這個問題呢?難道真的在 Linux NAT 主機後面就一定無法使用 FTP 嗎?當然不是! 目前有兩個簡易的方法可以克服這個問題:

  • 使用 iptables 所提供的 FTP 偵測模組:
    其實 iptables 早就提供了許多好用的模組了,這個 FTP 當然不會被錯過! 你可以使用 modprobe 這個指令來載入 ip_conntrack_ftp ip_nat_ftp 等模組,這幾個模組會主動的分析『目標是 port 21 的連線』資訊, 所以可以得到 port BB 的資料,此時若接受到 FTP 伺服器的主動連線,就能夠將該封包導向正確的後端主機了! ^_^

    不過,如果你連結的目標 FTP 伺服器他的命令通道預設埠號並非標準的 21 埠號時 (例如某些地下 FTP 伺服器), 那麼這兩個模組就無法順利解析出來了,這樣說,理解嗎?

  • 用戶端選擇被動式 (Passive) 連線模式:
    除了主動式連線之外,FTP 還提供一種稱為被動式連線的模式,什麼是被動式呢? 既然主動式是由伺服器向用戶端連線,反過來講,被動式就是由用戶端向伺服器端發起連線的囉! 既然是由用戶端發起連線的,那自然就不需要考慮來自 port 20 的連線啦!

那麼什麼是被動式連線呢?我們可以使用底下的圖示來作個簡略的介紹喔:


  • 5-3、被動式連線的方向

被動式 FTP 資料通道的連線方向是由用戶端向主機端連線的喔! 如此一來,在 NAT 主機內部的用戶端主機就可以順利的連接上 FTP Server 了!透過 PASV 模式,伺服器在沒有特別設定的情況下,會隨機選取大於 1024 的埠口來提供用戶端連接之用。那麼萬一主機啟用的埠口被搞鬼怎麼辦?而且, 如此一來也很難追蹤來自入侵者攻擊的登錄資訊啊!所以,這個時候我們可以透過 passive ports 的功能來『限定』主機啟用的 port number 喔!

Reference Page:

http://linux.vbird.org/linux_server/0410vsftpd.php

Related Posts with Thumbnails
留下迴響