FTP資料埠連線
FTP基於TCP,可以配置SSL,此時便可成為FTPS。同於HTTP配置SSL後協議名變為HTTPS。
但FTP互動通常會使用兩個通道。命令通道與資料通道。
命令通道的建連:
- 常說的FTP埠一般指命令通道的埠,命令通道的監聽是在FTP服務啟動的時候開始監聽。
- FTP連線的發起,由客戶端主動發起,先建立TCP三次握手。
- 如果是配置SSL/TLS。需要客戶端在SSL握手前傳送
AUTH TLS
,服務端也會從TCP明文通道回覆234 AUTH
。(‘234’ 是FTP服務端響應 的狀態碼。) - 之後客戶端才會發起SSL握手,建立加密通道後,再進行其他命令互動,進行一些設定,使用者登入。
- 再通過一些命令查詢檔案列表,傳輸檔案。而檔案列表以及檔案的資料流,並不是通過命令通道進行輸入輸出。這些資料需要通過資料通道來傳輸。
資料通道
以下是一段點選ftp客戶端上顯示的資料夾(tem),進入一個新的FTP目錄的FTP命令的日誌
[16:34:45] [R] CWD tem
[16:34:45] [R] 250 Directory changed to /tem
[16:34:45] [R] PWD
[16:34:45] [R] 257 "/tem" is current directory.
[16:34:45] [R] PASV
[16:34:45] [R] 227 Entering Passive Mode (10,148,129,95,234,88)
[16:34:45] [R] 正在開啟資料連線 IP: 10.148.129.95 埠: 59992
[16:34:45] [R] MLSD
[16:34:45] [R] TLSv1.2 協商成功...
[16:34:45] [R] TLSv1.2 已加密會話正在使用密碼 ECDHE-RSA-AES256-GCM-SHA384 (256 位)
[16:34:45] [R] 150 File status okay; about to open data connection.
[16:34:45] [R] 226 Closing data connection.
執行CWD(改變工作目錄)和PWD(列印當前工作目錄)後,傳送了一個PASV命令,響應的報文中,帶了一個地址。而執行MLSD的時候進行了TLS協商。
MLSD 是獲取檔案列表的命令,具體解析如下:
Causes a list to be sent from the server to the passive DTP
獲取檔案列表之前傳送PASV。PASV則是建立資料通道的連線的一種方式。PASV命令返回了一個服務端的地址,FTP服務端在這個地址完成了一個監聽,然後等待客戶端去連,這種成為被動模式。
被動模式
如上述,客戶端傳送PASV,服務端隨機一個1024以上的埠監聽,然後將地址發給客戶端。有些FTP伺服器是可以配置隨機埠的範圍。但被動模式下這種隨機埠,可能被服務端防火牆遮蔽,造成FTP可以登入無法傳檔案。
其中FTP地址編碼,如下(apache FTP server的實現)。是將IP的’.‘替換成’,’,將埠(埠範圍1~0xffff,16位) 前8位的值用埠數字右移8位取出,放入第四個逗號與第五個逗號之間,而剩下的8位值與0xff做與運算取出拼在最後。上述埠為234,88 通過
(234<< 8) | 88
可得出埠號。(可以使用Python nodejs jjs等命令列進行快捷計算。)public static String encode(InetSocketAddress address) { InetAddress servAddr = address.getAddress(); int servPort = address.getPort(); return servAddr.getHostAddress().replace('.', ',') + ',' + (servPort >> 8) + ',' + (servPort & 0xFF); }
將FTP客戶端設定為主動模式後,進行上述操作,其日誌如下:
[17:18:52] [R] CWD /tem
[17:18:52] [R] 250 Directory changed to /tem
[17:18:52] [R] PWD
[17:18:52] [R] 257 "/tem" is current directory.
[17:18:52] [R] 正在偵聽埠: 13565,正在等待連線。
[17:18:52] [R] PORT 10,148,129,225,52,253
[17:18:52] [R] 200 Command PORT okay.
[17:18:52] [R] MLSD
[17:18:52] [R] TLSv1.2 協商成功...
[17:18:52] [R] TLSv1.2 已加密會話正在使用密碼 ECDHE-RSA-AES256-GCM-SHA384 (256 位)
[17:18:52] [R] 150 File status okay; about to open data connection.
[17:18:52] [R] 226 Closing data connection.
主動模式
主動模式,客戶端會在本地啟一個埠的監聽,然後將地址通過PORT 命令傳送給服務端,用來建立資料通道的連線。
據網上資料,客戶端與服務端命令通道建連 的本地的隨機埠數值(N),在主動模式下會監聽(N+1)的埠。
經過實測,發現是連線後的首次開啟資料埠監聽會監聽N + 1埠。再次需要開啟資料埠重新傳輸資料,本人並未得出明顯規律。
也就是說在這種情況下,客戶端會監聽相對未知 的埠,也會面臨被客戶端資料埠所在機器的防火牆遮蔽的問題。
NAT組網下,資料埠無法建連 的問題
-
本人對NAT組網認識比較淺粗,對這種場景不能做很細節的分析。
-
本人將NAT理解為在內網中,通過內網中已經接入外網的NAT路由器將內網地址轉成外網,來與外界通訊。
-
這種場景,內網與網外的地址並不是通的,FTP建立資料埠連線的時候,通過PASV或者PORT命令互動的地址存在報文中,當另一端去訪問那個地址時,就不能建立連線。這種情況下,需要在NAT路由器的地方使用應用閘道器 **ALG(Application Level Gateway)**將地址進行轉換,來建立連線。
設定資料埠的加密 PROT 命令
FTPS情況下並不一定安全,資料埠在命令通道加密的情況下,也可以走建立非加密通道。
涉及一個命令 PROT (protection )。這個命令容易與PORT命令混淆,這個命令用於設定資料通道的加密與非加密。
Data channel protection level.
引數有兩種 C和P。PROT C
PROT P
目前沒有找到文件對C和P的詳細解釋,從原始碼中,得出C的情況 ,啟資料埠監聽是普通TCP通道的監聽,而P的情況下會建立SSL通道的監聽。當發起連線的時候,需要SSL握手,再進行資料流傳輸。
相關文章
- FTP,FTP連線的辦法,配置方式FTP
- FTP與SBM連線方法FTP
- FTP,FTP該如何進行連線,如何配置FTP
- 檢測ftp連線問題FTP
- 我的postgresql資料庫報埠錯誤,連線失敗SQL資料庫
- 架設ftp,如何架設ftp?架設後如何連線?FTP
- 免費ftp站點,使用三款ftp工具連線免費ftp站點FTP
- Navicat 連線遠端資料庫及 SSH 預設埠號的修改資料庫
- Ubuntu下的FTP Servers搭建與連線UbuntuFTPServer
- 用Navicat連線資料庫-資料庫連線(MySQL演示)資料庫MySql
- 連線資料庫資料庫
- Linux中連線埠命令有哪些?Linux
- [20191112]oracle共享連線模式埠.txtOracle模式
- UltraEdit下ftp配置,UE遠端連線linuxFTPLinux
- 為什麼連線資料庫的埠號與配置檔案中的埠號不一致?資料庫
- python 連線 mongo 資料庫連線超時PythonGo資料庫
- 資料庫連線池-Druid資料庫連線池原始碼解析資料庫UI原始碼
- airtest資料線連線手機AI
- mysqli連線資料庫MySql資料庫
- Mongodb資料庫連線MongoDB資料庫
- Android 連線資料庫Android資料庫
- java連線資料庫Java資料庫
- 連線資料庫-mysql資料庫MySql
- jmeter連線資料庫JMeter資料庫
- Mybatis連線資料庫MyBatis資料庫
- JSP連線資料庫JS資料庫
- JDBC連線資料庫JDBC資料庫
- Flask連線資料庫Flask資料庫
- 《四 資料庫連線池原始碼》手寫資料庫連線池資料庫原始碼
- iis網站怎麼連線資料庫連線網站資料庫
- 使用commons-pool2實現FTP連線池FTP
- Linux基礎命令---lftp連線ftp伺服器LinuxFTP伺服器
- Linux檢視埠併發連線數Linux
- 獲取連線電腦的裝置的所有埠資訊
- python資料插入連線MySQL資料庫PythonMySql資料庫
- linux 資料庫localhostl連線成功127.0.0.1連線失敗Linux資料庫localhost127.0.0.1
- Kettle自定義資料庫連線型別連線HGDB資料庫型別
- 資料庫的連線數資料庫