1. 程式人生 > >Vsftp安裝及配置主動模式/被動模式

Vsftp安裝及配置主動模式/被動模式

 第一章、前言

FTP的主動模式(active mode)和被動模式(passive mode)

大多數的TCP服務是使用單個的連線,一般是客戶向伺服器的一個周知埠發起連線,然後使用這個連線進行通訊。
但是,FTP協議卻有所不同,它使用雙向的多個連線,而且使用的埠很難預計。一般,FTP連線包括:
一個控制連線 (control connection)
這個連線用於傳遞客戶端的命令和伺服器端對命令的響應。它使用伺服器的21埠,生存期是整個FTP會話時間。
幾個資料連線 (data connection)
這些連線用於傳輸檔案和其它資料,例如:目錄列表等。這種連線在需要資料傳輸時建立,而一旦資料傳輸完畢就關閉,每次使用的埠也不一定相同。
而且,資料連線既可能是客戶端發起的,也可能是伺服器端發起的。

在FTP協議中,控制連線使用周知埠21 ,因此使用ISA的IP PACKET FILTER就可以這種連線進行很好的安全保護。
相反,資料傳輸連線的目的埠通常實現無法知道,因此處理這樣的埠轉發非常困難。
FTP協議使用一個標準的埠21作為ftp
-data埠,但是這個埠只用於連線的源地址是伺服器端的情況,在這個埠上根本就沒有監聽程序。 FTP的資料連線和控制連線的方向一般是相反的,也就是說,是伺服器向客戶端發起一個用於資料傳輸的連線。 連線的埠是由伺服器端和客戶端協商確定的。FTP協議的這個特徵對ISA 轉發以及防火牆和NAT的配置增加了很多困難。 除此之外,還有另外一種FTP模式,叫做被動模式 (passive mod)。在這種模式下,資料連線是由客戶程式發起的,和剛才討論過的模式(我們可以叫做主動模式 )相反。 是否採取被動模式取決於客戶程式,在ftp命令列中使用passive命令就可以關閉/開啟被動模式。

第二章、安裝vsftp

1.關閉防火牆

[[email protected] ~]# iptables -L -n  #檢視當前防火牆狀態,及啟用規則,當前機器防火牆規則為iptables預設規則
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     icmp --  0.0.0.0/0            0.0
.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination [[email protected] ~]# service iptables save #如果當前機器有其他iptables規則建議先保留 iptables:將防火牆規則儲存到 /etc/sysconfig/iptables: [確定] #規則保留至/etc/sysconfig/iptables檔案中 [[email protected] ~]# service iptables stop #關閉防火牆 iptables:將鏈設定為政策 ACCEPT:filter [確定] iptables:清除防火牆規則: [確定] iptables:正在解除安裝模組: [確定] [[email protected] ~]# iptables -L -n #確認當前防火牆規則 Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

2.安裝vsftp及配置vsftp被動模式(預設為被動模式)

