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),掉封包、沒人收也是很合理的事。 - 半雙工傳輸
上傳跟下載,同時只能選一個。 - 不能顯示目錄資訊:
我們無法得知已經存了什麼東西,要嘛亂猜,要嘛事先搞清楚。 - 不驗證、不加密:
在這個資安風險大爆發的時代,這個玩笑可是開大了啊~~~
- 因為簡單又輕巧。
尤其適合像是嵌入式系統 (Embedded System)、單板電腦 ( Single Board Computer)、無線基地台 (Access Point) ... 等系統資源有限的設備,拿來救援、維護、更新 ... 等工作。
例如我在 市售 Wi-Fi 無線基地台改用 Tomato Firmware 的刷機步驟 的實作時,Asus RT-N16 使用的救援模式,背後的服務應該就是 TFTP Server。 - 因為不需要特別的設定跟參數。
Cisco 家的設備用它來備份、還原設定值,例如:不自量力のWeithenn - Catalyst 2950-IOS 版本升級。 - 因為方便與其他套件合作。
Maual Page 上提到的無磁碟開機 (Diskless Boot),如 Windows PXE Server (Preboot eXecution Environment)、DRBL 企鵝龍,會用它來派送開機時所要用到的檔案。
安裝服務
從 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。
參考資料
- PeteNetLive - CentOS – Install and Configure a TFTP Server
- Bo Yang - A Complete Guide For Installing TFTP Server In CentOS 7
圖片來源
- https://www.flickr.com/photos/14284621@N06
- http://www.58pic.com/tupian/manglu.html
更新紀錄
- 2016/09/06 撰文。
0 意見 :
張貼留言