隧道技術摘要
隧道技術(Tunneling)是網絡基礎設置在網絡之間傳遞數據的方式,使用隧道技術傳遞可以是不同協議的數據包,隧道協議將這些其他協議的數據包重新封裝在新的包頭中發送。被封裝的數據包在隧道的兩個端點之間通過網絡進行路由,被封裝數據包在網絡上傳遞時所經歷的邏輯路徑稱為隧道。
簡單來說,隧道技術是一類網絡協議,是將一個數據包封裝在另一個數據包中進行傳輸的技術;使用隧道的原因是在不兼容的網絡上傳輸數據,或在不安全網絡上提供一個安全路徑。通過網絡隧道技術,可以使隧道兩端的網絡組成一個更大的內部網絡。(把不支持的協議數據包打包成支持的協議數據包之后進行傳輸)。
隧道協議
要創建隧道,隧道的客戶機和服務器雙方必須使用相同的隧道技術,隧道協議有二層隧道協議與三層隧道協議兩類。
二層隧道協議對應OSI模型中數據鏈路層,使用幀作為數據交換單位,PPTP、L2TP、L2F都屬於二層隧道協議。是將數據封裝在點對點協議的幀中通過互聯網絡發送。
三層隧道協議對應OSI模型中網絡層,使用包作為數據交換單位,GRE、IPSec、GRE都屬於三層隧道協議。都是數據包封裝在附加的IP包頭中通過IP網絡傳送。
網絡隧道技術應用
隧道在Linux 中應用
IP隧道是指一種可在兩網絡間進行通信的通道。在該通道里,會先封裝其他網絡協議的數據包,之后再傳輸信息。
Linux原生共支持5種IPIP隧道:
- ipip: 普通的IPIP隧道,就是在報文的基礎上再封裝成一個IPv4報文
- gre: 通用路由封裝(Generic Routing Encapsulation),定義了在任意一種網絡層協議上封裝其他任意一種網絡層協議的機制,所以對於IPv4和IPv6都適用
- sit: sit模式主要用於IPv4報文封裝IPv6報文,即IPv6 over IPv4
- isatap: 站內自動隧道尋址協議(Intra-Site Automatic Tunnel Addressing Protocol),類似於sit也是用於IPv6的隧道封裝
- vti: 即虛擬隧道接口(Virtual Tunnel Interface),是一種IPsec隧道技術
LVS中也使用了 IP隧道技術 Virtual Server via IP Tunneling

SSH隧道技術
SSH提供了一個重要功能,稱為轉發forwarding或者稱為隧道傳輸tunneling,它可以通過加密頻道將明文流量導入隧道中,在創建SSH隧道時, SSH客戶端要設置並轉交一個特定本地端口號到遠程機器上;一旦SSH隧道創建,用戶可以連到指定的本地端口號以訪問網絡服務。本地端口號不用與遠地端口號一樣。
SSH隧道主要使用場景一般為 規避防火牆、加密網絡流量
規避防火牆,SSH隧道可以使一個被防火牆阻擋的協議可被包在另一個沒被防火牆阻擋的協議里,這技巧可用來逃避防火牆政策。而這種操作符合“數據包封裝在另一個數據包中進行傳輸的技術”,故稱為SSH隧道技術。
SSH隧道類型
在ssh連接的基礎上,指定ssh client或ssh server的某個端口作為源地址,所有發至該端口的數據包都會透過ssh連接被轉發出去;至於轉發的目標地址,目標地址既可以指定,也可以不指定,如果指定了目標地址,稱為定向轉發,如果不指定目標地址則稱為動態轉發:
定向轉發
定向轉發把數據包轉發到指定的目標地址。目標地址不限定是ssh client 或 ssh server,既可以是二者之一,也可以是二者以外的其他機器。
動態轉發
動態轉發不指定目標地址,數據包轉發的目的地是動態決定的。
2.3.1 本地端口轉發
本地轉發中的本地是指將本地的某個端口(1024-65535)通過SSH隧道轉發至其他主機的套接字,這樣當我們的程序連接本地的這個端口時,其實間接連上了其他主機的某個端口,當我們發數據包到這個端口時數據包就自動轉發到了那個遠程端口上了

2.3.2 遠程端口轉發
遠程轉發和本地很相似,原理也差不多,但是不同的是,本地轉發是在本地主機指定的一個端口,而遠程轉發是由SSH服務器經由SSH客戶端轉發,連接至目標服務器上。本質一樣,區別在於需要轉發的端口是在遠程主機上還是在本地主機上
現在SSH就可以把連接從(39.104.112.253:80)轉發到(10.0.0.10:85)。

2.3.3 動態端口轉發
定向轉發(包括本地轉發和遠程轉發)的局限性是必須指定某個目標地址,如果需要借助一台中間服務器訪問很多目標地址,一個一個地定向轉發顯然不是好辦法,這時就要用的是ssh動態端口轉發,它相當於建立一個SOCKS服務器。各種應用經由SSH客戶端轉發,經過SSH服務器,到達目標服務器,不固定端口。
