FreeBSD 使用 vsftpd 的亂碼問題

這是一個困擾我已久的問題,使用 FileZilla 去連 ftp 時偶爾就會跑出亂碼來。明明 FreeBSD, vsftpd, FileZilla 三者都有支援 utf8 的編碼,但就不知道為什麼還會出這種問題。其實我一度以為是 vsftpd 太機車了所以跟別人格格不入,但這單純只是我的猜測而已。

以前都是在 FileZilla 的站台設定裡面強制使用 utf8 來解決這個問題,但是昨天在幫別人測試 ftp 時,卻發現他們家的 vsftpd 不需要強制使用 utf8,FileZilla就可以正常的偵測到要使用 utf8 !發現這個情況以後我開始找原因,首先看看是不是設定檔哪裡沒設定好,但卻發現他用的設定檔裡面也沒有什麼特別不一樣的,跟我用的差不多。難不成是 vsftpd 偏心嗎?在 CentOS 上面就乖乖的開啟 utf8 ,在 FreeBSD 上就搗亂。

連上朋友的 ftp 以後,可以看見他的 feat 回應是:

然後這是我的:

為什麼硬生生的少了最後的 utf8 啊!?為了這個問題,我去Google了半天都找不到原因,看起來也沒什麼人遇到類似問題。心情非常不愉快,所以就跑去看 vsftpd 的原始碼到底是怎麼回事。

首先就從 feat 的部份查起,feat 指令的回應是在 features.c 裡面,可以看到下列程式碼:

OK,看樣子 tunable_convert_charset_enable 這個變數決定了 feat 裡面有沒有包含 utf8。接著就查這個變數的底,看到底怎麼來的。在 parseconf.c 裡面看到這行:

哦,原來要在設定檔裡面設置 convert_charset_enable=1 就可以了。

設定好以後再試一次看看,還是沒有 -ㄦ- …繼續翻 code 。

接著在 main.c 裡面看到這個:

這下總算抓到了,原來要在設定檔裡面同時存在著 local_charset 與 convert_charset_enable 才可以。最後在 vsftpd.conf 裡增加下面這兩行就搞定了:

雖然問題解決了很高興,但這過程還真是曲折啊….

更新 vsftpd 2.3.5 注意事項

使用vsftpd這麼久, 已經不是第一次更新完就不正常運作了, 但畢竟就是看上他強調的安全性, 也只能接受這一些些不便.

第一個問題, FileZilla連線時出現錯誤訊息:

翻了一下Change log, 兇手就是這一項:

說是因為安全性問題, 所以當使用chroot功能時, 根目錄不可有寫入的權限. 所以網路上有些人就真的把寫入權限拿掉了, 但是如果ftp是給許多人使用的, 若他們沒辦法上傳檔案到自己的根目錄, 那會被抱怨到翻掉吧…

所以我的解法是安裝vsftpd-ext, 然後在vsftpd.conf裡加上這一行:

在 vsftpd 3 版以後, 不需要安裝 ext 的版本了, 但設定名稱有點不同:

第二個問題, FileZilla使用SSL連線時出現錯誤:

修改vsftpd.conf, 加上這一行:

附註1:
在FreeBSD, vsftpd-ext似乎沒有正確的讀取到原本的設定檔, FileZilla出現錯誤訊息:

只好自己修一下rc script, 修改 /usr/local/etc/rc.d/vsftpd, 原本的內容:

加上一行, 順序要對: