ssh端口轉發原理

OpenSSH 通過其加密的數據通道可以創建三種類型的端口轉發,分別是本地(Local)、遠程(Remote)和動態(Dynamic)。那麼這三種類型的端口轉發具體是如何工作的呢?下面就分別說一下,只是說一下大致的工作過程,不是詳細的實現。

本地(Local)

ssh-N-L bind_address:bind_port:host_name:host_port username@server_address

當上面的命令被執行後,運行在客戶端的 ssh 進程先連接運行在服務器端(server_address) sshd 進程,並進行身份驗證。如果驗證成功了,ssh 和 sshd 之間會建立一個 TCP/IP 連接,用於傳輸數據,這個連接上面傳輸的數據是加密的。

接着 ssh 會在 bind_address:bind_port 上創建一個 TCP/IP 協議的 socket 並進行偵聽,當收到數據後直接通過之前建立的連接傳輸給服務器上的 sshd 進程, sshd 收到數據後會新建一個 socket 連接 host_name:host_port 並向其發送之前收到的數據。

相反,當 sshd 收到數據後也會按類似的方式通道加密通道傳輸給 ssh 進程。這樣通過加密通道的本地端口轉發就工作起來了。

遠程(Remote)

ssh-N-R bind_address:bind_port:host_name:host_port username@server_address

遠程類型的端口轉發和本地類型的原來是一樣的,只是偵聽的端口剛好相反。這種類型的端口轉發是 sshd 進程創建一個 TCP/IP 協議的 socket 在 bind_address:bind_port 上偵聽,而 ssh 則是在第一次收到數據後創建 socket 連接 host_name:host_port。

動態(Dynamic)

ssh-N-D bind_address:bind_port username@server_address

動態類型的轉發是 ssh 創建一個 socks v5 的服務並在 bind_address:bind_port 上偵聽,當收到數據後,解析出需要連接的主機和端口並通道加密通道發送給 sshd,sshd 轉發數據後並返回結果數據。

特別的地方就在被連接的主機是通過 socks v5 進行動態確定的。這樣的端口轉發功能用作加密代理是不錯的選擇。

http://www.ibm.com/developerworks/cn/linux/

https://www.fdb713.com/whats-the-meaning-of-l-r-option-in-ssh-man-page/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章