SSH的端口转发:本地转发Local Forward和远程转发Remote Forward
http://zhumeng8337797.blog.163.com/blog/static/100768914201172125444948/
實(shí)戰(zhàn) SSH 端口轉(zhuǎn)發(fā)
https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/
SSH的端口轉(zhuǎn)發(fā):本地轉(zhuǎn)發(fā)Local Forward和遠(yuǎn)程轉(zhuǎn)發(fā)Remote Forward
關(guān)于使用ssh portforwarding來進(jìn)行翻墻的操作,網(wǎng)絡(luò)上已經(jīng)有很多很好的文章,我在這里只是畫兩個(gè)圖解釋一下。
首先要記住一件事情就是:
SSH 端口轉(zhuǎn)發(fā)自然需要 SSH 連接,而 SSH 連接是有方向的,從 SSH Client 到 SSH Server 。
而我們所要訪問的應(yīng)用也是有方向的,應(yīng)用連接的方向也是從應(yīng)用的 Client 端連接到應(yīng)用的 Server 端。比如需要我們要訪問Internet上的Web站點(diǎn)時(shí),Http應(yīng)用的方向就是從我們自己這臺(tái)主機(jī)(Client)到遠(yuǎn)處的Web Server。
如果SSH連接和應(yīng)用的連接這兩個(gè)連接的方向一致,那我們就說它是本地轉(zhuǎn)發(fā)。
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>?
如果SSH連接和應(yīng)用的連接這兩個(gè)連接的方向不同,那我們就說它是遠(yuǎn)程轉(zhuǎn)發(fā)。
ssh -R <local port>:<remote host>:<remote port> <SSH hostname>?
本地轉(zhuǎn)發(fā)在本地這臺(tái)機(jī)器上監(jiān)聽一個(gè)端口,然后所有訪問這個(gè)端口的數(shù)據(jù)都會(huì)通過ssh 隧道傳輸?shù)竭h(yuǎn)端的對(duì)應(yīng)端口上,下面是例子。
本地端口轉(zhuǎn)發(fā)綁定的是 lookback 接口,這意味著只有 localhost 或者 127.0.0.1 才能使用本機(jī)的端口轉(zhuǎn)發(fā) , 其他機(jī)器發(fā)起的連接只會(huì)得到“ connection refused. ”。要想讓其他機(jī)器也能共享這個(gè)隧道來轉(zhuǎn)發(fā)的話需要在配置文件中使用GatewayPorts 關(guān)鍵字,或者直接命令行下使用"-g"參數(shù)。
另外本地轉(zhuǎn)發(fā)命令中的 <remote host> 和 <SSH hostname> 可以是不同的主機(jī)。
?
遠(yuǎn)程轉(zhuǎn)發(fā)與本地轉(zhuǎn)發(fā)正好相反,打開ssh隧道以后,在遠(yuǎn)端服務(wù)器監(jiān)聽一個(gè)端口,所有訪問遠(yuǎn)端服務(wù)器指定端口都會(huì)通過隧道傳輸?shù)奖镜氐膶?duì)應(yīng)端口上,下面是例子。
?
這里是一篇很好的介紹SSH PortForwarding的文章http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/
?
可以將遠(yuǎn)端服務(wù)器一個(gè)端口remote_port綁定到本地端口port,其中-C是進(jìn)行數(shù)據(jù)壓縮,-f是后臺(tái)操作,只有當(dāng)提示用戶名密碼的時(shí)候才轉(zhuǎn)向前臺(tái)。-N是不執(zhí)行遠(yuǎn)端命令,在只是端口轉(zhuǎn)發(fā)時(shí)這條命令很有用處。-g 是允許遠(yuǎn)端主機(jī)連接本地轉(zhuǎn)發(fā)端口。-R表明是將遠(yuǎn)端主機(jī)端口映射到本地端口。如果是-L,則是將本地端口映射到遠(yuǎn)端主機(jī)端口。
ssh的三個(gè)強(qiáng)大的端口轉(zhuǎn)發(fā)命令:
轉(zhuǎn)發(fā)到遠(yuǎn)端:ssh -C -f -N -g -L 本地端口:目標(biāo)IP:目標(biāo)端口 用戶名@目標(biāo)IP
轉(zhuǎn)發(fā)到本地:ssh -C -f -N -g –R 本地端口:目標(biāo)IP:目標(biāo)端口 用戶名@目標(biāo)IP
ssh -C -f -N -g -D listen_port user@Tunnel_Host
-C:壓縮數(shù)據(jù)傳輸。
-f :后臺(tái)認(rèn)證用戶/密碼,通常和-N連用,不用登錄到遠(yuǎn)程主機(jī)。
-N :不執(zhí)行腳本或命令,通常與-f連用。
-g :在-L/-R/-D參數(shù)中,允許遠(yuǎn)程主機(jī)連接到建立的轉(zhuǎn)發(fā)的端口,如果不加這個(gè)參數(shù),只允許本地主機(jī)建立連接。
-L 本地端口:目標(biāo)IP:目標(biāo)端口
將本地機(jī)(客戶機(jī))的某個(gè)端口轉(zhuǎn)發(fā)到遠(yuǎn)端指定機(jī)器的指定端口. 工作原理是這樣的, 本地機(jī)器上分配了一個(gè) socket 偵聽 port 端口, 一旦這個(gè)端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)發(fā)出去, 同時(shí)遠(yuǎn)程主機(jī)和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉(zhuǎn)發(fā). 只有 root 才能轉(zhuǎn)發(fā)特權(quán)端口. IPv6 地址用另一種格式說明: port/host/hostport
-R本地端口:目標(biāo)IP:目標(biāo)端口
將遠(yuǎn)程主機(jī)(服務(wù)器)的某個(gè)端口轉(zhuǎn)發(fā)到本地端指定機(jī)器的指定端口. 工作原理是這樣的, 遠(yuǎn)程主機(jī)上分配了一個(gè) socket 偵聽 port 端口, 一旦這個(gè)端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)向出去, 同時(shí)本地主機(jī)和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉(zhuǎn)發(fā). 只有用 root 登錄遠(yuǎn)程主機(jī)才能轉(zhuǎn)發(fā)特權(quán)端口. IPv6 地址用另一種格式說明: port/host/hostport
-p :被登錄的ssd服務(wù)器的sshd服務(wù)端口。
-D port
指定一個(gè)本地機(jī)器 “動(dòng)態(tài)的'’ 應(yīng)用程序端口轉(zhuǎn)發(fā). 工作原理是這樣的, 本地機(jī)器上分配了一個(gè) socket 偵聽 port 端口, 一旦這個(gè)端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)發(fā)出去, 根據(jù)應(yīng)用程序的協(xié)議可以判斷出遠(yuǎn)程主機(jī)將和哪里連接. 目前支持 SOCKS4 協(xié)議, 將充當(dāng) SOCKS4 服務(wù)器. 只有 root 才能轉(zhuǎn)發(fā)特權(quán)端口. 可以在配置文件中指定動(dòng)態(tài)端口的轉(zhuǎn)發(fā).
應(yīng)用舉例
1.將發(fā)往本機(jī)的80端口訪問轉(zhuǎn)發(fā)到174.139.9.66的8080端口
ssh -C -f -N -g?-L?80:174.139.9.66:8080??? ?master@174.139.9.66
2.將發(fā)往174.139.9.66的8080訪問轉(zhuǎn)發(fā)到本機(jī)的80端口
ssh -C -f -N -g?-R?80:174.139.9.66:8080????????????master@174.139.9.66
?
-N - 不使用Shell窗口,純做轉(zhuǎn)發(fā)的時(shí)候用,如果你在映射完成后繼續(xù)在服務(wù)器上輸入命令,去掉這個(gè)參數(shù)即可
例子A:我們想遠(yuǎn)程管理服務(wù)器上的MySQL,那么使用下面命令
ssh -L 3306:127.0.0.1:3306 user@emlog-vps -N ?運(yùn)行這個(gè)命令之后,ssh將會(huì)自動(dòng)將服務(wù)器的3306映射到本機(jī)的3306端口,我們就可以使用任意MySQL客戶端連接 localhost:3306即可訪問到服務(wù)器上的MySQL了。
?
?
例子B:一次同時(shí)映射多個(gè)端口
ssh -L 8888:www.host.com:80 -L 110:mail.host.com:110 -L 25:mail.host.com:25 user@host -N這個(gè)命令將自動(dòng)把服務(wù)器的80,110,25端口映射到本機(jī)的8888,110和25端口 以上命令在ubuntu 9.10 上測(cè)試通過...
?
端口映射讓外部用戶同時(shí)訪問內(nèi)部多個(gè)應(yīng)用
如下圖所示,這是企業(yè)部署NAT服務(wù)器的典型案例。如果現(xiàn)在企業(yè)內(nèi)部有兩臺(tái)服務(wù)器,分別為WEB服務(wù)器(192.168.0.3)與ERP服務(wù)器(192.168.0.2)。現(xiàn)在企業(yè)想讓出差在外的員工,也可以通過互聯(lián)網(wǎng)訪問企業(yè)內(nèi)部的這兩個(gè)應(yīng)用,該如何設(shè)計(jì)呢?
???? 一、基于端口訪問的一般原理。
在講解NAT服務(wù)器的具體端口映射配置之前,筆者覺得讀者有必要先了解一下基于端口訪問的一般原理。這有利于讀者了解下面的具體配置。下面筆者以員工訪問WEB服務(wù)器為例,談?wù)劵诙丝谠L問的基本步驟。假設(shè)現(xiàn)在某個(gè)用戶需要訪問WEB服務(wù)器,則客戶端的瀏覽器(假設(shè)采用的端口為3000)與WEB服務(wù)器(假設(shè)采用的端口為80)是如何來進(jìn)行通信的呢?
第一步:發(fā)起連接請(qǐng)求。當(dāng)用戶需要查看公司網(wǎng)頁(yè)時(shí),用戶所用的主機(jī)會(huì)像WEB服務(wù)器發(fā)送請(qǐng)求。在這個(gè)發(fā)起請(qǐng)求的過程中,會(huì)有一些參數(shù)傳遞。如在發(fā)送請(qǐng)求的過程中,用戶所用的主機(jī)需要知道WEB服務(wù)器的IP地址、所采用的協(xié)議(HTTP)等。另外就是兩個(gè)端口信息。一是用戶瀏覽器所用的端口,即為3000。二是WEB服務(wù)器網(wǎng)站所用的端口(如果采用的是HTTP服務(wù),則默認(rèn)為80端口)。
第二步:WEB服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求。當(dāng)服務(wù)器接受到這個(gè)請(qǐng)求后,會(huì)分析數(shù)據(jù)包。他經(jīng)過分析包發(fā)現(xiàn),這個(gè)請(qǐng)求是要求端口為80的應(yīng)用軟件來負(fù)責(zé)的。服務(wù)器確定了負(fù)責(zé)人之后,就會(huì)把這個(gè)請(qǐng)求轉(zhuǎn)發(fā)給具體的負(fù)責(zé)人,即WEB應(yīng)用服務(wù)器來處理。
第三步:服務(wù)器會(huì)把從WEB應(yīng)用服務(wù)那邊反饋回來的網(wǎng)頁(yè)傳送給用戶所用的計(jì)算機(jī)。在傳送的時(shí)候,其也會(huì)制定要把這個(gè)網(wǎng)頁(yè)給你的那個(gè)3000端口(瀏覽器)對(duì)應(yīng)的應(yīng)用軟件。
第四步:用戶的計(jì)算機(jī)收到數(shù)據(jù)包之后,也會(huì)對(duì)這個(gè)數(shù)據(jù)包進(jìn)行分析,來判斷需要把這個(gè)數(shù)據(jù)包轉(zhuǎn)發(fā)給哪個(gè)端口(應(yīng)用服務(wù))。分析后發(fā)現(xiàn)是轉(zhuǎn)交給3000端口的,就會(huì)把這個(gè)數(shù)據(jù)包轉(zhuǎn)發(fā)給瀏覽器。
二、基于端口映射的NAT服務(wù)器配置。
其實(shí)基于端口映射的NAT服務(wù)器其工作原理就跟上面這個(gè)基于端口訪問的工作過程類似。只是這里的NAT服務(wù)器就相當(dāng)于用戶主機(jī),而用戶相當(dāng)于內(nèi)部的服務(wù)器。由于用戶需要通過外網(wǎng)訪問企業(yè)內(nèi)部應(yīng)用的話,通常情況下要求內(nèi)網(wǎng)服務(wù)器也要求有合法的外網(wǎng)IP。只有私網(wǎng)IP地址的服務(wù)器是無(wú)法直接跟外部客戶進(jìn)行通信的。為此,如果沒有端口映射的話,用戶如果要同時(shí)訪問內(nèi)部的WEB服務(wù)器與ERP服務(wù)器,則就需要有兩個(gè)公網(wǎng)IP地址。但是,大家都知道現(xiàn)在公網(wǎng)IP地址嚴(yán)重缺乏。在沒有足夠多的IP地址的情況下,該如何實(shí)現(xiàn)這種需求呢?那就知道通過端口映射來完成。
如上圖所示,用戶需要訪問企業(yè)內(nèi)部的WEB服務(wù)與ERP服務(wù)器,他只需要知道NAT服務(wù)地址與WEB服務(wù)器與ERP服務(wù)器所采用的端口即可。如果
WEB服務(wù)器采用的端口為80,
ERP服務(wù)器所采用的端口為5050。
而NAT服務(wù)器的IP地址假設(shè)為202.96.92.100的話,
?
那么當(dāng)用戶訪問WEB服務(wù)器時(shí),只需要輸入http:// 202.96.92.100即可。由于HTTP協(xié)議默認(rèn)采用的是80端口,故這里不用配置端口號(hào)。如果WEB服務(wù)器中把這個(gè)端口改為了3000,則在訪問的時(shí)候就需要使用http:// 202.96.92.100:3000(地址+端口號(hào))的形式了。用戶要訪問內(nèi)部的ERP服務(wù)器也是類似的,只要把NAT服務(wù)器的地址以及ERP服務(wù)器所采用的端口在客戶端上進(jìn)行配置即可。
可見通過NAT服務(wù)器的端口映射功能,可以讓外部用戶同時(shí)訪問企業(yè)內(nèi)部的WEB服務(wù)器與ERP服務(wù)器。
那要實(shí)現(xiàn)這個(gè)需求具體該如何配置呢?
NAT服務(wù)器讓內(nèi)部的局域網(wǎng)用戶可以連接到互聯(lián)網(wǎng),以便用戶能夠收發(fā)互聯(lián)網(wǎng)郵件、瀏覽互聯(lián)網(wǎng)上的網(wǎng)站等等。但是默認(rèn)情況下外部用戶是不能夠訪問內(nèi)部的服務(wù)器。如果需要實(shí)現(xiàn)以上功能的話,就需要進(jìn)行專門的配置。
如上圖中,
內(nèi)部局域網(wǎng)計(jì)算機(jī)(192.168.0.2)為WEB服務(wù)器,其采用的端口為80。
如果現(xiàn)在外部用戶需要訪問這個(gè)WEB服務(wù)器站點(diǎn),則用戶只知道這個(gè)WEB服務(wù)器的地址為202.96.92.100(NAT服務(wù)器的地址)。
而WEB服務(wù)器默認(rèn)采用的端口為80。當(dāng)外部用戶通過瀏覽器訪問企業(yè)內(nèi)部的WEB服務(wù)器時(shí),
他會(huì)在瀏覽器中輸入http:// 202.96.92.100路經(jīng)來連接網(wǎng)站。
NAT服務(wù)器會(huì)將此請(qǐng)求發(fā)送給內(nèi)部的計(jì)算機(jī)WEB服務(wù)器(192.168.0.2),并由WEB服務(wù)器將這個(gè)請(qǐng)求轉(zhuǎn)發(fā)給端口為80的軟件來負(fù)責(zé)。WEB服務(wù)器會(huì)將網(wǎng)頁(yè)傳送給NAT服務(wù)器,再由NAT服務(wù)器負(fù)責(zé)將網(wǎng)頁(yè)傳送給外部用戶的計(jì)算機(jī)。
如果用戶要訪問內(nèi)部的ERP服務(wù)器,其過程也是如此。
那么現(xiàn)在的問題是,NAT服務(wù)器怎么判斷要把用戶HTTP請(qǐng)求發(fā)送給服務(wù)器(192.168.0.2)而不是發(fā)送給(192.168.0.3)呢?
這主要是根據(jù)端口來判斷的。也就是說在NAT服務(wù)器中有一個(gè)端口映射的規(guī)則,只要用戶訪問的目的端口是80,就把這個(gè)請(qǐng)求轉(zhuǎn)發(fā)給WEB服務(wù)器;若請(qǐng)求的端口是5050,則就把這個(gè)請(qǐng)求發(fā)送給ERP服務(wù)器。這就是端口映射的實(shí)質(zhì)。了解這個(gè)內(nèi)容之后,那么了解下面的配置也就簡(jiǎn)單多了。打開路由和遠(yuǎn)程訪問主控制窗口,選擇要配置的服務(wù)器。然后選擇IP路由選擇、NAT/基本防火墻。并雙擊右方對(duì)外連接的網(wǎng)絡(luò)接口(注意這里不要選擇連接內(nèi)網(wǎng)的網(wǎng)絡(luò)接口),選擇服務(wù)和端口標(biāo)簽。然后直接從服務(wù)列表中選取要對(duì)外開發(fā)的服務(wù),如選擇WEB服務(wù)器。在公用地址中選擇在此接口,表示由互聯(lián)網(wǎng)服務(wù)提供商指派的NAT服務(wù)器的公網(wǎng)IP地址。然后再設(shè)置,如果把這個(gè)服務(wù)請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部的IP地址為192.168.0.2的WEB服務(wù)器。通過這個(gè)簡(jiǎn)單的配置,就實(shí)現(xiàn)基于端口的映射。
?
三、改善NAT服務(wù)器的性能與便利性。
可見這個(gè)端口映射配置是很簡(jiǎn)單的。但是其難點(diǎn)在于如何提高這個(gè)NAT服務(wù)器的性能,如何讓用戶使用的更加方便。這是網(wǎng)絡(luò)管理員所需要考慮的。對(duì)此筆者有如下幾個(gè)建議可供大家參考。
1、利用域名來代替IP地址。當(dāng)用戶訪問企業(yè)內(nèi)部的網(wǎng)站服務(wù)器時(shí),如果讓他們輸入服務(wù)器的IP地址,對(duì)普通用戶來說可能有點(diǎn)難度。要記住這202.96.92.100十一個(gè)沒有絲毫關(guān)系的數(shù)字有很大的難度。如果能夠把這個(gè)IP地址轉(zhuǎn)換為有實(shí)際意義的網(wǎng)址那就最好了。在企業(yè)內(nèi)部,可以自己部屬一個(gè)DNS服務(wù)器,把IP地址轉(zhuǎn)換為網(wǎng)址。那么內(nèi)部員工可以直接通過網(wǎng)址來訪問WEB服務(wù)器。但是在互聯(lián)網(wǎng)上,企業(yè)可不能自己隨便定義域名。為了提高用戶訪問的便捷性,企業(yè)網(wǎng)絡(luò)管理員最好能夠像當(dāng)?shù)氐挠蛎?cè)機(jī)構(gòu),申請(qǐng)一個(gè)合適的域名并關(guān)聯(lián)到自己的NAT服務(wù)器公網(wǎng)IP地址。那么以后外部用戶訪問內(nèi)部WEB服務(wù)器時(shí),只需要輸入像新浪那樣的地址就可以了。而不用輸入這些難以記憶的地址。
2、如果企業(yè)可以申請(qǐng)到多個(gè)IP地址的話,那么最好能夠分開來部署。即企業(yè)可以申請(qǐng)兩個(gè)ADSL帳號(hào)。其中一個(gè)專門用來連接內(nèi)部的服務(wù)器;而另外一個(gè)用來內(nèi)部員工跟互聯(lián)網(wǎng)的通信。這么做主要是為了減輕NAT服務(wù)器的壓力,提高其性能。如企業(yè)只有一個(gè)ADSL帳號(hào)的話,那么無(wú)論是外部用戶訪問企業(yè)內(nèi)部服務(wù)器;還是企業(yè)內(nèi)部員工訪問互聯(lián)網(wǎng),其數(shù)據(jù)流都要通過這臺(tái)NAT服務(wù)器來處理。為此,如果企業(yè)數(shù)據(jù)流量比較大或者NAT服務(wù)器配置不怎么理想的話,那么很可能這個(gè)NAT服務(wù)器就成為了企業(yè)網(wǎng)絡(luò)訪問的瓶頸資源。如果把他們分開,則可以減輕NAT服務(wù)器的壓力,提高外部用戶訪問企業(yè)內(nèi)部服務(wù)器的效率。
3、配置合適的ICMP數(shù)據(jù)包策略,以加強(qiáng)阻擋黑客利用ICMP的攻擊行為。使用ICMP攻擊的原理實(shí)際上就是通過Ping大量的數(shù)據(jù)包使得NAT服務(wù)器的CPU使用率居高不下而崩潰。一般情況下黑客通常在一個(gè)時(shí)段內(nèi)連續(xù)向計(jì)算機(jī)發(fā)出大量請(qǐng)求而導(dǎo)致CPU占用率太高而死機(jī)。而且會(huì)使用多臺(tái)肉雞同時(shí)向NAT服務(wù)器發(fā)送數(shù)據(jù)包。基于ICMP的攻擊可以分為兩大類,一是ICMP攻擊導(dǎo)致拒絕服務(wù);另外一個(gè)是基于重定向的路由欺騙技術(shù)。無(wú)論是哪一類攻擊,都會(huì)給NAT服務(wù)器產(chǎn)生致命的影響。為此為了NAT服務(wù)器的安全,最好配置合適的ICMP包策略。如可以拒絕響應(yīng)別人的ICMP請(qǐng)求。如此攻擊者就無(wú)法對(duì)NAT服務(wù)器發(fā)起ICMP攻擊了。
?
SSH隧道與端口轉(zhuǎn)發(fā)及內(nèi)網(wǎng)穿透
大家都知道SSH是一種安全的傳輸協(xié)議,用在連接服務(wù)器上比較多。不過其實(shí)除了這個(gè)功能,它的隧道轉(zhuǎn)發(fā)功能更是吸引人。下面是個(gè)人根據(jù)自己的需求以及在網(wǎng)上查找的資料配合自己的實(shí)際操作所得到的一些心得。
SSH/plink命令的基本資料:
首先,認(rèn)識(shí)下這三個(gè)非常強(qiáng)大的命令:
ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host?
ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host?
ssh -C -f -N -g -D listen_port user@Tunnel_Host
相關(guān)參數(shù)的解釋:?
-f Fork into background after authentication.?
后臺(tái)認(rèn)證用戶/密碼,通常和-N連用,不用登錄到遠(yuǎn)程主機(jī)。
-L port:host:hostport?
將本地機(jī)(客戶機(jī))的某個(gè)端口轉(zhuǎn)發(fā)到遠(yuǎn)端指定機(jī)器的指定端口. 工作原理是這樣的, 本地機(jī)器上分配了一個(gè) socket 偵聽 port 端口, 一旦這個(gè)端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)發(fā)出去, 同時(shí)遠(yuǎn)程主機(jī)和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉(zhuǎn)發(fā). 只有 root 才能轉(zhuǎn)發(fā)特權(quán)端口. IPv6 地址用另一種格式說明: port/host/hostport
-R port:host:hostport?
將遠(yuǎn)程主機(jī)(服務(wù)器)的某個(gè)端口轉(zhuǎn)發(fā)到本地端指定機(jī)器的指定端口.?工作原理是這樣的, 遠(yuǎn)程主機(jī)上分配了一個(gè) socket 偵聽 port 端口, 一旦這個(gè)端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)向出去, 同時(shí)本地主機(jī)和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉(zhuǎn)發(fā). 只有用 root 登錄遠(yuǎn)程主機(jī)才能轉(zhuǎn)發(fā)特權(quán)端口. IPv6 地址用另一種格式說明: port/host/hostport
-D port?
指定一個(gè)本地機(jī)器 “動(dòng)態(tài)的’’ 應(yīng)用程序端口轉(zhuǎn)發(fā). 工作原理是這樣的, 本地機(jī)器上分配了一個(gè) socket 偵聽 port 端口, 一旦這個(gè)端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)發(fā)出去, 根據(jù)應(yīng)用程序的協(xié)議可以判斷出遠(yuǎn)程主機(jī)將和哪里連接. 目前支持 SOCKS4 協(xié)議, 將充當(dāng) SOCKS4 服務(wù)器. 只有 root 才能轉(zhuǎn)發(fā)特權(quán)端口. 可以在配置文件中指定動(dòng)態(tài)端口的轉(zhuǎn)發(fā).
-C Enable compression.?
壓縮數(shù)據(jù)傳輸。
-N Do not execute a shell or command.?
不執(zhí)行腳本或命令,通常與-f連用。
-g Allow remote hosts to connect to forwarded ports.?
在-L/-R/-D參數(shù)中,允許遠(yuǎn)程主機(jī)連接到建立的轉(zhuǎn)發(fā)的端口,如果不加這個(gè)參數(shù),只允許本地主機(jī)建立連接。注:這個(gè)參數(shù)我在實(shí)踐中似乎始終不起作用。
以上摘錄自:http://chenweiguang.blogspot.com/2009/03/ssh.html
建立本地SSH隧道例子
在我們計(jì)劃建立一個(gè)本地SSH隧道之前,我們必須清楚下面這些數(shù)據(jù):
現(xiàn)在,我們把上面這張圖變得具體一些,給這些機(jī)器加上IP地址。并且根據(jù)下面這張圖列出我們的計(jì)劃:
?
現(xiàn)在我們使用下面這條命令來達(dá)成我們的目的(192.168.0.100上執(zhí)行)
1.ssh -N -f?? -L?? ?2121:234.234.234.234:21??? 123.123.123.123
2.ftp://localhost:2121????????# 現(xiàn)在訪問本地2121端口,就能連接234.234.234.234的21端口了
這里我們用到了SSH客戶端的三個(gè)參數(shù),下面我們一一做出解釋:
- -N 告訴SSH客戶端,這個(gè)連接不需要執(zhí)行任何命令。僅僅做端口轉(zhuǎn)發(fā)
- -f 告訴SSH客戶端在后臺(tái)運(yùn)行
- -L 做本地映射端口,被冒號(hào)分割的三個(gè)部分含義分別是
- 需要使用的本地端口號(hào)
- 需要訪問的目標(biāo)機(jī)器IP地址(IP: 234.234.234.234)
- 需要訪問的目標(biāo)機(jī)器端口(端口: 21)
- 最后一個(gè)參數(shù)是我們用來建立隧道的中間機(jī)器的IP地址(IP: 123.123.123.123)
?
我們?cè)僦貜?fù)一下-L參數(shù)的行為。-L X:Y:Z的含義是,將IP為Y的機(jī)器的Z端口通過中間服務(wù)器映射到本地機(jī)器的X端口。
在這條命令成功執(zhí)行之后,我們已經(jīng)具有繞過公司防火墻的能力,并且成功訪問到了我們喜歡的一個(gè)FTP服務(wù)器了。
如何建立遠(yuǎn)程SSH隧道
通過建立本地SSH隧道,我們成功地繞過防火墻開始下載FTP上的資源了。那么當(dāng)我們?cè)诩依锏臅r(shí)候想要察看下載進(jìn)度怎么辦呢?大多數(shù)公司的網(wǎng)絡(luò)是通過路由器接入互聯(lián)網(wǎng)的,公司內(nèi)部的機(jī)器不會(huì)直接與互聯(lián)網(wǎng)連接,也就是不能通過互聯(lián)網(wǎng)直接訪問。通過線路D-B-A訪問公司里的機(jī)器a便是不可能的。也許你已經(jīng)注意到了,雖然D-B-A這個(gè)方向的連接不通,但是A-B-D這個(gè)方向的連接是沒有問題的。那么,我們能否利用一條已經(jīng)連接好的A-B-D方向的連接來完成D-B-A方向的訪問呢?答案是肯定的,這就是遠(yuǎn)程SSH隧道的用途。
與本地SSH一樣,我們?cè)诮⑦h(yuǎn)程SSH隧道之前要清楚下面幾個(gè)參數(shù):
- 需要訪問內(nèi)部機(jī)器的遠(yuǎn)程機(jī)器的IP地址(這里是123.123.123.123)
- 需要讓遠(yuǎn)程機(jī)器能訪問的內(nèi)部機(jī)器的IP地址(這里因?yàn)槭窍氚驯緳C(jī)映射出去,因此IP是127.0.0.1)
- 需要讓遠(yuǎn)程機(jī)器能訪問的內(nèi)部機(jī)器的端口號(hào)(端口:22)
在清楚了上面的參數(shù)后,我們使用下面的命令來建立一個(gè)遠(yuǎn)程SSH隧道
1.ssh -N -f?-R?2222:127.0.0.1:22??????123.123.123.123
現(xiàn)在,在IP是123.123.123.123的機(jī)器上我們用下面的命令就可以登陸公司的IP是192.168.0.100的機(jī)器了。
1.ssh -p 2222 localhost
-N,-f 這兩個(gè)參數(shù)我們已經(jīng)在本地SSH隧道中介紹過了。我們現(xiàn)在重點(diǎn)說說參數(shù)-R。該參數(shù)的三個(gè)部分的含義分別是:
- 遠(yuǎn)程機(jī)器使用的端口(2222)
- 需要映射的內(nèi)部機(jī)器的IP地址(127.0.0.1)
- 需要映射的內(nèi)部機(jī)器的端口(22)
例如:-R X:Y:Z 就是把我們內(nèi)部的Y機(jī)器的Z端口映射到遠(yuǎn)程機(jī)器的X端口上。
建立SSH隧道的幾個(gè)技巧
自動(dòng)重連
隧道可能因?yàn)槟承┰驍嚅_,例如:機(jī)器重啟,長(zhǎng)時(shí)間沒有數(shù)據(jù)通信而被路由器切斷等等。因此我們可以用程序控制隧道的重新連接,例如一個(gè)簡(jiǎn)單的循環(huán)或者使用?djb’s daemontools?. 不管用哪種方法,重連時(shí)都應(yīng)避免因輸入密碼而卡死程序。關(guān)于如何安全的避免輸入密碼的方法,請(qǐng)參考我的?如何實(shí)現(xiàn)安全的免密碼ssh登錄?。這里請(qǐng)注意,如果通過其他程序控制隧道連接,應(yīng)當(dāng)避免將SSH客戶端放到后臺(tái)執(zhí)行,也就是去掉-f參數(shù)。
保持長(zhǎng)時(shí)間連接
有些路由器會(huì)把長(zhǎng)時(shí)間沒有通信的連接斷開。SSH客戶端的TCPKeepAlive選項(xiàng)可以避免這個(gè)問題的發(fā)生,默認(rèn)情況下它是被開啟的。如果它被關(guān)閉了,可以在ssh的命令上加上-o TCPKeepAlive=yes來開啟。
另一種方法是,去掉-N參數(shù),加入一個(gè)定期能產(chǎn)生輸出的命令。例如: top或者vmstat。下面給出一個(gè)這種方法的例子:
1.ssh -R 2222:localhost:22 123.123.123.123 "vmstat 30"
檢查隧道狀態(tài)
有些時(shí)候隧道會(huì)因?yàn)橐恍┰蛲ㄐ挪粫扯ㄋ?#xff0c;例如:由于傳輸數(shù)據(jù)量太大,被路由器帶入stalled狀態(tài)。這種時(shí)候,往往SSH客戶端并不退出,而是卡死在那里。一種應(yīng)對(duì)方法是,使用SSH客戶端的ServerAliveInterval和ServerAliveCountMax選項(xiàng)。 ServerAliveInterval會(huì)在隧道無(wú)通信后的一段設(shè)置好的時(shí)間后發(fā)送一個(gè)請(qǐng)求給服務(wù)器要求服務(wù)器響應(yīng)。如果服務(wù)器在 ServerAliveCountMax次請(qǐng)求后都沒能響應(yīng),那么SSH客戶端就自動(dòng)斷開連接并退出,將控制權(quán)交給你的監(jiān)控程序。這兩個(gè)選項(xiàng)的設(shè)置方法分別是在ssh時(shí)加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定義。
如何將端口綁定到外部地址上
使用上面的方法,映射的端口只能綁定在127.0.0.1這個(gè)接口上。也就是說,只能被本機(jī)自己訪問到。如何才能讓其他機(jī)器訪問這個(gè)端口呢?我們可以把這個(gè)映射的端口綁定在0.0.0.0的接口上,方法是加上參數(shù)-b 0.0.0.0。同時(shí)還需要打開SSH服務(wù)器端的一個(gè)選項(xiàng)-GatewayPorts。默認(rèn)情況下它應(yīng)當(dāng)是被打開的。如果被關(guān)閉的話,可以在/etc /sshd_config中修改GatewayPorts no為GatewayPorts yes來打開它。
通過SSH隧道建立SOCKS服務(wù)器
如果我們需要借助一臺(tái)中間服務(wù)器訪問很多資源,一個(gè)個(gè)映射顯然不是高明的辦法(事實(shí)上,高明確實(shí)沒有用這個(gè)方法)。幸好,SSH客戶端為我們提供了通過SSH隧道建立SOCKS服務(wù)器的功能。
通過下面的命令我們可以建立一個(gè)通過123.123.123.123的SOCKS服務(wù)器。
1.ssh -N -f -D 1080 123.123.123 # 將端口綁定在127.0.0.1上
2.ssh -N -f -D 0.0.0.0:1080 123.123.123.123 # 將端口綁定在0.0.0.0上
通過SSH建立的SOCKS服務(wù)器使用的是SOCKS5協(xié)議,在為應(yīng)用程序設(shè)置SOCKS代理的時(shí)候要特別注意。
以上摘錄自:http://blog.jianingy.com/content/…
@@@@@@@@@@@@@@@@@@@@@@@@@@@
1 >?反向隧道技術(shù)
情景:節(jié)假日需要回公司加班。但是公司是內(nèi)網(wǎng),使用NAT,所以沒辦法連回去。
現(xiàn)在公司機(jī)器(LAN_ip)上執(zhí)行
ssh -NfR 2222:localhost:22 home_ip
-R : 建立反向連接 將 home_ip port轉(zhuǎn)發(fā)
現(xiàn)在,到home_ip上面
ssh localhost -p 2222
就跑在NAT后面的公司機(jī)器。就是后門了?;银澴幽抉R用的也是反向鏈接。
Destination (LAN_ip) <- |NAT| <- Source (home_ip)
2>端口轉(zhuǎn)發(fā)
情景:本機(jī)不允許訪問www.xxx.com這個(gè)網(wǎng)站,但是遠(yuǎn)程主機(jī)(remote_ip)可以。
ssh -f -N -L 31609:www.xxx.com:80?user@remote_ip
現(xiàn)在我們就可以在本地打開?http://localhost:31609?訪問www.xxx.com了。
3>?SOCKS代理
情景: 本機(jī)不允許訪問某些網(wǎng)站,但是遠(yuǎn)程主機(jī)(remote_ip)可以,并且公司沒有組織你連接remote_ip。
ssh -NfD 8888?user@remote_ip
現(xiàn)在在瀏覽器socks 5 proxy設(shè)置為localhost:8888,所有之前無(wú)法訪問的網(wǎng)站現(xiàn)在都可以訪問了。
@@@@@@@@@@@@@@@@@@@
古人以“夜不閉戶”、“路不拾遺”來形容大治之世。他們認(rèn)為大治時(shí),人們的道德水平已經(jīng)很高了。而早期Internet的形成似乎也是符合這種思想的。Internet的初衷是相互信任和相互分享,它的這種“信任”建立在“大治”甚至“天下大同”的假想上。隨著互聯(lián)網(wǎng)的商業(yè)化和平民化,Internet的安全性就顯得越來越脆弱了,不僅網(wǎng)絡(luò)攻擊、網(wǎng)絡(luò)詐騙盛行,也有一些網(wǎng)絡(luò)管理者肆意檢測(cè)、更改、阻斷用戶通信的行為。SSH的一些特性在很多場(chǎng)合可以解決這些問題。
ssh的基本用法在命令行也強(qiáng)大之ssh一文中做了最基本的介紹。ssh是安全的遠(yuǎn)程登錄工具,在與遠(yuǎn)程主機(jī)進(jìn)行交互時(shí),ssh協(xié)議把原始數(shù)據(jù)進(jìn)行了加密并壓縮,從而保證了數(shù)據(jù)在網(wǎng)絡(luò)傳輸過程的安全。利用這一原理,我們也可以用ssh把其它的明文傳輸?shù)腡CP數(shù)據(jù)流通過ssh的連接傳輸,這就是本文要講到的ssh轉(zhuǎn)發(fā)/隧道技術(shù)。下圖表示一個(gè)ssh連接(圖片來自http://www.ssh.com)
ssh的轉(zhuǎn)發(fā)有四類:遠(yuǎn)程轉(zhuǎn)發(fā)、本地轉(zhuǎn)發(fā)、動(dòng)態(tài)轉(zhuǎn)發(fā)和X轉(zhuǎn)發(fā)。把TCP流重定向到ssh連接叫做“轉(zhuǎn)發(fā)”,這個(gè)ssh連接叫做“隧道”。
假設(shè)場(chǎng)景:受限網(wǎng)絡(luò)內(nèi)主機(jī)A,受限網(wǎng)絡(luò)防火墻F,受限網(wǎng)絡(luò)外主機(jī)B,受限網(wǎng)絡(luò)外主機(jī)C、D、E。用戶為主機(jī)A的管理者且擁有主機(jī)B的ssh賬號(hào),B、C、D、E可以正常連接。因?yàn)榉阑饓的策略,A與C、D、E完全不能連接,A與B受限連接(當(dāng)A與B的連接內(nèi)有關(guān)鍵字“SB”則阻斷連接,且只能由A與B連接,不能由B主動(dòng)連接,可類比為NAT)。
下圖為場(chǎng)景圖(用Dia v0.96.1繪制)
一、遠(yuǎn)程轉(zhuǎn)發(fā)
將遠(yuǎn)程主機(jī)(服務(wù)器)的某個(gè)端口轉(zhuǎn)發(fā)到本地端指定機(jī)器的指定端口. 工作原理是這樣的, 遠(yuǎn)程主機(jī)上分配了一個(gè) socket 偵聽 port 端口, 一旦這個(gè)端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)向出去, 同時(shí)本地主機(jī)和host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉(zhuǎn)發(fā). 只有用 root 登錄遠(yuǎn)程主機(jī)才能轉(zhuǎn)發(fā)特權(quán)端口.--摘自ssh的中文Manual
命令格式為:
| ssh -R :: |
假設(shè)主機(jī)A提供了HTTP服務(wù),即在受限網(wǎng)絡(luò)內(nèi)部可以訪問的網(wǎng)頁(yè)服務(wù)器。但這個(gè)服務(wù)因?yàn)榉阑饓Σ呗曰蛘逳AT路由的原因?qū)е略贗nternet無(wú)法訪問。那么我們就可以將本地的HTTP服務(wù)遠(yuǎn)程轉(zhuǎn)發(fā)到Internet上的主機(jī)B
?[Copy to clipboard]View Code?BASH| ssh -fNgR 80:localhost:80 root@host-B |
然后在Internet上可以通過訪問 http://host-B來訪問主機(jī)A上的HTTP服務(wù)了
如果沒有主機(jī)B的root賬號(hào),則只能遠(yuǎn)程轉(zhuǎn)發(fā)到1024以后的端口號(hào)
?[Copy to clipboard]View Code?BASH| ssh -fNgR 8080:localhost:80 lige@host-B |
然后在Internet上可以通過訪問http://host-B:8080來訪問主機(jī)A上的HTTP服務(wù)。
值得注意的是搭建了wordpress的主機(jī)只能運(yùn)行在80端口,如果轉(zhuǎn)發(fā)后的端口不是80,那么將無(wú)法使用,這應(yīng)該算是wp的bug吧
而且因?yàn)橹鳈C(jī)A到主機(jī)B之間是通過隧道連接的,即使網(wǎng)頁(yè)中含有關(guān)鍵字“SB”,也無(wú)法被大防火墻檢測(cè)到(淚流滿面,終于講到關(guān)鍵了)
附加參數(shù)簡(jiǎn)要說明:
?[Copy to clipboard]View Code?BASH| -N 不執(zhí)行遠(yuǎn)程命令. 用于轉(zhuǎn)發(fā)端口. -n 把 stdin 重定向到 /dev/null (實(shí)際上防止從 stdin 讀取數(shù)據(jù)). ssh在后臺(tái)運(yùn)行時(shí)一定會(huì)用到這個(gè)選項(xiàng). 它的常用技巧是遠(yuǎn)程運(yùn)行 X11 程序. -f 要求 ssh 在執(zhí)行命令前退至后臺(tái). 它用于當(dāng) ssh 準(zhǔn)備詢問口令或密語(yǔ),但是用戶希望它在后臺(tái)進(jìn)行. 該選項(xiàng)隱含了 -n 選項(xiàng). 在遠(yuǎn)端機(jī)器上啟動(dòng)X11 程序的推薦手法就是類似于 ssh -f host xterm 的命令. -C 要求進(jìn)行數(shù)據(jù)壓縮 -g 允許遠(yuǎn)端主機(jī)連接本地轉(zhuǎn)發(fā)的端口 |
關(guān)于建立隧道和使用隧道的網(wǎng)絡(luò)原理,見文章末尾
二、本地轉(zhuǎn)發(fā)
將本地機(jī)(客戶機(jī))的某個(gè)端口轉(zhuǎn)發(fā)到遠(yuǎn)端指定機(jī)器的指定端口. 工作原理是這樣的, 本地機(jī)器上分配了一個(gè) socket 偵聽 port 端口, 一旦這個(gè)端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)發(fā)出去, 同時(shí)遠(yuǎn)程主機(jī)和 host的 hostport 端口建立連接. 可以在配置文件中指定端口的轉(zhuǎn)發(fā). 只有 root 才能轉(zhuǎn)發(fā)特權(quán)端口. --摘自ssh的中文Mannul
它的命令格式為
?[Copy to clipboard]View Code?BASH| ssh -L :: |
和遠(yuǎn)程轉(zhuǎn)發(fā)原理類似但方向相反。假設(shè)主機(jī)B有HTTP服務(wù),但因?yàn)槭芟蘧W(wǎng)絡(luò)內(nèi)其它主機(jī)因憎惡“大防火墻”F而不愿意直接訪問主機(jī)B(這種心理我也有)。那就可以通過本地轉(zhuǎn)發(fā)了
?[Copy to clipboard]View Code?BASH| ssh -fNgL 80:localhost:80 root@host-B |
因?yàn)楹瓦h(yuǎn)程轉(zhuǎn)發(fā)類似,后面就不再詳述。
三、動(dòng)態(tài)轉(zhuǎn)發(fā)
指定一個(gè)本地機(jī)器 “動(dòng)態(tài)的” 應(yīng)用程序端口轉(zhuǎn)發(fā). 工作原理是這樣的, 本地機(jī)器上分配了一個(gè) socket 偵聽 port 端口, 一旦這個(gè)端口上有了連接,該連接就經(jīng)過安全通道轉(zhuǎn)發(fā)出去, 根據(jù)應(yīng)用程序的協(xié)議可以判斷出遠(yuǎn)程主機(jī)將和哪里連接. 目前支持 SOCKS 協(xié)議, ssh 將充當(dāng) SOCKS 服務(wù)器.只有 root 才能轉(zhuǎn)發(fā)特權(quán)端口. --摘自ssh的中文manual
可以這樣理解,遠(yuǎn)程轉(zhuǎn)發(fā)和本地轉(zhuǎn)發(fā)都是在隧道上傳輸一個(gè)服務(wù),比如例子中的HTTP數(shù)據(jù)流。而動(dòng)態(tài)轉(zhuǎn)發(fā)則是為了在隧道上傳輸多種不確定的網(wǎng)絡(luò)服務(wù)。它的表現(xiàn)就把遠(yuǎn)端ssh服務(wù)器當(dāng)作了一個(gè)安全的代理服務(wù)器。
命令格式為
?[Copy to clipboard]View Code?BASH| $ ssh -D |
假設(shè)主機(jī)A想要訪問受限網(wǎng)絡(luò)所限制訪問的主機(jī)C、D、E等,或者想要訪問主機(jī)B上的“SB”內(nèi)容。則可有D選項(xiàng)建立動(dòng)態(tài)隧道
?[Copy to clipboard]View Code?BASH| ssh -CfNg -D 8888 lige@host-B |
然后你就有了一個(gè)安全的socks 5代理。這個(gè)代理ip是127.0.0.1,端口為剛才指定的8888。如何使用socks 5代理在本文就不再講了。大防火墻可能還存在一些技術(shù)來防止socks 5代理,可以參考socks代理的遠(yuǎn)端DNS解析一文
還有一個(gè)plink工具,包含在PuTTY軟件包,可以在windows和linux下使用,它的格式為:
?[Copy to clipboard]View Code?CMD| PLINK.EXE -C -D 127.0.0.1:7777 -N -pw SSH密碼 SSH用戶名@SSH的IP地址 |
四、X轉(zhuǎn)發(fā)
X轉(zhuǎn)發(fā)是一個(gè)令人驚奇但實(shí)際上用處不大的功能。因?yàn)槲宜芄芾淼倪h(yuǎn)端主機(jī)都是無(wú)圖形界面的,所以本部分內(nèi)容我不保證正確。
大家都知道GUI軟件與X之間也是通過TCP連接的,所以X轉(zhuǎn)發(fā)與其它轉(zhuǎn)發(fā)也沒有本質(zhì)區(qū)別,甚至它簡(jiǎn)單得都不應(yīng)該和其它幾種轉(zhuǎn)發(fā)相提并論。X轉(zhuǎn)發(fā)用的選項(xiàng)為”-X”
首先要在客戶端指定X Server的位置
?[Copy to clipboard]View Code?BASH| export DISPLAY=:. |
然后執(zhí)行
?[Copy to clipboard]View Code?BASH| ssh -X lige@hot-B |
補(bǔ)充:可能的問題:
1. ssh的基本用法
http://blog.lilinux.net/2010/02/command-ssh/以及ssh的man文檔
2. windows下的ssh客戶端
PuTTY和其中的plink
3. 如何查看隧道是否建立完善
查看進(jìn)程:
| ps aux | grep ssh |
查看端口:
?[Copy to clipboard]View Code?BASH| netstat -ntl |
4. 因?yàn)镕,連接還是不穩(wěn)定,隧道經(jīng)常無(wú)法使用
去除-N,-n,-f選項(xiàng),進(jìn)入遠(yuǎn)程shell,輸入一些需要頻繁交互數(shù)據(jù)的命令,使連接一直處于活動(dòng)狀態(tài)。比如
| top |
我更推薦用這樣的命令,對(duì)系統(tǒng)的負(fù)載消耗更小(而且更加美觀)
?[Copy to clipboard]View Code?BASH| watch -n1 "date" |
5. 更多的實(shí)例
本文寫的例子都是假設(shè)場(chǎng)景,近期將寫一個(gè)實(shí)例應(yīng)用。預(yù)計(jì)網(wǎng)址為http://blog.lilinux.net/2010/02/ssh-instance/
附ssh隧道原理
對(duì)網(wǎng)絡(luò)原理不太懂或不感興趣的可以忽略此部分
總的來說:Tunnel實(shí)際上是一個(gè)TCP連接,這個(gè)連接和普通的SSH登錄的連接并沒有本質(zhì)上的區(qū)別
假設(shè)有兩臺(tái)主機(jī)A和B,IP分別是IP_A和IP_B,是要把主機(jī)A的22端口映射到主機(jī)B的10022端口
連接的建立過程是這樣的:
1. 建立TUNNEL (在A主機(jī)上執(zhí)行命令)
ssh命令,把A的端口映射到B主機(jī)(ssh -NfR 10022:localhost:22 USER_B@IP_B)
這個(gè)步驟實(shí)際上是這樣的:
(1)ssh命令是ssh客戶端,這條命令是指在A主機(jī)上登錄B主機(jī),并且A主機(jī)請(qǐng)求將A主機(jī)的22號(hào)端口映射到B主機(jī)的10022端口。
(2)B主機(jī)接受遠(yuǎn)程登錄請(qǐng)求后,檢測(cè)發(fā)現(xiàn)用戶的權(quán)限足以創(chuàng)建10022端口,且10022端口并未使用。則B主機(jī)開啟一個(gè)監(jiān)聽端口:10022
(3)這條命令成功結(jié)束后,A主機(jī)有了一個(gè)后臺(tái)進(jìn)程登錄到B主機(jī),這個(gè)登錄的連接正是“TUNNEL”。
而B主機(jī)相應(yīng)也有這么一個(gè)后臺(tái)進(jìn)程,此外B主機(jī)還增開了一個(gè)監(jiān)聽端口:10022
(4)在這個(gè)過程中,B是Server,A是Client。那么A是以一個(gè)任意端口連接到B的ssh監(jiān)聽端口。所設(shè)這個(gè)連接是
IP_A:12345 —— IP_B:22
2. 連接映射端口 (在B主機(jī)上執(zhí)行命令)
連接映射端口 ( ssh USER_A@localhost -p 10022)
這個(gè)步驟實(shí)際上是這樣的:
(1)主機(jī)B連接自己的一個(gè)監(jiān)聽端口10022
于是主機(jī)B以一個(gè)任意的端口連接10022: IP_B:23456 ——- IP_B:10022
(2)10022端口實(shí)際是由主機(jī)B的sshd來維護(hù)的,sshd發(fā)現(xiàn)有連接到10022的端口的數(shù)據(jù)。
將數(shù)據(jù)封裝成ssh包,通過已經(jīng)建立好的TUNNEL傳輸?shù)綄?duì)端主機(jī)A的12345端口(TUNNEL建立時(shí)的初始端口)
(3)主機(jī)A的12345端口收到數(shù)據(jù)后,經(jīng)過TUNNEL的建立進(jìn)程的處理(解開ssh包),把數(shù)據(jù)轉(zhuǎn)到主機(jī)A的端口22(建立TUNNEL時(shí)指定的端口)
(4)因此,這個(gè)反向的連接就建立起來了
3. TUNNEL與TCP連接的關(guān)系
(1)TUNNEL本質(zhì)是一個(gè)TCP連接
(2)TUNNEL的作用用于傳輸其它TCP連接的數(shù)據(jù)
(3)對(duì)用戶而言,TUNNEL就是它們可見的TCP連接傳輸?shù)囊粋€(gè)“隧道”
?如需轉(zhuǎn)載,請(qǐng)注明出處:http://blog.lilinux.net/2010/02/ssh-tunnel/
題目有點(diǎn)長(zhǎng)
其實(shí)來自于一個(gè)朋友的問題
他的oracle跑在linux服務(wù)器上
遠(yuǎn)程的linux服務(wù)器并沒有跑在圖形界面下(runlevel=5)
而是跑在字符模式下(runlevel=3)
而他又想用圖形界面來管理oracle
我翻了翻資料
找出一種方法
在一臺(tái)圖形界面的linux下(虛擬機(jī)也行,其實(shí)不是linux也行,關(guān)鍵是本地得有X server)起一個(gè)控制臺(tái)
用命令行ssh加參數(shù)”-X”連上遠(yuǎn)程的linux服務(wù)器
像這樣
ssh -X oracle@1.1.1.1
這里”1.1.1.1″是遠(yuǎn)程linux服務(wù)器的ip地址
這樣連上去之后
直接就可以用以前只有在圖形界面上才能用的命令
如oracle管理的圖形程序”dbca”
這個(gè)原理很簡(jiǎn)單
因?yàn)檫h(yuǎn)程的sshd支持x11 forward
那么他起x程序的時(shí)候
就會(huì)把x的包通過ssh轉(zhuǎn)回來到ssh客戶端的機(jī)器上來
而ssh客戶端這邊跑得有x server
所以就能正確接收x包并顯示出來
其實(shí)在windows下也可以通過安裝x server軟件來實(shí)現(xiàn)一樣的效果
比如x manager就可以
具體用法不在詳述
這里的關(guān)鍵在于
遠(yuǎn)程的sshd需要支持x11 forward
不過不要擔(dān)心
一般情況下
缺省是支持的
?
SSH端口轉(zhuǎn)發(fā)(本地端口轉(zhuǎn)發(fā)、遠(yuǎn)程端口轉(zhuǎn)發(fā)、動(dòng)態(tài)端口轉(zhuǎn)發(fā))工作原理、應(yīng)用詳解
Posted on?March 1, 2011?by?lesca 實(shí)驗(yàn)條件:
1.本文所述之實(shí)驗(yàn),本地主機(jī)操作系統(tǒng)基于Ubuntu 10.04,遠(yuǎn)程主機(jī)操作系統(tǒng)基于BSD發(fā)行版
2.本地主機(jī)安裝了ssh client(ssh),也安裝了ssh server(sshd)
基礎(chǔ)知識(shí):
文章中客戶端指ssh,用于發(fā)出連接請(qǐng)求;服務(wù)端指sshd,監(jiān)聽端口22。
安全通道是指ssh與sshd之間已建立的連接通道,該連接是加密的。
SSH 端口轉(zhuǎn)發(fā)格式[1]
[-L [bind_address:]port:host:hostport]
[-R [bind_address:]port:host:hostport]
[-D [bind_address:]port]
動(dòng)態(tài)端口轉(zhuǎn)發(fā)
-D <port>
這會(huì)使本地主機(jī)監(jiān)聽端口port,一旦與該端口建立連接,經(jīng)過該端口的數(shù)據(jù)會(huì)被轉(zhuǎn)發(fā)到安全通道發(fā)送到遠(yuǎn)程主機(jī)。遠(yuǎn)程主機(jī)的sshd會(huì)根據(jù)數(shù)據(jù)包的應(yīng)用層協(xié)議(如HTTP)自動(dòng)建立對(duì)應(yīng)的連接。
登陸前本地主機(jī)端口監(jiān)聽狀態(tài):
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd登陸后本地主機(jī)端口監(jiān)聽狀態(tài):
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp 0 0 127.0.0.1:7070 0.0.0.0:* LISTEN 5205/ssh tcp6 0 0 :::22 :::* LISTEN 927/sshd tcp6 0 0 ::1:7070 :::* LISTEN 5205/ssh登陸后遠(yuǎn)程主機(jī)端口監(jiān)聽狀態(tài):
$ sockstat -4l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS (什么都沒有) 小結(jié):我們發(fā)現(xiàn),動(dòng)態(tài)端口轉(zhuǎn)發(fā)的時(shí)候確實(shí)是本地主機(jī)的ssh在監(jiān)聽端口7070的
本地端口轉(zhuǎn)發(fā)
-L <local_port>:<host>:<host_port> <ssh_server>
這會(huì)使本地主機(jī)監(jiān)聽端口local_port,一旦與該端口建立連接,經(jīng)過該端口的數(shù)據(jù)會(huì)被轉(zhuǎn)發(fā)到安全通道,同時(shí)遠(yuǎn)程主機(jī)會(huì)與主機(jī)host的端口host_port建立連接。
登陸前本地主機(jī)端口監(jiān)聽狀態(tài):
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd登陸后本地主機(jī)端口監(jiān)聽狀態(tài):
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp 0 0 127.0.0.1:7001 0.0.0.0:* LISTEN 3475/ssh tcp6 0 0 :::22 :::* LISTEN 927/sshd tcp6 0 0 ::1:7001 :::* LISTEN 3475/ssh登陸后遠(yuǎn)程主機(jī)端口監(jiān)聽狀態(tài):
$ sockstat -4l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS (什么都沒有) 小結(jié):我們從中可以看出,本地端口轉(zhuǎn)發(fā)的時(shí)候確實(shí)是本地主機(jī)的ssh在監(jiān)聽端口7001
遠(yuǎn)程端口轉(zhuǎn)發(fā)
-R <remote_port>:<host>:<host_port> <ssh_server>
這會(huì)使ssh_server(遠(yuǎn)程端)監(jiān)聽端口remote_port,一旦與該端口建立連接,經(jīng)過該端口的數(shù)據(jù)會(huì)被轉(zhuǎn)發(fā)到安全通道,并且本地主機(jī)會(huì)與主機(jī)host的端口host_port建立連接。
登陸前本地主機(jī)端口監(jiān)聽狀態(tài):
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd登陸后本地主機(jī)端口監(jiān)聽狀態(tài):
$ sudo netstat -lnput | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 927/sshd tcp6 0 0 :::22 :::* LISTEN 927/sshd登陸后遠(yuǎn)程主機(jī)端口監(jiān)聽狀態(tài):
$ sockstat -4l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS sisca sshd 66196 7 tcp4 127.0.0.1:7001 *:*小結(jié):很明顯,使用遠(yuǎn)程端口轉(zhuǎn)發(fā)時(shí),本地主機(jī)的端口監(jiān)聽并沒有發(fā)生變化,相反遠(yuǎn)程主機(jī)卻開始監(jiān)聽我們指定的7001端口
小提示:
這里的remote_port,local_port可以歸并為listen_port,因此我們得到這樣的助記格式:
本地端口轉(zhuǎn)發(fā)應(yīng)用:[2]
背景:在實(shí)驗(yàn)室里有一臺(tái) LDAP 服務(wù)器(LDAP Server),但是限制了只有本機(jī)上部署的應(yīng)用才能直接連接此 LDAP 服務(wù)器?,F(xiàn)在我們想臨時(shí)從本地機(jī)器(LDAP Client)直接連接到這個(gè) LDAP 服務(wù)器,只需要在LDAP Client上運(yùn)用本地端口轉(zhuǎn)發(fā):
圖1 本地端口轉(zhuǎn)發(fā)
數(shù)據(jù)流向:
該命令首先使本地主機(jī)(LDAP Client)與遠(yuǎn)程主機(jī)(LDAP Server)建立一個(gè)SSH安全連接(安全通道)
然后本地主機(jī)會(huì)監(jiān)聽端口7001(注意是ssh在監(jiān)聽)
一旦本地LDAP客戶端程序?qū)?shù)據(jù)發(fā)送到端口7001(即建立連接),遠(yuǎn)程主機(jī)上的sshd將主動(dòng)與端口389(LDAP服務(wù)的端口)建立連接
從而來自LDAP客戶端的請(qǐng)求轉(zhuǎn)發(fā)到該端口389上(當(dāng)然是通過安全通道)
注意:
本地主機(jī)有兩個(gè)客戶端:
1) ssh – 用于與遠(yuǎn)程主機(jī)建立ssh連接
2) LDAP客戶端 – 用于與遠(yuǎn)程主機(jī)的LDAP服務(wù)程序進(jìn)行通訊
遠(yuǎn)程主機(jī)對(duì)應(yīng)地有兩個(gè)服務(wù)進(jìn)程:
1) sshd – 監(jiān)聽端口22
2) ldapd -監(jiān)聽端口389
遠(yuǎn)程端口轉(zhuǎn)發(fā)應(yīng)用:[2]
背景:這次假設(shè)由于網(wǎng)絡(luò)或防火墻的原因我們不能用 SSH 直接從 LDAP Client 連接到 LDAP 服務(wù)器(LDAP Server),但是反向連接卻是被允許的。那此時(shí)我們的選擇自然就是遠(yuǎn)程端口轉(zhuǎn)發(fā)了。我們這次在LDAP Server上運(yùn)用遠(yuǎn)程端口轉(zhuǎn)發(fā),因此LDAP Client必須安裝了sshd
圖2 遠(yuǎn)程端口轉(zhuǎn)發(fā)
數(shù)據(jù)流向:
該命令首先使LDAP Server與 LDAP Client 建立一個(gè)SSH安全連接(安全通道)
然后LDAP Client開始監(jiān)聽端口7001(注意是sshd在監(jiān)聽)
一旦LDAP Client將數(shù)據(jù)發(fā)送到端口7001(即建立連接),LDAP Server上的ssh將主動(dòng)與端口389(LDAP服務(wù)端口)建立連接
從而來自LDAP客戶端的請(qǐng)求轉(zhuǎn)發(fā)到該端口389上(當(dāng)然是通過安全通道)
本地轉(zhuǎn)發(fā)與遠(yuǎn)程轉(zhuǎn)發(fā)的對(duì)比與分析
本地端口轉(zhuǎn)發(fā):ssh客戶端發(fā)起ssh連接,并且監(jiān)聽指定端口
遠(yuǎn)程端口轉(zhuǎn)發(fā):ssh客戶端發(fā)起ssh連接,但是由遠(yuǎn)程主機(jī)上的sshd監(jiān)聽指定端口
多主機(jī)轉(zhuǎn)發(fā)應(yīng)用[2]
圖3 多主機(jī)端口轉(zhuǎn)發(fā)
注意:我們?cè)诿钪兄付恕?-g ”參數(shù)以保證機(jī)器(A)能夠使用機(jī)器(C)建立的本地端口轉(zhuǎn)發(fā)。
References:
[1] man 1 ssh
[2] IBM DeveloperWorks –?實(shí)戰(zhàn) SSH 端口轉(zhuǎn)發(fā)
Please support us if you feel this post is useful.
SSH?名為?secure shell,?是專門用來進(jìn)行安全遠(yuǎn)程訪問的協(xié)議。它無(wú)論從功能上、系統(tǒng)兼容性上、還是從安全上和Telnet和RSH相比都是足以取而代之。
?
在這個(gè)ARP欺騙橫行,網(wǎng)上盜竊泛濫的年代,還有什么比安全更為重要的?
在這個(gè)遍地都是防火墻的年代,還有什么比通過一個(gè)端口就能訪問所有業(yè)務(wù)更為重要的呢?
?
??????????? ?在矛和盾同樣發(fā)達(dá)的年代,SSH可以給我們什么樣的方便?
?
????????????現(xiàn)代的UNIX類操作系統(tǒng),無(wú)一例外地將SSH,作為默認(rèn)系統(tǒng)軟件包進(jìn)行安裝。
?
????????????最基本的連接方式:SSH Hostname
?
????? SSH?提供了多種不同的接入認(rèn)證方式:
??????????? Password
??????????? Hostkey
??????????????????????? .....
??????????????????????? .....
?
????????????其中常用的有?password,?和host public key,?如果使用password,則會(huì)產(chǎn)生用戶交互的密碼輸入,如果使用host key, 則可以直接登錄或直接執(zhí)行遠(yuǎn)程命令。
?
??????????? SSH Client?和Server的交互,能實(shí)現(xiàn)很多其他非常有用的功能:
?
????最基本的功能有如下選項(xiàng):
?
????SSH?會(huì)話內(nèi)容的壓縮,可以使用gzip壓縮級(jí)別進(jìn)行指定,以提高在慢速線路上數(shù)據(jù)傳輸效率。
?
????SSH?本地端口轉(zhuǎn)發(fā),可以將本地某個(gè)端口和遠(yuǎn)程SSH服務(wù)器上、或SSH遠(yuǎn)程服務(wù)器可達(dá)的地址端口建立一種映射關(guān)系,使對(duì)本地端口的訪問請(qǐng)求會(huì)透明地轉(zhuǎn)發(fā)到遠(yuǎn)程服務(wù)器上。從遠(yuǎn)程服務(wù)器上所看到的來訪請(qǐng)求源地址將是SSH服務(wù)器的地址。
?
?
???
????SSH?遠(yuǎn)程端口反向轉(zhuǎn)發(fā),與上列相反, 遠(yuǎn)程端口反向轉(zhuǎn)發(fā)建立后,遠(yuǎn)程客戶機(jī)訪問遠(yuǎn)程SSH服務(wù)器的某端口,SSH服務(wù)器將把來訪請(qǐng)求通過SSH安全通道轉(zhuǎn)發(fā)到SSH客戶端或SSH客戶端可達(dá)的服務(wù)器地址端口上,從而使遠(yuǎn)程客戶機(jī),可以正常訪問內(nèi)部服務(wù)器所提供的服務(wù)。
?
?
??
這樣,SSH客戶端D,就可以通過訪問SSH服務(wù)器B的端口D,從而達(dá)到訪問業(yè)務(wù)服務(wù)器C上端口D的目的。
?
????高級(jí)功能/用法有:
?
????SSH?端口轉(zhuǎn)發(fā)的接續(xù)。
由于現(xiàn)代的UNIX系統(tǒng)都默認(rèn)帶有SSH服務(wù)和客戶端,所以當(dāng)網(wǎng)絡(luò)變得比較復(fù)雜、層次很多的時(shí)候,使用多臺(tái)機(jī)器的端口轉(zhuǎn)發(fā)接續(xù),可以將在層次很深的內(nèi)網(wǎng)服務(wù),在不改變當(dāng)前網(wǎng)絡(luò)結(jié)構(gòu)和防火墻配置的情況下,層層轉(zhuǎn)發(fā)出來從而可以使外網(wǎng)用戶很方便地使用該內(nèi)網(wǎng)服務(wù),而無(wú)須對(duì)現(xiàn)有網(wǎng)絡(luò)構(gòu)架和甚至防火墻配置作任何變動(dòng)。而對(duì)最外層的防火墻只需要開放一個(gè)22端口(默認(rèn)ssh服務(wù)端口)就能使授權(quán)的客戶端訪問全網(wǎng)業(yè)務(wù)。
?
?
????SSH?動(dòng)態(tài)端口轉(zhuǎn)發(fā)。
????SSHv2,同時(shí)還支持內(nèi)置的SockS4 Server,將ssh?客戶端的指定端口,作為一個(gè)遠(yuǎn)程SOCKS4 Server的端口。對(duì)SockS4Server的訪問請(qǐng)求將通過,SSH Protocol?傳輸?shù)?SSH?服務(wù)器,?SSH服務(wù)器將請(qǐng)求轉(zhuǎn)發(fā)到用戶應(yīng)用的真正目的服務(wù)器。
?
????SSH?的?PPP通道。
????結(jié)合UNIX PPPD,還可以在SSH的?PTS?通道上建立PPP LINK從而非常靈活的實(shí)現(xiàn)?IP over SSH?的VPN。這種方法,可謂SSH的終極用法,因?yàn)樗鉀Q了所有由于地址翻譯而帶來的應(yīng)用層協(xié)議不兼容的問題(多播問題是否能解決尚未測(cè)試)。
?
????SSH產(chǎn)品實(shí)戰(zhàn)。
?
????SecureCRT
????VanDyke Software?的經(jīng)典力作,幾乎囊括了所有SSH客戶端的功能,在此,SSH的標(biāo)準(zhǔn)功能就不多說了。說一些windows上的特色功能使SCRT變得非常靈活。
1、它擁有端口轉(zhuǎn)發(fā)安全過慮器,可以靈活地允許或禁止其他客戶機(jī)訪問被SecureCRT所轉(zhuǎn)發(fā)的本機(jī)端口。
2、同時(shí)還擁有VBSCript/Jscript/Perl?腳本功能,可以通過這三類腳本語(yǔ)言和遠(yuǎn)程服務(wù)器進(jìn)行自動(dòng)交互式執(zhí)行。
3、可以自動(dòng)和服務(wù)器上的Zmodem進(jìn)行交互,實(shí)現(xiàn)基于TTY/PTS的Zmodem?文件傳輸(這個(gè)功能可在任何類型的會(huì)話中進(jìn)行,并不局限于SSH類型的會(huì)話)。
4、自動(dòng)和SecureFX匹配實(shí)現(xiàn)SFTP的文件傳輸功能(無(wú)需輸入用戶名密碼,因?yàn)槭腔谝呀⒌?/span>SSH Session的,所以登錄速度是非常快的)由于SecureFx帶有拖放功能,和類似文件夾的拷貝粘貼功能,所以會(huì)給文件傳輸帶來很大方便性(FTP還是很不方便的)。
5、支持命令行方式,可在CMD中實(shí)現(xiàn)一步登錄并將端口轉(zhuǎn)發(fā)作為參數(shù)輸入(和UNIX的SSH基本沒區(qū)別了)。
?
?
功能太多了,就不一一列舉了。詳細(xì)請(qǐng)查看VanDyke Software的主頁(yè)和SecureCRT的幫助文件。
?
???????UniTTY
??A Pure Java Based SSH?客戶端。居然實(shí)現(xiàn)了幾乎所有的SSH功能。而且更牛的是,實(shí)現(xiàn)了端口轉(zhuǎn)發(fā)的動(dòng)態(tài)加載。而且默認(rèn)實(shí)現(xiàn)了SFTP over SSH的文件傳輸。只是字體有待改進(jìn)。看慣了SecureCRT的優(yōu)雅美觀的字體,再用UniTTY可能就有些不習(xí)慣了。它的多協(xié)議支持能力也很特別,居然將VNC的客戶端協(xié)議也加進(jìn)來了。
??????
???????UNIX SSH?客戶端
?????完全基于OpenSSH,最標(biāo)準(zhǔn)的客戶端。能完成所有SSH協(xié)議支持的功能,同時(shí)結(jié)合UNIX的腳本,能完成其他操作系統(tǒng)無(wú)法完成的很多任務(wù)。或配合完成前面所提到的一些用法!
??????
???????NetSarang XSHELL
??????????? 韓國(guó)人寫的多協(xié)議客戶端,和他另外一個(gè)在國(guó)內(nèi)很流行的產(chǎn)品(Xmanager)配合使用很好。默認(rèn)支持TAB窗口的SFTP,使用也比較方便,也同時(shí)支持雙向的端口轉(zhuǎn)發(fā)。
?
????? MindTerm
???????????? 純java的ssh客戶端,非常著名的開源軟件mindterm。
??????????mindterm,居然提供了源代碼真是不錯(cuò),以后可以將expect也扔了。
??????????而且該有的都有了(sockserver, 端口轉(zhuǎn)發(fā),反向轉(zhuǎn)發(fā),scp,telnet,zlib compression,keepalive等),還額外提供了ftp 協(xié)議橋接sftp的功能,就是有一點(diǎn)不方便,在啞終端方式啟動(dòng),需要X11Display支持。
?
??? zenith 2007.9.10
網(wǎng)的朋友苦于沒有合法 ip,不能對(duì)外提供 internet 服務(wù)。解決方案很多,可以通過在網(wǎng)關(guān)做端口映射,或其他的輔助軟件等。
本文介紹兩種比較簡(jiǎn)單實(shí)用的方法,利用 ssh 這個(gè)強(qiáng)大的工具。
(以下方法不分平臺(tái),都適用)
案例一、
內(nèi)網(wǎng)主機(jī) A ,開了 http,ftp ,http ,vnc,sshd,socks5,cvs 等服務(wù)。無(wú)合法 ip 地址。
外網(wǎng)主機(jī) B ,開了 sshd 服務(wù)。有合法 ip : 218.xxx.xxx.xxx
我們的目的是讓 B 能訪問 A 上的各種服務(wù)。
步驟:
1、A(內(nèi)網(wǎng)服務(wù)器) ?知道?B?ip 后,先用 ssh client 連上 B,命令如下:
ssh -R 1234:localhost:21?? ? ?-l root ?218.xxx.xxx.xxx
解釋:
關(guān)于 ssh 的參數(shù),請(qǐng)看 ssh --help
-L listen-port:host:port Forward local port to remote address
-R listen-port:host:port Forward remote port to local address
-L local (本地) -R :remote (遠(yuǎn)程)
-R 1234:localhost:21 其實(shí)做了個(gè)“端口轉(zhuǎn)發(fā)(forward)"。
意思是主機(jī) A 把本地的 21端口(對(duì)應(yīng)ftp服務(wù))映射為 B 的1234 端口(任意未被占用),同時(shí) A 監(jiān)聽 B 的1234 端口。
在 B 上用 netstat -al | grep 1234 ,你能看到這個(gè)監(jiān)聽連接。
任何發(fā)送到 B 1234 端口的請(qǐng)求將被傳送到 A的 21 端口。
2、B 用 ftp 工具(任意,如gftp) 連本地的 1234 端口,輸入 A 的 ftp 用戶和密碼。
ftp localhost 1234
千萬(wàn)不要覺的奇怪,為什么連的是本地的地址。
舉個(gè)不恰當(dāng)例子,相當(dāng)于 A 在 B 的房間里裝了個(gè)***(監(jiān)聽端口),那么 B 在房間里說的話就通過***傳送到了 A。
3、推廣:
如果 B 沒占用 21 端口的話,那么可以寫成:
A使用: ssh -R 21:localhost:21 -l root 218.xxx.xxx.xxx
B使用: ftp localhost
如果你想使用 A 上的 http 或其他服務(wù),只需改變服務(wù)端口:
http服務(wù) :
A使用:ssh -R 1234:localhost:80 -l root 218.xxx.xxx.xxx
B使用:w3m?http://localhost:1234
sshd服務(wù):
A使用:ssh -R 1234:localhost:22 -l root 218.xxx.xxx.xxx
B使用:ssh localhost -p 1234
vnc 服務(wù):?
A使用:ssh -R 1234:localhost:5901(其他) -l root 218.xxx.xxx.xxx
B使用:vncviewer localhost:1
socks5服務(wù):
A使用:ssh -R 1234:localhost:1080 -l root 218.xxx.xxx.xxx
B 略
cvs 服務(wù):
A使用:ssh -R 1234:localhost:2401 -l root 218.xxx.xxx.xxx
B使用:cvs -d :pserver:root@localhost:1234/home/cvsroot login
這里是否一定要用 root ,涉及到權(quán)限問題,具體還得靠大家來總結(jié)經(jīng)驗(yàn)。
案例二、
部分朋友會(huì)問了,這樣的話只是兩臺(tái)機(jī)器的互相通訊,如何讓廣域網(wǎng)的人都能訪問呢?
聰明的你,這時(shí)候可能已經(jīng)有了答案。
內(nèi)網(wǎng)主機(jī) A ,開了 http,ftp ,http ,vnc,sshd,socks5,cvs等服務(wù)。無(wú)合法 ip 地址。
外網(wǎng)主機(jī) B ,開了 sshd 服務(wù)。有合法 ip : 218.xxx.xxx.xxx
我們的目的是讓 internet 上的任何主機(jī)能訪問 A 上的各種服務(wù)。
步驟:
1、首先,B 的sshd 服務(wù)端做點(diǎn)小小的設(shè)置:
vi /etc/ssh/sshd.config
加入 GatewayPorts yes
然后重啟 sshd 服務(wù): /etc /init.d/ssh restart 或 /etc/init.d/sshd restart
(解釋:
不加,默認(rèn)會(huì)把監(jiān)聽端口綁定在 localhost 或 lo(127.0.0.1),這樣除了 B自身別人是沒法訪問監(jiān)聽端口的。
加入 GatewayPorts yes,把監(jiān)聽端口綁定到 0.0.0.0 ,這樣外部的所有機(jī)器都能訪問到這個(gè)監(jiān)聽端口。
主要是考慮安全性問題,默認(rèn)情況,只允許本地訪問。
這里才是真正的難點(diǎn),實(shí)驗(yàn)了一個(gè)晚上,累人呀!給點(diǎn)鼓勵(lì)吧 :)
2、A 知道 B ip 后,先用 ssh client 連上 B,命令如下:
ssh -R 21:localhost:21 -l root 218.xxx.xxx.xxx
(事先確定 B 的21 端口未被占用)
3、分布在 internet 的其它客戶機(jī)使用 ftp 工具(任意),連 B 21端口。
ftp 218.xxx.xxx.xxx 21
你會(huì)發(fā)現(xiàn)自己連上了內(nèi)網(wǎng) A 的ftp 服務(wù)。
此法和案例一完全一樣。
internet --------->> B 21 端口----------->>A 21端口
可以叫做端口轉(zhuǎn)發(fā),或隧道技術(shù),也可以稱之為跳板(B),或反* 。呵呵,我瞎說的。。。
可能遇到的問題:
Country:/etc# ssh localhost -p 1234
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
be:5f:d2:45:66:4d:0c:9e:2b:6b:45:65:a7:b2:85:28.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:11
RSA host key for localhost has changed and you have requested strict checking.
Host key verification failed.
Country:/etc# ssh localhost -p 1234
root@localhost's?password:
Last login: Mon May 5 02:39:53 2003 from localhost
localhost root #
如上問題,請(qǐng)刪除 ~/.ssh/known_hosts,然后再試。
點(diǎn)評(píng):
當(dāng)然 ssh 還有很多的功能沒有用,如先用 ssh 連接 上去后,可以用 scp命令來存取文件,等等。
scp -P xxx?user@host:path/file
其它突破網(wǎng)關(guān)傳送文件的方式也千變?nèi)f化。
優(yōu)點(diǎn)是:
可以突破網(wǎng)關(guān),一般情況下,向網(wǎng)管要求在網(wǎng)關(guān)上給你做端口映射是不現(xiàn)實(shí)的,但用此法你可以讓要好的朋友給你做。
使用方案一:比較點(diǎn)對(duì)點(diǎn)傳送文件比較方便,或使用ssh進(jìn)行遠(yuǎn)程控制內(nèi)網(wǎng)。
ssh本身是加密,保證安全可靠。
缺點(diǎn)也不少:
使用 ssh 加密,勢(shì)必影響性能,可以用 -C 選項(xiàng)調(diào)節(jié)壓縮率。
如果象方案二使用額外的服務(wù)器,數(shù)據(jù)都要服務(wù)器中轉(zhuǎn)(我是這樣認(rèn)為,沒跟蹤過),勢(shì)必影響速度。
公網(wǎng)的服務(wù)器不好找。
建議:懇請(qǐng)編程高手們根據(jù)類似得原理,做個(gè)端口轉(zhuǎn)發(fā)小工具,效果會(huì)更好。
本文,雕蟲小計(jì),漏洞無(wú)數(shù)。旨在提供一種如何解決問題的思路,請(qǐng)大俠不要笑話。也請(qǐng)大家多多支持,共同提高。
特別感謝 :sleeve ,x11 兄,是他們幫助一起實(shí)現(xiàn)的。以及 irc.linuxfire.com 中的大伙:)
?評(píng)論這張 轉(zhuǎn)發(fā)至微博
總結(jié)
以上是生活随笔為你收集整理的SSH的端口转发:本地转发Local Forward和远程转发Remote Forward的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UBUNTU上VNC 配置
- 下一篇: gdb的简单使用和gdb+gdbserv