命令列也強大之ssh高階:轉寄與隧道

來源:互聯網
上載者:User

http://liuzuhuijunlian.blog.163.com/blog/static/72489767201143111047638/

古人以“夜不閉戶”、“路不拾遺”來形容大治之世。他們認為大治時,人們的道德水平已經很高了。而早期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
命令格式為:

?View Code BASH
ssh -R ::

假設主機A提供了HTTP服務,即在受限網路內部可以訪問的網頁伺服器。但這個服務因為防火牆策略或者NAT路由的原因導致在Internet無法訪問。那麼我們就可以將本地的HTTP服務遠程轉寄到Internet上的主機B

?View Code BASH
ssh -fNgR 80:localhost:80 root@host-B

然後在Internet上可以通過訪問 http://host-B來訪問主機A上的HTTP服務了

如果沒有主機B的root帳號,則只能遠程轉寄到1024以後的連接埠號碼

?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”,也無法被大防火牆檢測到(淚流滿面,終於講到關鍵了)

附加參數簡要說明:

?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

它的命令格式為

?View Code BASH
ssh -L ::

和遠程轉寄原理類似但方向相反。假設主機B有HTTP服務,但因為受限網路內其它主機因憎惡“大防火牆”F而不願意直接存取主機B(這種心理我也有)。那就可以通過本地轉寄了

?View Code BASH
ssh -fNgL 80:localhost:80 root@host-B

因為和遠程轉寄類似,後面就不再詳述。

三、動態轉寄

指定一個本地機器 “動態” 應用程式連接埠轉寄. 工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 連接埠, 一旦這個連接埠上有了串連,該串連就經過安全通道轉寄出去, 根據應用程式的協議可以判斷出遠程主機將和哪裡串連. 目前支援SOCKS 協議, ssh 將充當 SOCKS 伺服器.只有 root 才能轉寄特權連接埠. --摘自ssh的中文manual

可以這樣理解,遠程轉寄和本地轉寄都是在隧道上傳輸一個服務,比如例子中的HTTP資料流。而動態轉寄則是為了在隧道上傳輸多種不確定的網路服務。它的表現就把遠端ssh伺服器當作了一個安全的Proxy 伺服器。

命令格式為

?View Code BASH
$ ssh -D

假設主機A想要訪問受限網路所限制訪問的主機C、D、E等,或者想要訪問主機B上的“SB”內容。則可有D選項建立動態隧道

?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下使用,它的格式為:

?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的位置

?View Code BASH
export DISPLAY=:.

然後執行

?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. 如何查看隧道是否建立完善
查看進程:

?View Code BASH
ps aux | grep ssh

查看連接埠:

?View Code BASH
netstat -ntl

4. 因為F,串連還是不穩定,隧道經常無法使用
去除-N,-n,-f選項,進入遠程shell,輸入一些需要頻繁互動資料的命令,使串連一直處於活動狀態。比如

?View Code BASH
top

我更推薦用這樣的命令,對系統的負載消耗更小(而且更加美觀)

?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串連傳輸的一個“隧道”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.