ecure Network (ssh端口映射)-----圖詳細可以使用
2011-08-21 14:54:44| 分類:rhel_ssh|字號訂閱
實戰 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 [email protected]
2.將發往174.139.9.66的8080訪問轉發到本機的80端口
ssh -C -f -N -g -R 80:174.139.9.66:8080 [email protected]
-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隧道之前,我們必須清楚下面這些數據:
中間服務器d的IP地址
要訪問服務器c的IP地址
要訪問服務器c的端口
現在,我們把上面這張圖變得具體一些,給這些機器加上IP地址。並且根據下面這張圖列出我們的計劃:
需要訪問234.234.234.234的FTP服務,也就是端口21
中間服務器是123.123.123.123
現在我們使用下面這條命令來達成我們的目的(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
ssh-fNgR80:localhost:80 root@host-B |
然後在Internet上可以通過訪問 http://host-B來訪問主機A上的HTTP服務了
如果沒有主機B的root賬號,則只能遠程轉發到1024以後的端口號
ssh-fNgR8080:localhost:80 lige@host-B |
然後在Internet上可以通過訪問http://host-B:8080來訪問主機A上的HTTP服務。
值得注意的是搭建了wordpress的主機只能運行在80端口,如果轉發後的端口不是80,那麼將無法使用,這應該算是wp的bug吧
而且因爲主機A到主機B之間是通過隧道連接的,即使網頁中含有關鍵字“SB”,也無法被大防火牆檢測到(淚流滿面,終於講到關鍵了)
附加參數簡要說明:
-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
它的命令格式爲
ssh-L :: |
和遠程轉發原理類似但方向相反。假設主機B有HTTP服務,但因爲受限網絡內其它主機因憎惡“大防火牆”F而不願意直接訪問主機B(這種心理我也有)。那就可以通過本地轉發了
ssh-fNgL80:localhost:80 root@host-B |
因爲和遠程轉發類似,後面就不再詳述。
三、動態轉發
指定一個本地機器 “動態的” 應用程序端口轉發. 工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有了連接,該連接就經過安全通道轉發出去, 根據應用程序的協議可以判斷出遠程主機將和哪裏連接. 目前支持 SOCKS 協議, ssh 將充當 SOCKS 服務器.只有 root 才能轉發特權端口. --摘自ssh的中文manual
可以這樣理解,遠程轉發和本地轉發都是在隧道上傳輸一個服務,比如例子中的HTTP數據流。而動態轉發則是爲了在隧道上傳輸多種不確定的網絡服務。它的表現就把遠端ssh服務器當作了一個安全的代理服務器。
命令格式爲
$ ssh-D |
假設主機A想要訪問受限網絡所限制訪問的主機C、D、E等,或者想要訪問主機B上的“SB”內容。則可有D選項建立動態隧道
ssh-CfNg-D8888 lige@host-B |
然後你就有了一個安全的socks 5代理。這個代理ip是127.0.0.1,端口爲剛纔指定的8888。如何使用socks 5代理在本文就不再講了。大防火牆可能還存在一些技術來防止socks 5代理,可以參考socks代理的遠端DNS解析一文
還有一個plink工具,包含在PuTTY軟件包,可以在windows和linux下使用,它的格式爲:
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的位置
exportDISPLAY=:. |
然後執行
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 |grepssh |
查看端口:
netstat-ntl |
4. 因爲F,連接還是不穩定,隧道經常無法使用
去除-N,-n,-f選項,進入遠程shell,輸入一些需要頻繁交互數據的命令,使連接一直處於活動狀態。比如
top |
我更推薦用這樣的命令,對系統的負載消耗更小(而且更加美觀)
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 [email protected]
這裏”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端口轉發(本地端口轉發、遠程端口轉發、動態端口轉發)工作原理、應用詳解
實驗條件:
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)自動建立對應的連接。
$ ssh -D 7070 [email protected]
登陸前本地主機端口監聽狀態:
$ 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建立連接。
$ ssh -L 7001:localhost:7070 [email protected]
登陸前本地主機端口監聽狀態:
$ 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建立連接。
$ ssh -R 7001:localhost:7070 [email protected]
登陸前本地主機端口監聽狀態:
$ 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,因此我們得到這樣的助記格式:
ssh [-L|-R] <listen_port>:<host>:<host_port>
本地端口轉發應用:[2]
背景:在實驗室裏有一臺 LDAP 服務器(LDAP Server),但是限制了只有本機上部署的應用才能直接連接此 LDAP 服務器。現在我們想臨時從本地機器(LDAP Client)直接連接到這個 LDAP 服務器,只需要在LDAP Client上運用本地端口轉發:
$ ssh -L 7001:localhost:389 LdapServerHost
圖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
$ ssh -R 7001:localhost:389 LdapClientHost
圖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 多主機端口轉發
$ ssh -g -L 7001:<B>:389 <D>
注意:我們在命令中指定了“ -g ”參數以保證機器(A)能夠使用機器(C)建立的本地端口轉發。
References:
[1] man 1 ssh
[2] IBM DeveloperWorks – 實戰 SSH 端口轉發
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 的***。這種方法,可謂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 中的大夥:)