SSH的隧道學習

應用數據通過ssh,完成加密,轉發,解密,通訊。

ssh連接方向和應用連接方向相同,就是本地端口轉發,不同就是遠程端口轉發。

ssh功能


  • 第一個就是端口轉發命令
    轉發控制的命令,實現遠程控制。
  • 第二個就是代理上網
    制定本地的一個端口映射到服務器的某一個特定端口。ssh服務使得本地運行一個代理服務器。然後本地代理服務器負責數據請求的轉發。

端口轉發

1.加密SSH Client 端至SSH Server 端之間的通訊數據
2.突破防火牆的限制完成一些之前無法建立的TCP 連接

  • 端口本地轉發(出口隧道)
    將本地機(客戶機)的某個端口轉發到遠端指定機器的指定端口. 工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有了連接, 該連接就經過安全通道轉發出去, 同時遠程主機和 host的 hostport 端口建立連接. 可以在配置文件中指定端口的轉發. 只有 root 才能轉發特權端口.
    ssh -C -f -N -g -L 本地端口:目標IP:目標端口 用戶名@目標IP

    • 本地端口轉發,是將本地端口轉發到指定的遠端端口.
      例如, 將所有發送到本地機器10000端口的請求,都轉發至遠端機器的22端口.
    • 通過家庭電腦,訪問辦公室的服務器,可以通過ssh連接辦公室的服務器,設置本地端口轉發實現.
      home$ ssh [email protected] -L 10000:172.16.10.10:22
  • 端口遠程轉發(入口隧道)(相對於設置命令的電腦:家庭電腦地址:192.168.10.10)
    將遠程主機(服務器)的某個端口轉發到本地端指定機器的指定端口. 工作原理是這樣的, 遠程主機上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有了連接, 該連接就經過安全通道轉向出去, 同時本地主機和host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉發. 只有用 root 登錄遠程主機才能轉發特權端口.
    ssh -C -f -N -g –R 本地端口:目標IP:目標端口 用戶名@目標IP

    • 它將遠端端口的請求,轉發至本地機器的指定端口. 例如將服務器上22端口的請求,全部轉發至本地機器的10000端口.
    • 如果想要在公司,訪問家裏的電腦,這個時候,就可以使用遠端端口轉發了. 在家庭電腦上使用如下命令:
      ·home$ ssh [email protected] -R 10000:192.168.1.10:22
      現在能登錄到你公司電腦的同事, 就可以直接通過ssh訪問你的家庭電腦了.通過以下命令:
      work.example.org$ ssh user@localhost -p 10000
      如果要想通過辦公室同一子網內的其它電腦,訪問你的家庭電腦, -g 選項是不行的.因爲遠端端口轉發是沒有-g選項的.你需要修改公司機器(work.example.org)上的sshd_config 文件.
      GatewayPorts yes
  • 動態轉發
    指定一個本地機器 “動態的” 應用程序端口轉發. 工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有了連接,該連接就經過安全通道轉發出去, 根據應用程序的協議可以判斷出遠程主機將和哪裏連接. 目前支持 SOCKS 協議, ssh 將充當 SOCKS 服務器.只有 root 才能轉發特權端口.
    ssh-D 1080 root@sshserver
    假設主機A想要訪問受限網絡所限制訪問的主機C、D、E等(但是主機B可以訪問),或者想要訪問主機B上的“SB”內容。則可有D選項建立動態隧道
    ssh -CfNg -D 8888 lige@host-B

上網代理


如果我們需要藉助一臺中間服務器訪問很多資源,一個個映射顯然不是高明的辦法(事實上,高明確實沒有用這個方法)。幸好,SSH客戶端爲我們提供了通過SSH隧道建立SOCKS服務器的功能。

當本地1080端口受到外部網站請求會轉發到外部服務器上面去,代理服務器通過1080端口把請求轉發到站點服務器上面去

附隧道原理


對網絡原理不太懂或不感興趣的可以忽略此部分

總的來說: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連接傳輸的一個“隧道”
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章