映射內網ftp服務器到公網報錯問題解決


這兩天公司測試環境有個需求要讓合作方通過ftp推送數據,一般內網環境是不會對公網開放ftp服務的,但是因為是臨時需求就幫着搭了ftp服務,並且做了公網映射。ftp服務搭好之后在內網訪問正常,但是在公網訪問出現可以登錄無法傳輸數據。報錯如下:

root># ftp 111.13.101.208 22220 Connected to 111.13.101.208 (111.13.101.208). 220 (vsFTPd 2.2.2) Name (111.13.101.208:root): user1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,1,180,184,171). ftp: connect: Connection timed out ftp> put 1.txt local: 1.txt remote: 1.txt 227 Entering Passive Mode (192,168,1,180,182,129). ftp: connect: Connection timed out 

在網上查了說是ftp被動模式造成的,可以使用passive命令來開啟或者關閉被動模式。但由於我這里是通過出口設備映射到公網,所以被動模式更符合需求,使用passive並不能解決問題。另外上面小括號里的(192,168,1,180,182,129)這一串字符搞的我很懵逼,這里明顯應該是IP+PORT為什么是這個樣子?網上查了下,最后兩段是10進制端口轉換成16進制拆分開轉換成10進制,(lll¬ω¬)  拿上面的舉個例子:

182--> 0xb6 #10轉16 129-->0x81  #10轉16 0xb681==46721 #16轉10

關於被動模式的開啟方法在服務器端修改了/etc/vsftpd/vsftpd.conf文件:

root># cat /etc/vsftpd/vsftpd.conf  | grep -v "^#" anonymous_enable=NO local_enable=YES write_enable=YES local_umask=000 dirmessage_enable=YES xferlog_enable=YES xferlog_std_format=YES ascii_upload_enable=YES ascii_download_enable=YES chroot_local_user=YES listen=YES listen_port=22220 local_root=/home/user1 #想指定用戶訪問目錄時可用此項來設置 pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES userlist_deny=NO

#以上為初始vsftp配置,下面是開啟被動模式參數 pasv_enable=YES pasv_min_port=22221 pasv_max_port=22222

設置完成后重啟服務,然后再次嘗試訪問:

ftp> ls 227 Entering Passive Mode (192,168,1,180,56,205). ftp: connect: Connection timed out ftp> ls 227 Entering Passive Mode (192,168,1,180,56,206). ftp: connect: Connection timed out ftp> ls 227 Entering Passive Mode (192,168,1,180,56,205). ftp: connect: Connection timed out ftp> bye 221 Goodbye.

還是出現報錯,但是端口好像已經變成服務端設置的參數了。另外在使用內網機器直接通過公網IP訪問ftp服務也出現報錯,錯誤為:

425 Security: Bad ip connecting

然后在服務器配置文件中添加了如下參數,並重啟服務器:

# vi /etc/vsftpd/vsftpd.conf 添加:pasv_promiscuous=yes #此選項激活時,將關閉PASV模式的安全檢查,默認為NO # service vsftpd restart

內網通過公網IP訪問ftp可以正常傳輸數據,而使用外網設備依然報錯,后來注意到報錯中(192,168,1,180,56,205)這里的地址為內網服務器的IP,外網設備發起連接的地址應該是映射的公網IP(111.13.101.208),很顯然在ftp連接建立之后,服務器返回了自己真實的IP給客戶端,但是客戶端無法通過這個私有IP(192.168.1.180)發起數據傳輸請求,所以導致timeout。然后在網上找到了這樣一個參數:

pasv_address  #回傳給客戶端的IP
# vi /etc/vsftpd/vsftpd.conf 添加:pasv_address=111.13.101.208 #這里返回映射的公網IP給客戶端
# service vsftpd restart

然后再進行訪問發現數據可以正常傳輸,問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM