映射內網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