第一章、前言
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.關閉防火牆
[root@mail ~]# 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 [root@mail ~]# service iptables save #如果當前機器有其他iptables規則建議先保留 iptables:將防火牆規則保存到 /etc/sysconfig/iptables: [確定] #規則保留至/etc/sysconfig/iptables文件中 [root@mail ~]# service iptables stop #關閉防火牆 iptables:將鏈設置為政策 ACCEPT:filter [確定] iptables:清除防火牆規則: [確定] iptables:正在卸載模塊: [確定] [root@mail ~]# 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被動模式(默認為被動模式)
[root@mail ~]# yum install vsftpd -y [root@mail ~]# vim /etc/vsftpd/vsftpd.conf [root@mail ~]# 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_local_user=YES !!!------> #是否將所有用戶限制在主目錄,默認為NO chroot_list_enable=YES #現在用戶被鎖定在自己的home目錄中 chroot_list_file=/etc/vsftpd/chroot_list #與上一選項相配合,在這個配置文件中添加用戶,每個用戶一行,則在這個文件里的用戶登錄ftp后,可以訪問上級目錄。不再的用戶只能訪問自己的home目錄
listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES [root@mail ~]# useradd -M -d /data/ftp -s /sbin/nologin ftp_user #創建一個測試用戶,不允許登錄 [root@mail ~]# echo "123456"|passwd --stdin ftp_user #設置密碼 更改用戶 ftp_user 的密碼 。 passwd: 所有的身份驗證令牌已經成功更新。
[root@mail ~]# mkdir /data/ftp -p #創建用戶家目錄
[root@mail ~]# chown ftp_user:ftp_user /data/ftp/ #授權
[root@mail ~]# echo "ftp_user" >> /etc/vsftpd/chroot_list #將用戶名添加至鎖定文件中 [root@mail ~]# service vsftpd start #啟動服務 為 vsftpd 啟動 vsftpd: [確定] [root@mail ~]# chkconfig vsftpd on
測試是否可以登錄,我這使用的是WinSCP客戶端工具
點擊登錄
#對ftp的增刪改查可以自行測試,應該沒有問題
下面我們打開防火牆,再次從新登陸ftp服務器
可以看到由於防火牆的原因,現在已經無法連接到服務器了,現在放行21端口
[root@eshop-cache04 ~]# vim /etc/sysconfig/iptables #參考22端口復制一行修改為21即可,如果在命令行下使用命令,記得規則一定要插入在REJECT all ... 這條之前,否則防火牆規則將不會生效
[root@eshop-cache04 ~]# service iptables restart iptables:將鏈設置為政策 ACCEPT:filter [確定] iptables:清除防火牆規則: [確定] iptables:正在卸載模塊: [確定] iptables:應用防火牆規則: [確定] [root@eshop-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的實現原理
配置臨時"打洞",並重啟服務
[root@eshop-cache04 ~]# grep -w IPTABLES_MODULES /etc/sysconfig/iptables-config #修改此配置,添加兩個模塊 IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp" [root@eshop-cache04 ~]# service iptables restart iptables:將鏈設置為政策 ACCEPT:filter [確定] iptables:清除防火牆規則: [確定] iptables:正在卸載模塊: [確定] iptables:應用防火牆規則: [確定] iptables:載入額外模塊:ip_nat_ftp ip_conntrack_ftp [確定] #可以看到,兩個模塊已經加載
重新登錄
已經沒有問題了
三、配置服務為主動模式
[root@eshop-cache04 ~]# tail -1 /etc/vsftpd/vsftpd.conf pasv_enable=NO #關閉pasv模式,啟動主動模式 [root@eshop-cache04 ~]# /etc/init.d/vsftpd restart 關閉 vsftpd: [確定] 為 vsftpd 啟動 vsftpd: [確定]
重啟后,再次登錄
可以看到已經連接服務器,但是無法瀏覽數據,現在我們先允許20端口可以訪問,步驟參考21端口即可,重啟iptabls后重啟訪問
可以看到還是沒有權限瀏覽數據
問題分析:參考此鏈接 https://www.cnblogs.com/tdalcn/p/6940147.html
驗證問題:
[root@mail ~]# 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
命令行下:
[root@mail ~]# 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無法登陸,如果機器在機房那就只能通知機房了....
[root@eshop-cache04 ~]# cat /etc/sysconfig/iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT #放行22端口 [root@eshop-cache04 ~]# service iptables restart #重啟生效 [root@eshop-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 #這邊可以看到已經匹配到數據包了,沒有問題 [root@eshop-cache04 ~]# iptables -P OUTPUT DROP #當上一步驟沒有問題時,我們再修改默認策略為DROP
使用客戶端工具進行訪問
可以看到登錄失敗,下面我們放行ftp21 20端口,參照22,步驟省略,再次訪問
可以正常訪問
2.被動模式:(由於被動模式下數據端口是隨機的,所以我們需要為FTP服務器指定一個有限的端口范圍,在防火牆上放行這段端口即可)
修改模式為被動模式,並制定數據端口
[root@eshop-cache04 ~]# tail -3 /etc/vsftpd/vsftpd.conf #修改或添加以下三行,我們定義隨機端口為7000~8000之間 pasv_enable=YES pasv_min_port=7000 pasv_max_port=8000 [root@eshop-cache04 ~]# /etc/init.d/vsftpd restart #重啟vsftp服務 [root@eshop-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 [root@eshop-cache04 ~]# iptables -L -n
修改客戶端訪問模式,進行訪問
可以正常訪問,至此,ftp相關配置全部完成!