[[email protected] ~]# yum install vsftpd -y
[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf 
[[email protected] ~]# egrep -v "^#|^$" /etc/vsftpd/vsftpd.conf #除了添加註釋選項,未註釋選項均為預設值
anonymous_enable=NO  #禁止匿名使用者登入
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_list_enable=YES                         #現在使用者被鎖定在自己的home目錄中
chroot_list_file=/etc/vsftpd/chroot_list       #與上一選項相配合,被列入此檔案的使用者,在登入後將不能切換到自己目錄以外的其他目錄。此檔案需自己建立
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[[email protected] ~]# useradd  -M -d /data/ftp  -s /sbin/nologin ftp_user  #建立一個測試使用者,不允許登入
[[email protected] ~]# echo "123456"|passwd --stdin ftp_user                #設定密碼
更改使用者 ftp_user 的密碼 。
passwd: 所有的身份驗證令牌已經成功更新。

 [[email protected] ~]# mkdir /data/ftp -p                          #建立使用者家目錄
 [[email protected] ~]# chown ftp_user:ftp_user /data/ftp/          #授權

[[email protected] ~]# echo "ftp_user" >> /etc/vsftpd/chroot_list  #將使用者名稱新增至鎖定檔案中
[[email protected] ~]# service vsftpd start                        #啟動服務
為 vsftpd 啟動 vsftpd:                                    [確定]
[[email protected] ~]# chkconfig vsftpd on
測試是否可以登入,我這使用的是WinSCP客戶端工具

點選登入

 

#對ftp的增刪改查可以自行測試,應該沒有問題

下面我們開啟防火牆,再次從新登陸ftp伺服器

 

可以看到由於防火牆的原因,現在已經無法連線到伺服器了,現在放行21埠
[[email protected] ~]# vim /etc/sysconfig/iptables  #參考22埠複製一行修改為21即可,如果在命令列下使用命令,記得規則一定要插入在REJECT  all  ... 這條之前,否則防火牆規則將不會生效
[[email protected]
-cache04 ~]# service iptables restart iptables:將鏈設定為政策 ACCEPT:filter [確定] iptables:清除防火牆規則: [確定] iptables:正在解除安裝模組: [確定] iptables:應用防火牆規則: [確定] [[email protected]-cache04 ~]# iptables -L -n
再次登入

 

 

 現在我們發現已經可以登入伺服器了,但是無法瀏覽資料,這是因為資料埠在被動模式下是一個隨機埠

問題分析:

主動模式 下,客戶連線 TCP/21,伺服器通過 TCP/20 連線客戶的隨機埠 
————這種情況下,通過狀態防火牆可以解決 iptables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
被動模式 下,客戶連線 TCP/21,客戶再通過其他埠連線伺服器的隨機埠
卡住的原因,是因為伺服器在被動模式下沒有開啟臨時埠讓 client 連過來,因此需要幾個條件
1、client 沒有防火牆時,用主動模式連線即可
2、server 沒有防火牆時,用被動模式即可
3、雙方都有防火牆時,vsftpd 設定被動模式高階口範圍,server 開啟那段範圍,client 用被動模式連線即可
4、載入 ip_conntrack_ftp 模組,使 server 支援 connection tracking,支援臨時打洞,client 用被動模式即可
5、server 使用 ip_conntrack_ftp、client 使用 ip_conntrack_ftp 和 ip_nat_ftp,支援臨時打洞和臨時 NAT 穿越打洞,雙方使用主動或被動模式均可

優點:不影響ftp配置;缺點:客戶會感覺到連線有些延遲。原因參見ip_conntract的實現原理
配置臨時"打洞",並重啟服務
[[email protected] ~]# grep -w IPTABLES_MODULES  /etc/sysconfig/iptables-config  #修改此配置,新增兩個模組
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
[[email protected]-cache04 ~]# service iptables restart
iptables:將鏈設定為政策 ACCEPT:filter [確定]
iptables:清除防火牆規則: [確定]
iptables:正在解除安裝模組: [確定]
iptables:應用防火牆規則: [確定]
iptables:載入額外模組:ip_nat_ftp ip_conntrack_ftp [確定]   #可以看到,兩個模組已經載入
重新登入

已經沒有問題了

三、配置服務為主動模式

[[email protected] ~]# tail -1 /etc/vsftpd/vsftpd.conf  
pasv_enable=NO   #關閉pasv模式,啟動主動模式
[[email protected]-cache04 ~]# /etc/init.d/vsftpd restart
關閉 vsftpd:                                              [確定]
為 vsftpd 啟動 vsftpd:                                    [確定]
重啟後,再次登入

 

可以看到已經連線伺服器,但是無法瀏覽資料,現在我們先允許20埠可以訪問,步驟參考21埠即可,重啟iptabls後重啟訪問

可以看到還是沒有許可權瀏覽資料

問題分析:參考此連結   https://www.cnblogs.com/tdalcn/p/6940147.html

驗證問題:

[[email protected] ~]# ftp 192.168.1.103            #另外一臺Linux客戶端
Connected to 192.168.1.103 (192.168.1.103).
220 (vsFTPd 2.2.2)
Name (192.168.1.103:root): test_user        #按提示輸入賬號密碼
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls                                     #瀏覽資料,與客戶端工具相同,沒有許可權瀏覽
550 Permission denied.
Passive mode refused.
ftp> passive                                #關閉客戶端的pasv
Passive mode off.
ftp> ls                                     #再次瀏覽,可以正常訪問了
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 501      501             8 Nov 15 11:23 新建檔案
226 Directory send OK.

現在我們可以看到,由於service端關閉了pasv模式,但是client端預設還是pasv模式導致無法正常瀏覽資料,客戶端需要關閉pasv模式改為port模式才能正常訪問

解決:客戶端加入相關引數,在連線時關閉pasv

命令列下:

[[email protected] ~]# ftp -A 192.168.1.103
Connected to 192.168.1.103 (192.168.1.103).
220 (vsFTPd 2.2.2)
Name (192.168.1.103:root): test_user
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls                                   #直接可以訪問了
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 501      501             8 Nov 15 11:23 新建檔案
226 Directory send OK.

客戶端:

點選高階

點選連線,關閉被動模式選項

選擇儲存

再次訪問

沒有問題

總結:

下面的圖表會幫助管理員們記住每種FTP方式是怎樣工作的:
  主動FTP:
     命令連線:客戶端 >1023埠 -> 伺服器 21埠
     資料連線:客戶端 >1023埠 <- 伺服器 20埠 
  被動FTP:
     命令連線:客戶端 >1023埠 -> 伺服器 21埠
     資料連線:客戶端 >1023埠 -> 伺服器 >1023埠 
  下面是主動與被動FTP優缺點的簡要總結:   主動FTP對FTP伺服器的管理有利,但對客戶端的管理不利。因為FTP伺服器企圖與客戶端的高位隨機埠建立連線,而這個埠很有可能被客戶端的防火牆阻塞掉。被動FTP對FTP客戶端的管理有利,但對伺服器端的管理不利。因為客戶端要與伺服器端建立兩個連線,其中一個連到一個高位隨機埠,而這個埠很有可能被伺服器端的防火牆阻塞掉。   幸運的是,有折衷的辦法。既然FTP伺服器的管理員需要他們的伺服器有最多的客戶連線,那麼必須得支援被動FTP。我們可以通過為FTP伺服器指定一個有限的埠範圍來減小伺服器高位埠的暴露。這樣,不在這個範圍的任何埠會被伺服器的防火牆阻塞。雖然這沒有消除所有針對伺服器的危險,但它大大減少了危險

四、OUTPUT預設策略為DROP時配置ftp服務

可以看到,之前的iptables的OUTPUT鏈預設策略是ACCEPT  (其實INPUT鏈預設也是ACCEPT,但是預設最後一條規則--reject-with icmp-host-prohibited 表示拒絕所有其他不符合任何一條規則的資料包)

1.主動模式:

先新增OUTPUT允許22埠(或者自定義的ssh連結埠),否則當預設策略改變時ssh無法登陸,如果機器在機房那就只能通知機房了....

[[email protected] ~]# cat /etc/sysconfig/iptables  
-A OUTPUT -p tcp --sport 22 -j ACCEPT                #放行22埠
[[email protected]-cache04 ~]# service iptables restart     #重啟生效
[[email protected]-cache04 ~]# iptables -L -n -v            #使用-v引數,檢視規則是否匹配
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
......
Chain OUTPUT (policy DROP 4 packets, 240 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    9  1444 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:22         #這邊可以看到已經匹配到資料包了,沒有問題
[[email protected]-cache04 ~]# iptables -P OUTPUT DROP              #當上一步驟沒有問題時,我們再修改預設策略為DROP

使用客戶端工具進行訪問

 

 可以看到登入失敗,下面我們放行ftp21 20埠,參照22,步驟省略,再次訪問

 

可以正常訪問

2.被動模式:(由於被動模式下資料埠是隨機的,所以我們需要為FTP伺服器指定一個有限的埠範圍,在防火牆上放行這段埠即可)

修改模式為被動模式,並制定資料埠

[[email protected] ~]# tail -3 /etc/vsftpd/vsftpd.conf   #修改或新增以下三行,我們定義隨機埠為7000~8000之間
pasv_enable=YES
pasv_min_port=7000
pasv_max_port=8000
[[email protected]-cache04 ~]# /etc/init.d/vsftpd restart        #重啟vsftp服務
[[email protected]-cache04 ~]# cat  /etc/sysconfig/iptables      #修改防火牆規則,新增INPUT和OUTPUT對7000~8000埠放行資料
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp --dport 7000:8000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp --sport 21 -j ACCEPT
-A OUTPUT -p tcp --sport 7000:8000 -j ACCEPT
COMMIT
[[email protected]-cache04 ~]# iptables -L -n

 修改客戶端訪問模式,進行訪問

 

 

可以正常訪問,至此,ftp相關配置全部完成!