vsftpd上傳文件大小為0(主動模式) 主動模式與被動模式 ...
最近在搞VSFTPD+Nginx結合,但是發現上傳文件大小總是為0,
由於最開始在搞的時候不知道主動模式和被動模式到底是什麼鬼東西,所以遇到問題根本找不到根的原因,遇到問題只是亂搜,好像是解決了問題,但實際不然。
就像我們最開始的時候,來說下最開始瞎搞的情況吧:
環境:Linux+VSFTPD+FTPClient
想要實現一個,文件上傳到伺服器的功能,根據百度的VSFTPD搭建,步驟如下
1.安裝VSFTPD
2.VSFTPD把配置文件vsftpd.conf裡面的anonymous_enable=YES 改為anonymous_enable=NO
3.重啟服務 service vsftpd restart
然後呢,就是開始使用FTPClient開始上傳文件,但是,問題來了,根本上傳不了啊,上傳總是失敗,文件大小為0.....
接下來你們懂得,就是開始找百度亂搞一氣,認為所謂的可行的辦法就是把Linux防火牆關閉,然後在FtpClient上傳的代碼中添加如下代碼
ftp.enterLocalPassiveMode();
意思是開啟被動模式,別說,還真的可以了,但是這隻是表象,你的配置文件你真的知道配置了什麼??你到底幹了什麼?----- 還有,你把Linux防火牆開啟你看看還Ok不??肯定涼涼的!(而且生產環境下防火牆基本上不可能會關閉的)
好了,我們要開始解決問題了,一步一步的跟我正確的配置(我們以主動模式為例)
那麼大概的說一下什麼主動和被動,具體詳情百度!!
主動模式(PORT)(Server->Client)
客戶端打開埠N(N為>1024的隨機埠)連接伺服器21埠建立命令通道;客戶端通過N+1埠與伺服器20埠建立數據傳輸通道。
被動模式(PASV)(Client->Server)
客戶端打開埠N(N為>1024的隨機埠)連接伺服器21埠建立命令通道(同上);客戶端通過N+1埠與伺服器>1024隨機埠建立數據傳輸通道,客戶端使用PASV命令。
問題解決步驟:
1.開放你的21埠可以直接按照你預設的22埠編寫,把22原封不動弄一行,然後把複製的22換成21即可(技巧:在22那行按esc,然後按yyp即可複製本行)
開放完你的21埠後記得重啟:service iptables restart
[root@rebirth vsftpd]# vim /etc/sysconfig/iptables
下麵的是我的防火牆配置,不需要跟我的全部一樣,只需要開啟你的21埠即可
# 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 ACCEPT [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 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 177 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1777 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
2.首先我們打開vsftpd.conf的配置文件(在你安裝的路徑) vim vsftpd.conf
3.在你的vsftpd.conf裡面開啟主動模式的配置:(如果沒有則自己加上去這段命令 一般會有:connect_from_port_20=YES )
connect_from_port_20=YES 主動模式
pasv_enable=NO 關閉被動模式
4..重啟vsftpd服務 service vsftpd restart
這時候我們在重新執行我們上傳,如果通過FtpClient的話,不要添加開啟被動的那句代碼:
ftp.enterLocalPassiveMode();
如果此時你的文件直接完整的上傳成了那麼直接恭喜你!你的問題得以解決!下麵的內容你可以選擇跳過咯!
如果此時你的文件大小還是為0的話,那麼恭喜你,你跟我一樣,我們繼續搞!
原因是:我們本地的防火牆原因,防火牆的入站規則阻礙了我們
解決方案:
1.最簡單,最直接的就是直接把本地的防火牆全部關閉
再來試試吧!ok完美解決!
2.如果你不想全部關閉防火牆(我也一樣)那麼就要稍微配置一些高級的防火牆規則了!跟我來
接下來右鍵入站規則,點擊新建入站規則(由於截圖快捷鍵一按按鈕就消失,導圖不全諒解哈!)
直接下一步即可
下一步很重要,你可以直接選擇預設的配置,任何ip都可以
當然,你是一位非常重視安全的決策者,那麼你可以這麼做
你可以選擇指定的IP可以通過此規則,例如本次我們配置的vsftpd的虛擬機所在的IP!當然你也可以配置虛擬機所在的網段,由你自行決策!決策者
然後我們只需要確認下一步即可
預設下一步即可
好了,我們的配置結束了,如果你已經者卻的配置了,那麼來啟動你的程式來看下你的成果吧!
PS:
瞭解原理很重要喔!