?端口轉發的概念和應用

? ? ??

? ? ? ?什么是端口轉發呢,我們知道,SSH 會自動加密和解密所有 SSH 客戶端與服務端之間的網絡數據。但是,SSH 還同時提供了一個非常有用的功能,這就是端口轉發。它能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發,并且自動提供了相應的加密及解密服務。這一過程有時也被叫做“隧道”,這是因為 SSH 為其他 TCP 鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP 這些 TCP 應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果在平時的工作環境中有防火墻限制了一些網絡端口的使用,但是允許 SSH 的連接,那么也是能夠通過將 TCP 端口轉發來使用 SSH 進行通訊。所以總的來說 SSH 端口轉發能夠提供兩大功能:

  1. 加密 SSH Client 端至 SSH Server 端之間的通訊數據。

  2. 突破防火墻的限制完成一些之前無法建立的 TCP 連接。


本地端口轉發

? ? ? ??wKioL1naJ2eCL-fIAABYgp-QXww679.png-wh_50

? ? a要訪問c先將telnet用ssh封裝,傳到b后,解封后,再以telnet方式訪問c,此時的c認為是b通過telnet再鏈接自己,而其實是a在鏈接(要保證防火墻上的端口是打開著的,如果沒打開,就進不來了,需要進行遠程端口轉發,后面解釋)

實例:

?acentos5,b是centos6,c是centsos7,首先在a上制定防火墻策略,即禁止a訪問,如下指令

iptables -A INPUT -s 192.168.37.105 -j REJECT

? ?然后啟動a的telnet服務

systemctl?start?telnet.socket

? ? 接下來在a上執行如下命令

ssh?-L?9527.192.168.37.107:23?-fN?192.168.37.106

? ? ?9527是a的發出端口,在執行前,最好檢查下(ss -nutl)有么有程序占用著這個端口,后面的ip地址是目標也就是c的ip地址,23是c的接收端口,在后面的地址是b的地址,也就是接收ssh鏈接的b,fn是后臺啟用且不打開7的shell,而是處于等待狀態,執行完后,隧道已經就建立了,可使用ss -nt查看

此時,用a鏈接c,就執行如下命令

telnet 127.0.0.01 9527

? ?這時,可以在c上執行,下面的命令

ss?-ntl

? ? 能夠查看到6正在鏈接,在b上使用同樣的命令,看到a在鏈接,也就是說測試此時隧道已經建立起來。


遠程端口轉發

? ? ?與本地端口轉發類似,但是此時防火墻上的端口是關閉的,所以此時用遠程端口轉發即可解決問題。此時,防火墻已經打開,端口不可訪問,只準往外鏈接不能外,部往內部鏈接,因此要想建立鏈接需要從內部鏈接外部,也就是此時命令是在b中打的,執行如下命令

ssh?-R?9527.192.168.37.107:25?-fN?192.168.37.105

也就是l換成R,第一個ip是最終要訪問的7第二個ip是此時充當服務器的ab此時扮演的是客戶端,執行完成后,輸入指令

telnet?127.0.0.1?9527

這里的地址和端口號是a自己的地址和端口號,這樣一個遠程端口轉發就完成了


動態端口轉發

? ?

? ? ?當用firefox訪問internet時,本機的1080端口做為代理服務器, firefox的訪問請求被轉發到sshserver上,由sshserver替之訪問internet在本機firefox設置代理socket proxy:127.0.0.1:1080,它的命令格式如下,

ssh?-D?1080?root@sshserver

動態端口轉發,和本地和遠程端口轉發不一樣,在動態端口轉發中,目標主機地址和端口都不固定,具體轉發到哪里,可以通過代理服務器由自己來指定。