1. 程式人生 > >三種不同類型的ssh隧道

三種不同類型的ssh隧道

html 應用 支持 ces 動態 開放 groov 所有 隧道

何謂SSH隧道

隧道是一種把一種網絡協議封裝進另外一種網絡協議進行傳輸的技術。這裏我們研究ssh隧道,所以所有的網絡通訊都是加密的。又被稱作端口轉發,因為ssh隧道通常會綁定一個本地端口,所有發向這個端口端口的數據包,都會被加密並透明地傳輸到遠端系統。

SSH隧道的類型

ssh隧道有3種類型:

  1. 動態端口轉發(Socks 代理)
  2. 本地端口轉發
  3. 遠端端口轉發

動態端口轉發

動態端口允許通過配置一個本地端口,把通過隧道到數據轉發到遠端的所有地址。本地的應用程序需要使用Socks協議與本地端口通訊。此時SSH充當Socks代理服務器的角色。

命令格式

ssh -D [bind_address:]port

參數說明

  • bind_address 指定綁定的IP地址,默認情況會綁定在本地的回環地址(即127.0.0.1),如果空值或者為*會綁定本地所有的IP地址,如果希望綁定的端口僅供本機使用,可以指定為localhost
  • port 指定本地綁定的端口

使用場景

假設X網絡(192.168.18.0/24)有主機A(192.168.18.100),Y網絡(192.168.2.0/24)有主機B(192.168.2.100)和主機C(192.168.2.101),已知主機A可以連接主機B,但無法連接主機C。

在主機A執行

$ ssh -D localhost:8080 root@192.168.2.100

然後主機A上的應用程序就可以通過

SOCKS5 localhost:8080

訪問主機C上的服務。

優點

  • 配置一個代理服務就可以訪問遠端機器和與其所在子網絡的所有服務

缺點

  • 應用程序需要額外配置SOCKS代理,若應用程序不支持代理配置則無法使用

本地端口轉發

通過SSH隧道,將一個遠端機器能夠訪問到的地址和端口,映射為一個本地的端口。

技術分享圖片

命令格式

ssh -L [bind_address:]port:host:hostport

參數說明

  • bind_address 指定綁定的IP地址,默認情況會綁定在本地的回環地址(即127.0.0.1),如果空值或者為*會綁定本地所有的IP地址,如果希望綁定的端口僅供本機使用,可以指定為localhost
  • port 指定本地綁定的端口
  • host 指定數據包轉發目標地址的IP,如果目標主機和ssh server是同一臺主機時該參數指定為localhost
  • host_port 指定數據包轉發目標端口

使用場景

假設X網絡(192.168.18.0/24)有主機A(192.168.18.100),Y網絡(192.168.2.0/24)有主機B(192.168.2.100)和主機C(192.168.2.101),已知主機A可以連接主機B,但無法連接主機C。A主機需要訪問C主機的VNC服務(5900端口)

在A主機上建立本地轉發端口5901

$ ssh -L 5901:192.168.2.101:5900 root@192.168.2.100

然後本地vnc客戶端通過5901端口打開c主機的vnc服務

$ open vnc://localhost:5901

優點

  • 無需設置代理

缺點

  • 每個服務都需要配置不同的端口轉發

遠端端口轉發

遠程端口轉發用於某些單向阻隔的內網環境,比如說NAT,網絡防火墻。在NAT設備之後的內網主機可以直接訪問公網主機,但外網主機卻無法訪問內網主機的服務。如果內網主機向外網主機建立一個遠程轉發端口,就可以讓外網主機通過該端口訪問該內網主機的服務。可以把這個內網主機理解為“內應”和“開門者”。

技術分享圖片

命令格式

ssh -R [bind_address:]port:host:hostport

參數說明

  • bind_address 指定綁定的IP地址,默認情況會綁定在本地的回環地址(即127.0.0.1),如果空值或者為*會綁定本地所有的IP地址,如果希望綁定的端口僅供本機使用,可以指定為localhost
  • port 指定本地綁定的端口
  • host 指定數據包轉發源地址的IP,如果源主機和ssh server是同一臺主機時該參數指定為localhost
  • host_port 指定數據包轉發源端口

使用場景

假設X網絡(192.168.18.0/24)有主機A(192.168.18.100),Y網絡(192.168.2.0/24)有主機B(192.168.2.100)和主機C(192.168.2.101),已知主機A可以通過SSH訪問登錄B主機,但反向直接連接被禁止,主機B和主機C可以相互訪問。若主機C想訪問主機A的VNC服務(5900端口)。

在主機A執行如下命令,開放B主機遠端端口轉發。

$ ssh -R 5900:192.168.2.100:5901 root@192.168.2.100

然後主機C連接主機B的5901端口

$ open vnc://192.168.2.100:5901

優點

  • 可以穿越防火墻和NAT設備

缺點

  • 每個服務都需要配置不同的端口轉發

如何禁止端口轉發

設置ssh服務配置文件/etc/ssh/sshd_config

AllowTcpForwarding no

參考文獻

  1. SSH Tunneling Explained
  2. How to do SSH Tunneling (Port Forwarding)
  3. SSH端口轉發以及應用實例

三種不同類型的ssh隧道