koshuchung
|
分享:
▼
x0
|
[Linux] [教學]VSFTP
FTP,file transfer protocol,這是檔案傳輸的通訊協議,也是一般最常用來傳送檔案的方式。讀者在使用RedHat9 的時候,可能會感受到ftp server 有一些改變:第一,就是ftp server 只剩下vsftp,原有的wuftp 等都沒放入 第二,就是vsftp 從XINETD 中獨立出來,並將設定檔從/etc/vsftpd.conf 之中移到/etc/vsftpd/vsftpd.conf。 為什麼做這樣的改變?可以想見的是vsftp 已有獨立運作的能力,不需要XINETD 來做更進一步的管控,並且類似sendmail、httpd、ssh、samba 等,將設定文件的放入/etc 下獨立的目錄。 FTP 分為兩類,一種為PORT FTP,也就是一般的FTP 另一類是PASVFTP,分述如下: PORT FTP 這是一般形式的FTP,首先會建立控制頻道,默認值是port 21,也就是跟 port 21 建立聯機,並透過此聯機下達指令。第二,由FTP server 端會建立數據 傳輸頻道,默認值為20,也就是跟port 20 建立聯機,並透過port 20 作數據的 傳輸。 PASV FTP 跟PORT FTP 類似,首先會建立控制頻道,默認值是port 21,也就是跟 port 21 建立聯機,並透過此聯機下達指令。第二,會由client 端做出數據傳輸 的請求,包括數據傳輸port 的數字。 這兩者的差異為何?PORT FTP 當中的數據傳輸port 是由FTP server 指定, 而PASV FTP 的數據傳輸port 是由FTP client 決定。通常我們使用PASV FTP, 是在有防火牆的環境之下,透過client 與server 的溝通,決定數據傳輸的port。 3.2.2 範例 3.2.1. 直接啟動VSFTP 服務 這個範例是套用RedHat 的預設範例,直接啟動vsftp。 [root@relay vsftpd]# /sbin/service vsftpd start Starting vsftpd for vsftpd: OK ] 3.2.2. 更換port 提供服務:將預設的port 21 更換為2121 為了安全,或是以port 來區隔不同的ftp 服務,我們可能會將ftp port 改為 21 之外的port,那麼,可參考以下步驟。 Step1. 修改/etc/vsftpd/vsftpd.conf 新增底下一行 listen_port=2121 Step2. 重新啟動vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 3.2.3. 特定使用者peter、john 不得變更目錄 使用者的預設目錄為/home/username,若是我們不希望使用者在ftp 時能夠 切換到上一層目錄/home,則可參考以下步驟。 Step1. 修改/etc/vsftpd/vsftpd.conf 將底下三行 #chroot_list_enable=YES # (default follows) #chroot_list_file=/etc/vsftpd.chroot_list 改為 chroot_list_enable=YES # (default follows) chroot_list_file=/etc/vsftpd/chroot_list Step2. 新增一個檔案: /etc/vsftpd/chroot_list 內容增加兩行: peter john Step3. 重新啟動vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 若是peter 欲切換到根目錄以外的目錄,則會出現以下警告: ftp> cd /home 550 Failed to change directory. 3.2.4. 取消anonymous 登入 若是讀者的主機不希望使用者匿名登入,則可參考以下步驟。 Step1. 修改/etc/vsftpd/vsftpd.conf 將 anonymous_enable=YES 改為 anonymous_enable=NO Step2. 重新啟動vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 3.2.5. 安排歡迎話語 若是我們希望使用者在登入時,能夠看到歡迎話語,可能包括對該主機的 說明,或是目錄的介紹,可參考以下步驟。 首先確定在/etc/vsftpd/vsftpd.conf 當中是否有底下這一行 dirmessage_enable=YES RedHat9 的默認值是有上面這行的。 接著,在各目錄之中,新增名為.message 的檔案,再這邊假設有一個使用 者test1,且此使用者的根目錄下有個目錄名為abc,那首先我們在/home/test1 之下新增.message,內容如下: Hello~ Welcome to the home directory This is for test only... 接著,在/home/test1/abc 的目錄下新增.message,內容如下: Welcome to abc's directory This is subdir... 那麼,當使用者test1 登入時,會看到以下訊息: 230- Hello~ Welcome to the home directory 230- 230- This is for test only... 230- 若是切換到abc 的目錄,則會出現以下訊息: 250- Welcome to abc's directory 250- 250- This is subdir ... 3.2.6. 對於每一個聯機,以獨立的process 來運作 一般啟動vsftp 時,我們只會看到一個名為vsftpd 的process 在運作,但若 是讀者希望每一個聯機,都能以獨立的process 來呈現,則可執行以下步驟。 Step1. 修改/etc/vsftpd/vsftpd.conf 新增底下一行 setproctitle_enable=YES Step2. 重新啟動vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 使用ps -ef 的指令,可以看告不同使用者聯機的情形,如下圖所示: [root@home vsftpd]# ps -ef|grep ftp root 2090 1 0 16:41 pts/0 00:00:00 vsftpd: LISTENER nobody 2120 2090 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244: connected test1 2122 2120 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244/test1: IDLE nobody 2124 2090 0 17:19 ? 00:00:00 vsftpd: 192.168.10.244: connected test2 2126 2124 0 17:19 ? 00:00:00 vsftpd: 192.168.10.244/test2: IDLE root 2129 1343 0 17:20 pts/0 00:00:00 grep ftp [root@home vsftpd]# 3.2.7. 限制傳輸檔案的速度:本機的使用者最高速度為200KBytes/s,匿名登入 者所能使用的最高速度為50KBytes/s Step1. 修改/etc/vsftpd/vsftpd.conf 新增底下兩行 anon_max_rate=50000 local_max_rate=200000 Step2. 重新啟動vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 在這邊速度的單位為Bytes/s,其中anon_max_rate 所限制的是匿名登入的 使用者,而local_max_rate 所限制的是本機的使用者。VSFTPD 對於速度的限 制,範圍大概在80%到120%之間,也就是我們限制最高速度為100KBytes/s, 但實際的速度可能在80KBytes/s 到120KBytes/s 之間,當然,若是頻寬不足 時,數值會低於此限制。 3.2.8. 針對不同的使用者限制不同的速度:假設test1 所能使用的最高速度為 250KBytes/s,test2 所能使用的最高速度為500KBytes/s。 Step1. 修改/etc/vsftpd/vsftpd.conf 新增底下一行 user_config_dir=/etc/vsftpd/userconf Step2. 新增一個目錄:/etc/vsftpd/userconf mkdir /etc/vsftpd/userconf Step3. 在/etc/vsftpd/userconf 之下新增一個名為test1 的檔案 內容增加一行: local_max_rate=250000 Step4. 在/etc/vsftpd/userconf 之下新增一個名為test2 的檔案 內容增加一行: local_max_rate=500000 Step5. 重新啟動vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 3.2.9-1. 建置一個防火牆下的ftp server,使用PORT FTP mode:預設的ftp port:21 以及ftp data port:20 啟動VSFTPD 之後執行以下兩行指令,只允許port 21 以及port 20 開放, 其它關閉。 iptables -A INPUT -p tcp -m multiport --dport 21,20 -j ACCEPT iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset 3.2.9-2. 建置一個防火牆下的ftp server,使用PORT FTP mode:ftp port:2121 以及ftp data port:2020 Step1. 執行以下兩行指令,只允許port 2121 以及port 2020 開放,其它關閉。 iptables -A INPUT -p tcp -m multiport --dport 2121,2020 -j ACCEPT iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset Step2. 修改/etc/vsftpd/vsftpd.conf 新增底下兩行 listen_port=2121 ftp_data_port=2020 Step3. 重新啟動vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 在這邊要注意,8、9 兩個例子中,ftp client(如cuteftp)的聯機方式不能 夠選擇passive mode,否則無法建立數據的聯機。也就是讀者可以連上ftp server,但是執行ls、get 等等的指令時,便無法運作。 3.2.10. 建置一個防火牆下的ftp server,使用PASS FTP mode:ftp port:2121 以及ftp data port 從9981 到9986。 Step1. 執行以下兩行指令,只允許port 2121 以及port 9981-9990 開放,其它關 閉。 iptables -A INPUT -p tcp -m multiport --dport 2121,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990 -j ACCEPT iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset Step2. 修改/etc/vsftpd/vsftpd.conf 新增底下四行 listen_port=2121 pasv_enable=YES pasv_min_port=9981 pasv_max_port=9986 Step3. 重新啟動vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] 在這邊要注意,在10 這個例子中,ftp client(如cuteftp)的聯機方式必須 選擇passive mode,否則無法建立數據的聯機。也就是讀者可以連上ftp server,但是執行ls,get 等等的指令時,便無法運作。 8.2.11. 將vsftpd 與TCP_wrapper 結合 若是讀者希望直接在/etc/hosts.allow 之中定義允許或是拒絕的來源地址, 可執行以下步驟。這是簡易的防火牆設定。 Step1. 確定/etc/vsftpd/vsftpd.conf 之中tcp_wrappers 的設定為YES,如下圖所 示: tcp_wrappers=YES 這是RedHat9 的默認值,基本上不需修改。 Step2. 重新啟動vsftpd [root@home vsftpd]# /sbin/service vsftpd restart Shutting down vsftpd: OK ] Starting vsftpd for vsftpd: OK ] Step3. 設定/etc/hosts.allow,譬如提供111.22.33.4 以及10.1.1.1 到10.1.1.254 連 線,則可做下圖之設定: vsftpd : 111.22.33.4 10.1.1. : allow ALL : ALL : DENY 8.2.12. 將vsftpd 並入XINETD 若是讀者希望將vsftpd 並入XINETD 之中,也就是7.x 版的預設設定,那 麼讀者可以執行以下步驟。 Step1. 修改/etc/vsftpd/vsftpd.conf 將 listen=YES 改為 listen=NO Step2. 新增一個檔案: /etc/xinetd.d/vsftpd 內容如下: service vsftpd { disable = no socket_type = stream wait = no user = root server = /usr/sbin/vsftpd port = 21 log_on_success += PID HOST DURATION log_on_failure += HOST } Step3. 重新啟動xinetd [root@home vsftpd]# /sbin/service xinetd restart Stopping xinetd: OK ] Starting xinetd: OK ] 3.2.3 設定檔說明 在範例中,有些省略的設定可以在這邊找到,譬如聯機的總數、同一個位 址的聯機數、顯示檔案擁有者的名稱等等,希望讀者細讀後,可以做出最適合 自己的設定。 格式 vsftpd.conf 的內容非常單純,每一行即為一項設定。若是空白行或是開頭為#的一行, 將會被忽略。內容的格式只有一種,如下所示 option=value 要注意的是,等號兩邊不能加空白,不然是不正確的設定。 ===ascii 設定===================== ascii_download_enable 管控是否可用ASCII 模式下載。默認值為NO。 ascii_upload_enable 管控是否可用ASCII 模式上傳。默認值為NO。 ===個別使用者設定=================== chroot_list_enable 如果啟動這項功能,則所有的本機使用者登入均可進到根目錄之外的數據夾,除了列 在/etc/vsftpd.chroot_list 之中的使用者之外。默認值為NO。 userlist_enable 用法:YES/NO 若是啟動此功能,則會讀取/etc/vsftpd.user_list 當中的使用者名稱。此項功能可以在詢 問密碼前就出現失敗訊息,而不需要檢驗密碼的程序。默認值為關閉。 userlist_deny 用法:YES/NO 這個選項只有在userlist_enable 啟動時才會被檢驗。如果將這個選項設為YES,則在 /etc/vsftpd.user_list 中的使用者將無法登入 若設為NO , 則只有在 /etc/vsftpd.user_list 中的使用者才能登入。而且此項功能可以在詢問密碼前就出現錯誤 訊息,而不需要檢驗密碼的程序。 user_config_dir 定義個別使用者設定文件所在的目錄,例如定義user_config_dir=/etc/vsftpd/userconf, 且主機上有使用者test1,test2,那我們可以在user_config_dir 的目錄新增文件名為 test1 以及test2。若是test1 登入,則會讀取user_config_dir 下的test1 這個檔案內的設 定。默認值為無。 ===歡迎語設定===================== dirmessage_enable 如果啟動這個選項,使用者第一次進入一個目錄時,會檢查該目錄下是否有.message 這個檔案,若是有,則會出現此檔案的內容,通常這個檔案會放置歡迎話語,或是對 該目錄的說明。默認值為開啟。 banner_file 當使用者登入時,會顯示此設定所在的檔案內容,通常為歡迎話語或是說明。默認值 為無。 ftpd_banner 這邊可定義歡迎話語的字符串,相較於banner_file 是檔案的形式,而ftpd_banner 是字 串的格式。預設為無。 ===特殊安全設定==================== chroot_local_user 如果設定為YES,那麼所有的本機的使用者都可以切換到根目錄以外的數據夾。預設 值為NO。 hide_ids 如果啟動這項功能,所有檔案的擁有者與群組都為ftp,也就是使用者登入使用ls -al 之類的指令,所看到的檔案擁有者跟群組均為ftp。默認值為關閉。 ls_recurse_enable 若是啟動此功能,則允許登入者使用ls -R 這個指令。默認值為NO。 write_enable 用法:YES/NO 這個選項可以控制FTP 的指令是否允許更改file system,譬如STOR、DELE、 RNFR、RNTO、MKD、RMD、APPE 以及SITE。預設是關閉。 setproctitle_enable 用法:YES/NO 啟動這項功能,vsftpd 會將所有聯機的狀況已不同的process 呈現出來,換句話說,使 用ps -ef 這類的指令就可以看到聯機的狀態。默認值為關閉。 tcp_wrappers 用法:YES/NO 如果啟動,則會將vsftpd 與tcp wrapper 結合,也就是可以在/etc/hosts.allow 與 /etc/hosts.deny 中定義可聯機或是拒絕的來源地址。 pam_service_name 這邊定義PAM 所使用的名稱,預設為vsftpd。 secure_chroot_dir 這個選項必須指定一個空的數據夾且任何登入者都不能有寫入的權限,當vsftpd 不需 要file system 的權限時,就會將使用者限制在此數據夾中。默認值為/usr/share/empty ===紀錄文件設定===================== xferlog_enable 用法:YES/NO 如果啟動,上傳與下載的信息將被完整紀錄在底下xferlog_file 所定義的檔案中。預設 為開啟。 xferlog_file 這個選項可設定紀錄文件所在的位置,默認值為/var/log/vsftpd.log。 xferlog_std_format 如果啟動,則紀錄文件將會寫為xferlog 的標準格式,如同wu-ftpd 一般。默認值為關 閉。 ===逾時設定====================== accept_timeout 接受建立聯機的逾時設定,單位為秒。默認值為60。 connect_timeout 響應PORT 方式的數據聯機的逾時設定,單位為秒。默認值為60。 data_connection_timeout 建立數據聯機的逾時設定。默認值為300 秒。 idle_session_timeout 發呆的逾時設定,若是超出這時間沒有數據的傳送或是指令的輸入,則會強迫斷線, 單位為秒。默認值為300。 ===速率限制====================== anon_max_rate 匿名登入所能使用的最大傳輸速度,單位為每秒多少bytes,0 表示不限速度。默認值 為0。 local_max_rate 本機使用者所能使用的最大傳輸速度,單位為每秒多少bytes,0 表示不限速度。預設 值為0。 ===新增檔案權限設定================== anon_umask 匿名登入者新增檔案時的umask 數值。默認值為077。 file_open_mode 上傳檔案的權限,與chmod 所使用的數值相同。默認值為0666。 local_umask 本機登入者新增檔案時的umask 數值。默認值為077。 ===port 設定====================== connect_from_port_20 用法:YES/NO 若設為YES,則強迫ftp-data 的數據傳送使用port 20。默認值為YES。 ftp_data_port 設定ftp 數據聯機所使用的port。默認值為20。 listen_port FTP server 所使用的port。默認值為21。 pasv_max_port 建立資料聯機所可以使用port 範圍的上界,0 表示任意。默認值為0。 pasv_min_port 建立資料聯機所可以使用port 範圍的下界,0 表示任意。默認值為0。 ===其它======================== anon_root 使用匿名登入時,所登入的目錄。默認值為無。 local_enable 用法:YES/NO 啟動此功能則允許本機使用者登入。默認值為YES。 local_root 本機使用者登入時,將被更換到定義的目錄下。默認值為無。 text_userdb_names 用法:YES/NO 當使用者登入後使用ls -al 之類的指令查詢該檔案的管理權時,預設會出現擁有者的 UID,而不是該檔案擁有者的名稱。若是希望出現擁有者的名稱,則將此功能開啟。 默認值為NO。 pasv_enable 若是設為NO,則不允許使用PASV 的模式建立數據的聯機。默認值為開啟。 ===更換檔案所有權=================== chown_uploads 用法:YES/NO 若是啟動,所有匿名上傳數據的擁有者將被更換為chown_username 當中所設定的使 用者。這樣的選項對於安全及管理,是很有用的。默認值為NO。 chown_username 這裡可以定義當匿名登入者上傳檔案時,該檔案的擁有者將被置換的使用者名稱。預 設值為root。 ===guest 設定===================== guest_enable 用法:YES/NO 若是啟動這項功能,所有的非匿名登入者都視為guest。默認值為關閉。 guest_username 這裡將定義guest 的使用者名稱。默認值為ftp。 ===anonymous 設定================== anonymous_enable 用法:YES/NO 管控使否允許匿名登入,YES 為允許匿名登入,NO 為不允許。默認值為YES。 no_anon_password 若是啟動這項功能,則使用匿名登入時,不會詢問密碼。默認值為NO。 anon_mkdir_write_enable 用法:YES/NO 如果設為YES,匿名登入者會被允許新增目錄,當然,匿名使用者必須要有對上層目 錄的寫入權。默認值為NO。 anon_other_write_enable 用法:YES/NO 如果設為YES,匿名登入者會被允許更多於上傳與建立目錄之外的權限,譬如刪除或 是更名。默認值為NO。 anon_upload_enable 用法:YES/NO 如果設為YES,匿名登入者會被允許上傳目錄的權限,當然,匿名使用者必須要有對 上層目錄的寫入權。默認值為NO。 anon_world_readable_only 用法:YES/NO 如果設為YES,匿名登入者會被允許下載可閱讀的檔案。默認值為YES。 ftp_username 定義匿名登入的使用者名稱。默認值為ftp。 deny_email_enable 若是啟動這項功能,則必須提供一個檔案/etc/vsftpd.banner_emails,內容為email address。若是使用匿名登入,則會要求輸入email address,若輸入的email address 在 此檔案內,則不允許聯機。默認值為NO。 ===Standalone 選項================== listen 用法:YES/NO 若是啟動,則vsftpd 將會以獨立運作的方式執行,若是vsftpd 獨立執行,如RedHat9 的默認值,則必須啟動 若是vsftpd 包含在xinetd 之中,則必須關閉此功能,如 RedHat8。在RedHat9 的默認值為YES。 listen_address 若是vsftpd 使用standalone 的模式,可使用這個參數定義使用哪個IP address 提供這 項服務,若是主機上只有定義一個IP address,則此選項不需使用,若是有多個IP address,可定義在哪個IP address 上提供ftp 服務。若是不設定,則所有的IP address 均會提供此服務。默認值為無。 max_clients 若是vsftpd 使用standalone 的模式,可使用這個參數定義最大的總聯機數。超過這個 數目將會拒絕聯機,0 表示不限。默認值為0。 max_per_ip 若是vsftpd 使用standalone 的模式,可使用這個參數定義每個ip address 所可以聯機 的數目。超過這個數目將會拒絕聯機,0 表示不限。默認值為0。 ============================= 3.2.4 FTP 數字代碼的意義 110 重新啟動標記應答。 120 服務在多久時間內ready。 125 數據鏈路埠開啟,準備傳送。 150 文件狀態正常,開啟數據連接端口。 200 命令執行成功。 202 命令執行失敗。 211 系統狀態或是系統求助響應。 212 目錄的狀態。 213 文件的狀態。 214 求助的訊息。 215 名稱系統類型。 220 新的聯機服務ready。 221 服務的控制連接埠關閉,可以註銷。 225 數據連結開啟,但無傳輸動作。 226 關閉數據連接端口,請求的文件操作成功。 227 進入passive mode。 230 使用者登入。 250 請求的文件操作完成。 257 顯示目前的路徑名稱。 331 用戶名稱正確,需要密碼。 332 登入時需要賬號信息。 350 請求的操作需要進一部的命令。 421 無法提供服務,關閉控制連結。 425 無法開啟數據鏈路。 426 關閉聯機,終止傳輸。 450 請求的操作未執行。 451 命令終止:有本地的錯誤。 452 未執行命令:磁盤空間不足。 500 格式錯誤,無法識別命令。 501 參數語法錯誤。 502 命令執行失敗。 503 命令順序錯誤。 504 命令所接的參數不正確。 530 未登入。 532 儲存文件需要賬戶登入。 550 未執行請求的操作。 551 請求的命令終止,類型未知。 552 請求的文件終止,儲存位溢出。 553 未執行請求的的命令,名稱不正確
[ 此文章被andyz在2005-05-18 19:57重新編輯 ]
|