成人在线你懂的-成人在线免费小视频-成人在线免费网站-成人在线免费视频观看-日韩精品国产一区二区-日韩精品国产一区

掃一掃
關注微信公眾號

使用SSH進行FTP轉發
2005-11-25   

有關SSH,一個經常被問起的問題是“我怎樣才能使用端口轉發加強FTP安全?”。很不幸,你得到的回答一般非常簡短,讓你仍然無所適從。在標準FTP協議中,所有的數據都是明文傳輸的,因此網絡上可能存在的嗅探器是一個極大的威脅。使用嗅探器,攻擊者很容易獲得你的帳戶和密碼。而在SSH的數據傳輸過程中,所有的數據以密文的形式傳輸的,所以SSH的端口轉發功能能夠很好地保護的帳戶密碼。
本文詳細地解釋你能夠使用SSH和FTP做什么,不能做什么,以及其原因。這里有FTP本身的復雜性造成的問題。除此之外,防火墻和網絡地址轉換(Network Address Translation)也給我們制造了不少困難。因為現在防火墻和網絡地址轉換(Network Address Translation)已經廣泛存在了,因此我們將對這些情況進行詳細的討論。不過,由于網絡環境千差萬別,我們無法覆蓋所有可能出現的問題,這就需要你自己舉一反三了。
1.FTP協議簡介
為了便于后面的討論,我們首先簡要地討論一下FTP協議(如果對FTP協議已經有了比較深入的了解,你可以略過這一節)。大多數的TCP服務是使用單個的連接,一般是客戶向服務器的一個周知端口發起連接,然后使用這個連接進行通訊。但是,FTP協議卻有所不同,它使用雙向的多個連接,而且使用的端口很難預計。一般,FTP連接包括:
一個控制連接(control connection)
這個連接用于傳遞客戶端的命令和服務器端對命令的響應。它使用服務器的21端口,生存期是整個FTP會話時間。
幾個數據連接(data connection)
這些連接用于傳輸文件和其它數據,例如:目錄列表等。這種連接在需要數據傳輸時建立,而一旦數據傳輸完畢就關閉,每次使用的端口也不一定相同。而且,數據連接既可能是客戶端發起的,也可能是服務器端發起的。
下面,我們通過一個FTP客戶程序看一下控制連接。這里,我們需要使用debug模式(ftp -d)才能顯示客戶發出的FTP協議命令。在客戶程序的輸出信息中,這些協議命令是以--->開頭的,例如:
---> USER nixe0n
在命令發出之后,服務器會發出響應,響應信息以數字開頭,例如:
530 Login incorrect.
下面,我們和FTP服務器建立一個連接,使用用戶名nixe0n登錄,在會話過程中發出兩次目錄切換名,一次成功一次失敗,其中黑體是我們的輸入:
ftp -d ftp.linuxaid.com.cn
Connected to ftp.linuxaid.com.cn.
220 ftp.linuxaid.com.cn FTP server ready.
Name (ftp.linuxaid.com.cn:nixe0n): nixe0n
---> USER nixe0n
331 Password required for nixe0n.
Password:
---> PASS XXXX
230 User nixe0n logged in.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd one
---> CWD one
250 CWD command successful.
ftp> cd tmp
---> CWD tmp
550 tmp: No such file or directory.
ftp> bye
---> QUIT
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 398 bytes in 0 transfers.
221 Thank you for using the FTP service on ftp.linuxaid.com.cn.
在FTP協議中,控制連接使用周知端口21,因此使用SSH的標準端口轉發就可以這種連接進行很好的安全保護。相反,數據傳輸連接的目的端口通常實現無法知道,因此處理這樣的端口轉發非常困難。FTP協議使用一個標準的端口21作為ftp-data端口,但是這個端口只用于連接的源地址是服務器端的情況,在這個端口上根本就沒有監聽進程。FTP的數據連接和控制連接的方向一般是相反的,也就是說,是服務器向客戶端發起一個用于數據傳輸的連接。連接的端口是由服務器端和客戶端協商確定的。FTP協議的這個特征對SSH轉發以及防火墻和NAT的配置增加了很多困難。
除此之外,還有另外一種FTP模式,叫做被動模式(passive mod)。在這種模式下,數據連接是由客戶程序發起的,和剛才討論過的模式(我們可以叫做主動模式)相反。是否采取被動模式取決于客戶程序,在ftp命令行中使用passive命令就可以關閉/打開被動模式。
在了解了使用SSH轉發FTP連接的一些難點之后,我們將開始討論如何解決這些問題。
2.轉發控制連接
FTP的控制連接的一端是一個周知端口21,因此很容易通過SSH實現端口的轉發。通常,需要保護的FTP服務器上需要運行SSH服務,而且你需要在服務器上有一個合法帳戶以便通過SSH訪問FTP服務。
假設你已經登錄到一臺主機名為client的客戶主機,然后想通過安全的連接登錄到FTP服務器ftp.linuxaid.com.cn。要轉發FTP控制連接,首先要在client上運行一個SSH端口轉發命令:
[nixe0n@client nixe0n]ssh -L 2001:ftp.linuxaid.com.cn:21 ftp.linuxaid.com.cn
nixe0n@ftp.linuxaid.com.cn's password:
接著,就可以使用被轉發的端口登錄到ftp.linuxaid.com.cn:
[nixe0n@clinet nixe0n]ftp localhost 2001
Connected to localhost
220 ftp.linuxaid.com.cn FTP server ready.
Name:foo
Password:
230 User foo logged in.
ftp>
這里,我們需要注意兩個非常重要的問題:
在本地進行轉發,可能出現一些錯誤。
在確定轉發的目標時,建議不要使用localhost作為目標,因為有時使用這種地址可能出現一些莫名其妙的問題。假如在你的主機(client)上,有其它的網絡接口(例如:eth0),其地址為192.168.0.1,如果你想在本機上進行SSH進行FTP端口轉發:
[nixe0n@localhost nixe0n]$ssh -L 2001:localhost:21 localhost
nixe0n@localhost's password:
然后,使用ftp命令登錄到FTP服務器就可能出現一些錯誤:
[nixe0n@localhost nixe0n]ftp localhost 2001
Connected to localhost
220 localhost FTP server ready.
Name[localhost:nixe0n]:nixe0n
331 Password required for nixe0n
Password:
230 User nixe0n logged in
ftp>ls
200 PORT command successful.
425 Can't build data connection:Cannot assign requested address.
ftp>
出現這個問題是因為FTP服務器會試圖通過回環地址(lo:127.0.0.1)向client(eth0:192.168.0.1)發起連接造成的。本機的回環接口只能和本機的其它回環接口進行通訊,如果和其它的網絡接口(例如:eth0)通訊,就會返回"address not available"的錯誤。
客戶程序需要使用被動模式,被動模式對于解決NAT/防火墻造成的一些問題很有幫助。Linux系統的ftp命令在默認情況下使用這種模式。
3.FTP、防火墻和被動模式
前面我們講過,FTP協議的數據傳輸存在兩種模式:主動模式和被動模式。這兩種模式發起連接的方向截然相反,主動模式是從服務器端向客戶端發起;被動模式是客戶端向服務器端發起連接。但是如果服務器和客戶之間存在防火墻,主動模式經常會引起一些麻煩。設想,客戶位于防火墻之后,防火墻允許所有內部向外部的連接通過,但是對于外部向內部發起的連接卻存在很多限制。在這種情況下,客戶可以正常地和服務器建立控制連接,而如果使用主動模式,ls、put和get等數據傳輸命令就很難成功運行,因為防火墻會阻塞從服務器向客戶發起的數據傳輸連接。簡單包過濾防火墻把控制連接和數據傳輸連接完全分離開了,因此很難通過配置防火墻允許主動模式的FTP數據傳輸連接通過。如果防火墻允許ICMP或者TCP RST報文通過,客戶程序就會馬上返回connection refused錯誤信息;而如果防火墻只是做簡單的丟棄處理,會造成客戶程序掛起一段時間。
被動模式一般可以解決此類問題,因為在被動模式下,連接是由客戶端發起的餓。不過,這要看FTP服務器和客戶程序是否支持被動模式。命令行FTP客戶程序一般使用passive命令關/開被動模式。例如:
ftp>passive
Passive mode off
ftp>passive
Passive mode on
如果客戶程序不支持被動模式,它就會返回?Invaild command;如果客戶程序支持被動模式,而服務器不支持,就會返回"PASV:command not understood",PASV是一個FTP協議命令,使服務器進入到被動模式。
4.FTP和網絡地址轉換(Network Address Translation)
除了簡單包過濾防火墻之外,被動模式也可以解決使用網絡地址轉換(NAT)給FTP造成的一些問題。在轉發報文之前,進行網絡地址轉換的網關首先會改變報文的源地址和目的地址。網絡地址轉換能夠提高網絡的安全性,有助于解決IP地址資源不足問題。
4.1.客戶端網絡地址轉換問題
假設你的FTP客戶主機位于局域網內,通過一個網絡地址轉換(NAT)網關連入互聯網。在這種情況下,客戶程序可以毫無困難地和外部的FTP服務器建立控制連接,但是,如果使用主動模式建立數據傳輸連接,還是會出現問題。在主動模式下,客戶程序會忽略NAT網關,直接使用FTP協議的PORT命令告訴服務器與一個包含客戶主機私有地址的套接字建立連接,因此服務器無法向客戶主機發起連接。被動模式也可以很好地解決這個問題。
到此為止,我們羅列了三種需要使用FTP被動模式的情況:控制連接的轉發;客戶位于簡單包過濾防火墻之后;和客戶主機位于NAT之后。在這三種情況下,主動模式可能無法正常使用,因此我們建議盡量使用FTP被動模式。
4.2.服務器端網絡地址轉換問題
上面我們討論了客戶端NAT問題。如果FTP服務器位于NAT網關之后,并且你正在通過SSH轉發FTP控制連接會怎么樣呢?很顯然,這種情況下麻煩更大。
首先,假設在沒有SSH轉發的情況下,服務器位于NAT網關之后會出現什么問題。這與前面討論的情況正好相反,在主動模式下,如果客戶主機位于NAT網關之后,客戶程序會使用FTP的PORT命令告訴服務器自己的私有IP地址,造成服務器無法建立連接;而如果服務器位于NAT網關之后,它就會通過FTP命令PASV告訴客戶程序自己未經轉換的地址,使客戶程序無法建立連接。在這種情況下,我們會想到可以使用主動模式來解決。但是,這種解決方式實際上沒有多大幫助。在網絡上,客戶主機位于NAT網關之后是非常普遍的,絕大多數FTP客戶程序的默認數據傳輸方式都是被動模式的。這樣,會對客戶造成很多不便,對提高服務器的訪問量非常不利。
因此,需要有其它的方法解決這個問題?,F在的一些FTP服務器可以人工設置PASV命令的地址。wu-ftp,/etc/ftpaccess文件中使用如下命令來設置PASV的地址(具體用法可以參考man ftpaccess):
passive address
例如:
passive address 10.0.0.32 10.0.0.0/8
passive address 192.168.1.6 0.0.0.0/0
除此之外,還可以使用智能化的NAT網關解決這個問題。網關需要能夠識別位于應用層的FTP協議,能夠自動修改FTP協議的FTP控制報文。但是,如果使用SSH轉發FTP控制連接,因為控制連接被嵌入到了SSH會話通道中,使網關不能自動修改PASV的地址。這種情況下,你需要使用第一種方法。
5.使用默認數據傳輸端口
在FTP協議中,除了被動模式和主動模式之外,還有另外一種數據傳輸模式。如果客戶程序既不向服務器發出PASV命令也不發送PORT命令,FTP服務器就會使用FTP協議的數據傳輸端口(20)和客戶端的控制連接源端口建立一個數據傳輸連接。這就需要客戶程序在這個端口上監聽。在客戶程序上使用sendport命令可以關閉FTP協議的PORT控制指令,然后需要使用passive命令關閉被動模式。整個過程如下:
客戶程序從本地端口N初始化一個FTP控制連接。
用戶使用sendport命令和passive命令(某些客戶程序在默認情況下,被動模式是打開的)關閉主動模式和被動模式,然后使用數據傳輸指令,例如:ls、get等。這樣客戶程序就會在本地端口N上監聽FTP服務緝發起的數據傳輸連接。
服務器通過TCP例程(例如:getpeername())確定客戶端的端口N。然后從FTP數據傳輸端口(20)發起一個連接。
不過,這種方式有一個最大的缺點就是無法在很短的時間之內連續輸入數據傳輸命令,用戶經常會遇到"bind:Address Already in use等錯誤。這是TCP協議造成的。因此,這種模式并不常用。但是,它對于解決使用SSH轉發FTP數據連接的問題卻很有幫助。
6.轉發數據連接
前面我們提到了很多使用SSH轉發FTP數據連接會遇到的一些困難。現在,我們將討論如何使用SSH轉發FTP數據連接,這里我們將使用上一節介紹的數據傳輸模式。。注意:下面的討論是針對OpenSSH的。具體實現步驟如下:
在客戶段啟動SSH命令轉發FTP控制連接。使FTP客戶程序和轉發的端口建立連接。這里需要關閉被動模式。
client$ssh -f -n -L2001:localhost:21 server sleep 10000&
client$ ftp localhost 2001
Connected to localhost
220 server FTP server ready.
Password:
230 User res logged in.
ftp> sendport
Use of PORT cmds off.
ftp> passive
Passive mode off.
下面,我們還需要確定FTP客戶的真正和代理數據端口。在客戶端,可以使用netstat命令:
client$netstat -t|grep 2001
tcp 0 0 client:2001 client:3310 ESTABLISHED
tcp 0 0 client:3310 client:2001 ESTABLISHED
可以看出FTP客戶程序是通過3310端口和SSH連接。
下面我們需要知道服務器端使用的端口,假設現在服務器只為你一個人服務,使用netstat,我們獲得以下輸出:
server$netstat|grep ftp
tcp 0 0 server:8250 server:ftp ESTABLISHED
tcp 0 0 server:ftp server:8250 ESTABLISHED
這樣,我們知道了3310端口被轉發到了服務器端的8250端口。因此,FTP服務器就會認為這是在這種模式下,客戶程序使用的數據傳輸端口(和控制連接共用)。下面,我們只要把這個端口轉發到客戶端就可以了。
在客戶端使用如下命令轉發遠程服務器的8250端口:
clent$ssh -f -n -R8250:localhost:3310 server sleep 10000&
接著,最好在服務器端使用如下命令:
server$ssh -f -n -L8250:localhost:3310 client sleep 10000&
最后,你可以使用FTP數據傳輸命令了。
7.結論
本文其實主要討論了使用SSH進行FTP轉發的一些困難,最后討論的轉發方法其實幾乎沒有多大實用價值:)。

熱詞搜索:

上一篇:如何使用SSH的Port Forwarding加密不安全的服務
下一篇:SSH 實戰

分享到: 收藏
主站蜘蛛池模板: 草逼操| 奇米7777欧美日韩免费视频| 双妻艳| 电影《大突围》完整版| 许良| 《最后的凶手》免费观看| 拨萝卜电视剧视频歌高清在线观看大牛| 电影青春期| 日本电影怪物| 二十以内加减法口诀表| 杨颖电影| 在人间在线观看完整版| 电影后妈| 轨迹地图| 南来北往电视剧剧情介绍| 老司机免费在线观看| cad| 肚兜电影| 都市频道在线直播观看| 蒋锐| 牛奶奶油是什么奶油| 神宫寺奈绪从早做到晚上| 女人 电影| 性感美女写真视频| 买下我完整版电影免费观看| after4| 祈使句怎么改| 微信头像2024年最新版图片男| 红灯区免费看| 贝的故事教案设计优秀教案| 黑暗圣经在线观看| 火烈鸟电影完整版视频| 铃木纱理奈| 石隽| 电影《重生》| doors2怪物图鉴| 詹妮弗康纳利的电影| 女医生3| 电影《神丐》| 在爱的名义下| 村暖花开|