201208231616VSFTP 安裝及設定
vsftpd is a GPL licensed FTP server for UNIX systems。是的,今天就來說說如何架設 FTP server (安裝環境於 CentOS6)。
要完成 FTP 的通訊要有兩個元件 FTP client 與 FTP Server, FTP client 的種類繁多,可以挑自己習慣或喜歡的來用
~但 CentOS6 上預設是沒安裝 FTP client的(至少我選的安裝模式是如此),那該怎麼裝呢?就輕鬆的使用 yum 的方式來安裝。
yum install ftp -y
----------------------------
既然這麼懶直接用 yum 來裝,那 FTP Server 也可以嗎?當然 Server 你也可以用「yum install vsftpd -y」,但我們用圖形化的安裝方式來說明
開始看圖說故事,點選「新增/移除軟體」
分類選 Servers -> FTP伺服器 -> 然後再右邊選「Very Secure FTP Daemon」->最後套用,就開始安裝了
上一個步驟只是安裝,並未開始執行,也未啟動為服務(service),所以下圖就是將他啟動為服務,當然你也可以用 service vsftpd start 。
這時可以從外部連進來了嗎? 當然不行......還要繼續開啟 FTP 所需要的連接埠,一般預設就 port 20 & 21 當然你也可以改成其他埠。
所以你必須依自己的需求修改 /etc/sysconfig/iptables 然後 /etc/init.d/iptables restart 重新啟動 iptables。
過了這麼多關,可以連進去 FTP Server 了吧....答案還是不行
因為你根本還沒開始執行 vsftpd.....直接到 /etc/init.d/vsftpd 去 start 嗎? 不!!!
先修改一些設定吧!
vsftp 的環境設定檔位於 /etc/vsftpd 目錄,主要設定檔為 /etc/vsftpd/vsftpd.conf
詳細的參數設定請參考 鳥哥的大作「http://linux.vbird.org/linux_server/0410vsftpd.php」
----------------------------------------------------------------------
我有使用的設定 (先備份預設的設定檔 vsftpd.conf sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd_org.conf) -- 20150210 updated
sudo vi /etc/vsftpd/vsftpd_org.conf
#anonymous_enable=YES # 允許匿名登入 FTP
anonymous_enable=NO # 不允許匿名登入 FTP
local_enable=YES # 允許本機使用者可以登入
write_enable=YES # 允許使用者可以寫入檔案
#idle_session_timeout=600 # 預設 600秒
idle_session_timeout=300 # idle 多久即斷線 300秒
data_connection_timeout=120 # 資料連線斷線時間
chroot_local_user=YES # 將使用者可瀏覽的目錄封鎖在自己的家目錄
chroot_list_enable=YES # 搭配下一個選項
#allow_writeable_chroot=YES
chroot_list_file=/etc/vsftpd/chroot_list # 在此檔案裡記錄哪些使用者可以「不受」chroot 限制,可以瀏覽非自己的家目錄
listen=YES # vsftpd 服務將以 standalone 獨立方式運作
pasv_enable=YES # 啟用 passive 傳送
use_localtime=YES # 使用本地(本機)的時間
connect_timeout=60 # 連線斷線時間
accept_timeout=60 #
max_per_ip=1 # 允許每個使用者的連線數,0為不限制
local_max_rate=1000000000 # 最大的傳輸速度,單位 Bytes
參數也可以參考:https://security.appspot.com/vsftpd/vsftpd_conf.html
**********
假設你的使用者不是全都可以利用 shell 登入到主機來,你可能會設定該使用者的 shell 為 /sbin/nologin 或自行取名 /bin/youcannotlogin (反正就是要他沒有對應的 shell 可以登入)
那在設定 vsftpd 時需要注意,那些用你自行取名的 shell (如 /bin/youcannotlogin) 的使用者可能會無法登入,因為 vsftpd 會參考 /etc/shells 裡的 shells
所以要把你自行取名的 shell 名稱給加入到 /etc/shells 去
sudo vi /etc/shells
或
su ; echo "/bin/youcannotlogin" >> /etc/shells
然後重新啟動 vsftpd
sudo service vsftpd restart
----------------------------------------------------------------------
依需求改好了,vsftpd 也執行了,可以從遠端連進來了吧~ 結果可能是你還會遇到下面的問題「500 OOPS: cannot change directory:/home/your_account」
這個問題是因為「SELinux」安全性的關係,你可以使用 「getsebool -a」觀看所有安全性的設定值 (需有管理者權限),然後用下方指令修改(讓使用者可以登入他的 home directory)
setsebool -P ftp_home_dir=1
service vsftpd restart
--------------------------------------------
QQ:如果可以登入、執行FTP命令~但無法上傳檔案到使用者的家目錄,得到「553 Could not create file.」錯誤
$ ftp sharess
Connected to sharess (140.112.77.22).
220 (vsFTPd 2.2.2)
Name (sharess:localuser): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put a
local: a remote: a
227 Entering Passive Mode (140,112,77,22,74,219).
553 Could not create file.
ftp> bye
狀況:使用者 ftpuser 可以正常用 SSH 登入,也有權限寫入檔案,但使用 ftp 就會產生 553 的錯誤
這情況是被 selinux 給擋了,你可以使用「getsebool -a | grep ftp 」來觀察 selinux 跟 FTP 有關之參數,而無法利用FTP上傳檔案,就是被「allow_ftpd_full_access」 給擋了
sudo setsebool -P allow_ftpd_full_access 1 來開啟他,1 或 on 都可以
是不是 vsftp 都必須開啟「allow_ftpd_full_access」~~~不是
這是因為我把特定使用者移到了非正常家目錄所在的位置,因而出現權限不足的問題
-------------------------------------------
PS:哪如果得到這樣的結果呢?「200 PORT command successful. Consider using PASV.」
這時候就要看你的 passive mode 是主動或被動,如果是主動式連線那表示你在 iptables 忘了開啟 Port:20,那如果是被動式~那就在 vsftpd.conf 加上 pasv_min_port=65400 與 pasv_max_port=65410 連後重新啟動 vsftpd。
Reference:
- http://linux.vbird.org/linux_server/0410vsftpd.php
- http://www.phys.nthu.edu.tw/~cc/QA/vsftpd.pdf 推薦看這篇了解 FTP 的運作
- http://120.105.184.250/cswang/thit/Linux/FTPD.htm
-----20150225 updated.--------------------------------------------------------------------
經過了上面的更新,已經可以使用一般的 FTP 軟體登入,但發現使用 CLI 的 FTP client 可以登入,卻無法正常存取,得到錯誤
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (140,111,5,60,28,145).
ftp: connect: 找不到通往該主機的路由路徑
ftp> pass
Passive mode off.
ftp> dir
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
而原本在 active 或 passive 傳輸模式已經設定「pasv_enable=YES」,怎麼還無法傳輸呢?
解決方式:
M1:修改 sudo vi /etc/vsftpd/vsftpd.conf
可以在原本「pasv_enable=YES」設定下增加兩行
pasv_min_port=5000
pasv_max_port=6000
指定 passive mode 傳輸所用的連接埠範圍由 5000 ~ 6000 之間(只要 PORT > 1024 範圍隨你設定囉)
sudo service vsftpd restart
M2:修改防火牆設定 (動態連接埠防火牆不一定要開啟,但經過上面 M1 步驟後,若還是無法正常存取,可以將你設定的 port 範圍打開)
修改 sudo vi /etc/sysconfig/iptables
增加
-A Firewall-Rules -m state --state NEW -m tcp -p tcp --dport 5000:6000 -j ACCEPT
重新啟動 iptables
sudo service iptables restart
這樣CLI FTP Client 應該就可以正常傳輸了。
~End
--------20151125--------------------------------------------------------------
限制某些使用者不能使用 vsftp
可以將要拒絕的使用者清單寫在「/etc/vsftpd/user_list」,一行一個帳號名稱
然後增加參數
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
然後重新啟動 vsftpd 就可以了