2007-02-08

安全的 FTP Server: VSFTP

在 WL-500g 系統裡預設就有支援提供 FTP 檔案伺服器的服務,用的是笨蛋 FTPD (stupid-ftpd),記得一開始我們在設定韌體的時候就把它停掉了,而且也不讓它能夠跑起來。如果想要開設 FTP Server 讓人家能夠上傳或下載,還是另外換一套比較好用、比較安全的 FTPD 來使用,這裡使用的是 VSFTP (Very Secure FTP server,非常安全喔...Orz)。不過這個 VSFTPD 和一般獨立的服務不大一樣,它是一個 (x)inetd 的 daemon,需要透過 xinetd 來呼叫啟動,因此,我們要先裝這個服務:

ipkg install xinetd

裝好 (2.3.14) 之後,雖然有提示訊息要你去修改,等等再說,緊接著就裝 vsftpd:

ipkg install vsftpd

這兩個套件安裝應該都會很順利,裝完 vsftpd (2.0.1) 之後,去設定 ftp server 的設定檔,指定預設的根目錄:

nano opt/etc/vsftpd.conf

在最後一行加入以下設定:

secure_chroot_dir=/opt/public/ftp

上面這個目錄如果你的系統裡沒有,記得要手動建立:

mkdir -p /opt/public/ftp

接下來我們去處理 xinetd 剛剛的警告訊息。因為裝完 xinetd 預設也有一個 telnet 的 daemon,如果不處理,重開會跑兩個 telnet daemon,那樣事情就麻煩了! xinetd 所屬服務的啟動方法設定也很簡單,和現在系統啟動服務的方式相同(就是把執行檔放到某個目錄,像是 /opt/etc/init.d/ 目錄下的執行檔一樣),所以如果要停掉或啟動 xinetd 的所屬服務,也是到 xinetd 的設定目錄去處理。那個目錄是在 /opt/etc/xinetd.d/。先停掉(刪除)所有預設的服務:

rm /opt/etc/xinetd.d/telnetd
rm /opt/etc/xinetd.d/ftp-sensor

然後產生我們要啟動的 vsftpd:

nano /opt/etc/xinetd.d/vsftp

貼入下列的內容:

# description: The vsftpd FTP server serves FTP connections.
# it uses normal, unencrypted usernames and passwords for auth
service ftp
{
disable = no
socket_type = stream
user = admin
server = /opt/sbin/vsftpd
server_args = /opt/etc/vsftpd.conf
wait = no
nice = 10
only_from = 0.0.0.0/0
}

檔案做好,記得存檔並更改檔案權限:

chmod +x /opt/etc/xinetd.d/vsftp

產生一個空的 log 檔(目錄不在的話手動建立):

touch /opt/var/log/vsftpd.log

搞定,接下來手動把服務啟動。裝完 xinetd 時在 /opt/etc/init.d/ 也被產生了一個 S10xinetd 的執行檔,所有 xinetd 相關的服務都靠這個執行檔來啟動,因此要啟動你的 vsftpd,只要執行這個檔案:

/opt/etc/init.d/S10xinetd

切記,如果預設的 ftp server: stupid-ftpd 還在跑的話,因為兩個服務目前也是用到同一個 port (21),一定先砍掉 stupid-ftpd 的服務 (killall stupid-ftpd),再去執行上面的執行檔。服務跑起來以後(用 ps 檢查有沒有 xinetd 這個服務),如果你有裝 ftp client 程式 (像是 ncftp),你可以直接在本機試連 ftp server 會不會動作,如果沒有問題,你又想開放這個檔案服務讓外面的人可以連進來,那就又要去防火牆上打洞了。第一步先編輯防火牆設定的檔案:

nano /usr/local/sbin/post-firewall

裡面應該有 SSH 或是 HTTP 等等的紀錄了吧!同樣的,在下面這兩行中間的範圍內:

iptables -D INPUT -j DROP
......
iptables -A INPUT -j DROP

貼入以下幾行防火牆開 port 的設定,FTP 使用的是 port 21:

# Port 21 used for VSFTP server
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 21 -j DNAT --to-destination$4:21

存檔,一樣 記得 flush 到 flash 裡再重新開機:

flashfs save
flashfs commit
flashfs enable
reboot

這個時候你再用你安裝的 FTP client 軟體(像是 cuteftp 或 dos 視窗的 ftp 程式),直接 ftp 到你剛設定完的 FTP server 去(不要開 PASV 的被動模式好像比較快),上傳或下載測試一下(注意帳號的權限),這時候你應該就有了一台 FTP Server 囉!

參考文章:
vsftpd Installation and Setup

回應: 14

匿名 提到...

Installing and using the updated uClibc library on your Asus WL-500g router

http://www.nslu2-linux.org/wiki/FAQ/Optware-uClibcBuild

Abin 提到...

Oh! Thanks for your notification! :)

匿名 提到...

