[CentOS 7] 檔案傳輸界的隱形冠軍 - TFTP 伺服器

by 9/06/2016 0 意見

FTP 能傳檔案,SFTP 也能傳檔案,HTTP 同樣能傳檔案,幹嘛又跑出一個 TFTP 也要來傳檔案啊?
這這這,你們搞得我好亂啊 ...... XDDD

前陣子,我們在實作 傳輸檔案的好伙伴,老當益壯的 FTP 伺服器 - vsFTPd 的時候,提到在匿名傳輸大檔案的時候,FTP 是很棒的選擇。

當我們只需要服務內部使用者,而且不想要額外增加服務的時候,由 SSH Server 提供的 SFTP 功能,會是個更好的方式。

如果我們同樣不想要額外增加的服務,還需要在網頁上提供超連結讓匿名使用者下載的話,當然我們就會選擇直接使用 HTTP。

那,TFTP 又是用在什麼樣的情境呢?
它的全名是 Trivial File Transfer Protocol,「Trivial」這個字有瑣碎、微小、平凡的意思,Microsoft 把它翻譯成 簡單式檔案傳輸通訊協定,也代表它需求很低、功能很少、用途很小的事實。

它是在 1980 年代出生的,在那個 CPU 速度還在 10MHz 左右、RAM 容量在 640KB 上下、開機就一片 1.2MB 磁碟片搞定的時代,對安全性也還沒那麼講究,反正檔案也沒多大,傳的上去、抓的下來就好,管那麼多幹嘛 ~~~

但是滄海桑田,過了快 40 年之後,TFTP 當然已經不符時宜了。
  • 通訊埠走 UDP 69:
    既然是 非連線導向 (Connectionless),掉封包、沒人收也是很合理的事。
  • 半雙工傳輸
    上傳跟下載,同時只能選一個。
  • 不能顯示目錄資訊:
    我們無法得知已經存了什麼東西,要嘛亂猜,要嘛事先搞清楚。
  • 不驗證、不加密:
    在這個資安風險大爆發的時代,這個玩笑可是開大了啊~~~
既然如此這麼不方便又不安全,為什麼它還存在著呢?
  1. 因為簡單又輕巧。
    尤其適合像是嵌入式系統 (Embedded System)、單板電腦 ( Single Board Computer)、無線基地台 (Access Point) ... 等系統資源有限的設備,拿來救援、維護、更新 ... 等工作。
    例如我在 市售 Wi-Fi 無線基地台改用 Tomato Firmware 的刷機步驟 的實作時,Asus RT-N16 使用的救援模式,背後的服務應該就是 TFTP Server。
  2. 因為不需要特別的設定跟參數。
    Cisco 家的設備用它來備份、還原設定值,例如:不自量力のWeithenn - Catalyst 2950-IOS 版本升級
  3. 因為方便與其他套件合作。
    Maual Page 上提到的無磁碟開機 (Diskless Boot),如 Windows PXE Server (Preboot eXecution Environment)DRBL 企鵝龍,會用它來派送開機時所要用到的檔案。
所以真要說起來,TFTP Server 可不是個省油的燈,只是我們從來不知道!!!

安裝服務


從 CentOS 官方套件庫安裝。
sudo yum -y install xinetd tftp-server

它的運作模式跟我們之前實作過的其他套件不一樣,通常是用 Super Daemon 模式,而不是用 Stand-alone 模式。

所以必須依賴 xinetd 才能運作,因此不能只安裝 tftp server 而已。

Stand-alone 跟 Super Daemon 的差別,說起來也很簡單,以銀行的櫃台為例,Stand-alone 是那些提供專屬服務的櫃台,就像存放款、票據、匯兌、VIP ... 等互動頻率高或專業性高的服務,一個櫃員就只負責一種業務,浪費資源,但是有效率。

而 Super Daemon 就像是服務台或是綜合櫃台,像是開戶、結清、繳費、客訴、諮詢 ... 等疑難雜症,統一窗口服務到底,節省人力,但是常常要痴痴的等它回來。



編輯設定檔


我們編輯的是 xinetd 裡的 TFTP 子設定檔。
sudo vi /etc/xinetd.d/tftp

修改這兩個設定值。

# 允許建立新檔案,並指定 tftp 的根目錄位置
server_args = -c -s /var/lib/tftpboot
「不要」在 xinetd 裡停用 tftp
diable      = no

調整根目錄的擁有者,讓匿名使用者可以上傳檔案,或許有些朋友比較習慣用 chmod 指令來改。
sudo chown nobody:nobody /var/lib/tftpboot

重新啟動 xinetd。
sudo systemctl restart xinetd

視需求決定是否讓它在開機後自動啟動。
sudo systemctl enable xinetd

其他設定


SELinux

很多教學文章要我們直接把 SELinux 停用,這是個很不好的方法,根本是因噎廢食。

正確的作法應該是先查一下有關 tftp 的設定值有哪些。
getsebool -a | grep tftp

然後再把需要調整的設定值修改掉才是對的。
sudo setsebool -P tftp_anon_write 1
sudo setsebool -P tftp_home_dir 1

Firewall

防火牆也是一樣,只開放必要的通訊埠就好了,而不是整個停用。
sudo firewall-cmd --zone=public --add-service=tftp --permanent
sudo firewall-cmd --reload


用戶端實測


TFTP Client 要自己手動安裝。
sudo yum -y install tftp

下載

我們先在 TFTP Server 裡,新增一個 sample.txt 的純文字檔。
sudo bash -c 'echo "Test file for TFTP Server" > /var/lib/tftpboot/sample.txt'

連線到 TFTP Server,把它下載下來。
tftp 127.0.0.1 -c get sample.txt

上傳

比照辦理,我們在家目錄新增一個 client.doc 的純文字檔。
echo "The file is for client." > client.doc

再把它上傳到 TFTP Server 上去。
tftp 127.0.0.1 -c put client.doc


異常排除 


上傳到 Server 的時候,出現「Error code 1: File not found」。

可能是這些原因:
  • 目錄的寫入權限不足。
  • SELinux 的權限沒開。
  • server_args 沒有加上 -c 參數,允許上傳不存在的檔案。
  • 沒有加上 -c 參數的話,預設只能寫入到已經存在的同名檔案,也就是我們要上傳一個 upload.txt 檔案,必須在 TFTP Server 裡已經有一個 upload.txt 檔案,如果不存在的話,就會上傳失敗。

為什麼 TFTP Server 啟動不起來?


別忘了我們是以 Super Daemon 模式執行,檢查一下 xinetd 的 tftp 設定檔,再重新啟動 xinetd。



參考資料

圖片來源
  • https://www.flickr.com/photos/14284621@N06
  • http://www.58pic.com/tupian/manglu.html

更新紀錄
  • 2016/09/06 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

0 意見 :

張貼留言