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