你好,我按照你所说安装了FTP Server:VSFTP,成功,但是无论怎么好像都没有RUN起来,用PS看的时候看不到xinetd在里面,请问一下这是什么原因呢?谢谢!

Abin 提到...

我剛剛檢查了一下,我現在的 FTP 有在跑,ps 看得到 /opt/sbin/xinetd 在執行中。你有試著 FTP 自己看看,能不能連進去嗎?
不然,再執行一次 /opt/etc/init.d/S10xinetd 看看,確認 ps 裡面有沒有,如果沒有 Process、不能連、也沒有錯誤訊息,那請您重新安裝以上步驟。

匿名 提到...

当我用$ipkg install vsftpd时,出现如下结果是否正确?
downloading http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable/vsftpd_2.0.5-1_mipsel.ipk
configuring vsftpd
you'll need to add line like
echo"ftp stream tcp nowait root /opt/sbin/vsftpd /opt/etc/vsftpd.conf" >> /etc/inetd.conf
to your /unslung/rc.xinetd file --see the wiki at http://www.nslu2-linux.org for more info
mkdir:cannot create directory '/usr/share/':read-only file system
我照他的做啦,但是结果不是RUN不起来!!

立人 提到...

請問 abin sir,目前所有設定均照您所說明之方式架設完畢,功能正常且已執行數日,非常感謝!

但今天發現以 FTP 方式上傳之檔案時間與現在時間相差8小時 ? 又以 Web 方式登入WL-500g檢查時間卻是正常時間, 請問要如何修正時區差異?

謝謝!

artyaya. 提到...

abin sir, 請教如何設置vsftpd才能限制下載速度和每ip線程數?我只想限制下載速率但不限制上傳速率。

Abin 提到...

To 立人 & artyaya. :

對 vsftpd 我所知有限,我知道的都在筆記裡了。你們的問題我不知道怎麼處理,有進一步的設定狀況請參閱鳥哥的這篇文章,或者是官方的使用手冊,如果這兩個地方沒有提到我也沒轍啦。

krtc5198 提到...

版大您好!小弟家裡也有一台與您一樣的機子,而且目前正常使用中。近日在網路上發現新版韌體已經更新到1.9.2.7-9(-10不支援這台舊機),而小弟家中這台的韌體仍然是使用1.9.2.7-7f。手癢之下決定更新韌體,更新後卻發現一個問題,原來正常使用中的FTP Server卻無法使用(一般連線正常)。而且這個現象9~7g都一樣(FTP Server無法使用)。這會是什麼原因呢(我不會改機,所以都只更換韌體而已)?

krtc5198 提到...

補充一下,現在已經又改回原本使用的7f版,只是還是很想用9版,因為這個版本可以限制傳輸速度。(我是使用16G的隨身碟當儲存碟,目前(7f版)使用一切都正常)。

krtc5198 提到...

版大您好!小弟有個請求,可以寫篇文章敎我在1.9.2.7-9的版本裡,該如何設定才可以正常使用FTP Server及Samba。(直接設定韌體,小弟我對改機實在不懂)

Abin 提到...

To krtc5198:
這兩天我機器出問題,終於去換了最新的 1.9.2.7-9 韌體,新的韌體變動還挺大的,我想你更新前應該也沒看韌體的 change list 吧!
仔細看從 1.9.2.7-9 開始,FTP daemon 已經換成 vsftp,而 samba 也更新內建了,作者是說,「有做簡單的 Web Interface」整合,換句話說,應該可以在 Web 管理介面直接調用,不用辛苦去 Hack。當然,他的介面很陽春, .conf 可能還是要修改一下才能合用。你可以參考我筆記 LinkStation for vsftp 和 samba 的相關文章,啟動服務後再調整。
最後,我的 wl-500g 差不多要功能身退了,之前試過的經驗要跑其他服務都很吃力,所以我也懶得在上面跑啥功能,大多交給 LinkStation 了,所以除非我太閒有去改啥東西作實驗,不然不會再有這類新的「筆記」了。(我不是寫教學文的,請參考這篇文章

lumenser 提到...

Hello Abin大
我照您的步驟做
但最後要用ftp連線時
連線軟體出現下列訊息
然後就斷線了
500 OOPS: vsftpd: not configured for standalone, must be started from inetd

請問一下是什麼原因呢
我的機器是WL-500GP V2
韌體版本是1.9.2.7-10
我已經把網頁裡的FTP server關掉了
謝謝

Abin 提到...

To lumenser:
你發問的上篇留言、我的回覆中已經說得很清楚了,我的 500G 已經只當 router 用,FTP 功能已經沒在跑,而且你用 500GP、而且是新的韌體,已經內建 vsftp,因此不適用本篇教學文,請自行 google vsftp 的設定方式。

張貼留言

歡迎留言或發表意見,不過要理性不做人身攻擊。匿名的朋友得到回應的速度會比較慢喔~
發問相關的禮貌和規矩請先參考這篇文章,不當留言、和本文無關的回應可能會被直接刪除無視喔!