端口轉發、Http Tunnel、內網穿透

原文鏈接:https://www.yuque.com/tec-nine/architecture/mgxc71
SSH 命令幫助
命令行選項有:

 -a      禁止轉發認證代理的連接.

 -A      允許轉發認證代理的連接.  可以在配置文件中對每個主機單獨設定這個參數.

         代理轉發須謹慎.  某些用戶能夠在遠程主機上繞過文件訪問權限 (由於代理的 UNIX 域 socket), 他們可以通過轉發的連接訪問本地代理.
         攻擊者不可能從代理獲得密鑰內容, 但是他們能夠操作這些密鑰, 利用加載到代理上 的身份信息通過認證.

 -b bind_address
         在擁有多個接口或地址別名的機器上, 指定收發接口.

 -c blowfish|3des|des
         選擇加密會話的密碼術.  3des 是默認算法.  3des (triple-des) 用三支不同的密鑰做加密-解密-加密三次運算, 被認爲比較可靠.
         blowfish 是一種快速的分組加密術(block cipher), 非常安全, 而且速度比 3des 快的多.  des 僅支持 ssh 客戶端,
         目的是能夠和老式的不支持 3des 的協議第一版互操作. 由於其密碼算法上的弱點, 強烈建議避免使用.

 -c cipher_spec
         另外, 對於協議第二版, 這裏可以指定一組用逗號隔開, 按優先順序排列的密碼術.  詳見 Ciphers.

 -e ch|^ch|none
         設置 pty 會話的 escape 字符 (默認字符: ‘~’).  escape 字符只在行首有效, escape 字符後面跟一個點 (‘.’) 表示結束連接, 跟一個
         control-Z 表示掛起連接(suspend), 跟 escape 字符自己 表示輸出這個字符. 把這個字符設爲 “none” 則禁止 escape 功能,
         使會話完全透明.

 -f      要求 ssh 在執行命令前退至後臺. 它用於當 ssh 準備詢問口令或密語, 但是用戶希望它在後臺進行. 該選項隱含了 -n 選項.
         在遠端機器上啓動 X11 程序的推薦手法就是類似於 ssh -f host xterm 的命令.

 -g      允許遠端主機連接本地轉發的端口.

 -i identity_file
         指定一個 RSA 或 DSA 認證所需的身份(私鑰)文件. 默認文件是協議第一版的 $HOME/.ssh/identity 以及協議第二版的 $HOME/.ssh/id_rsa
         和 $HOME/.ssh/id_dsa 文件. 也可以在配置文件中對每個主機單獨指定身份文件.  可以同時使用多個 -i 選項
         (也可以在配置文件中指定多個身份文件).

 -I smartcard_device
         指定智能卡(smartcard)設備. 參數是設備文件, ssh 能夠用它和智能卡通信, 智能卡里面存儲了用戶的 RSA 私鑰.

 -k      禁止轉發 Kerberos 門票和 AFS 令牌.  可以在配置文件中對每個主機單獨設定這個參數.

 -l login_name
         指定登錄遠程主機的用戶.  可以在配置文件中對每個主機單獨設定這個參數.

 -m mac_spec
         另外, 對於協議第二版, 這裏可以指定一組用逗號隔開, 按優先順序排列的 MAC(消息驗證碼)算法 (message authentication code). 詳情以
         MACs 爲關鍵字查詢.

 -n      把 stdin 重定向到 /dev/null (實際上防止從 stdin 讀取數據).  ssh 在後臺運行時一定會用到這個選項. 它的常用技巧是遠程運行 X11
         程序. 例如, ssh -n shadows.cs.hut.fi emacs & 將會在 shadows.cs.hut.fi 上啓動 emacs, 同時自動在加密通道中轉發 X11 連接.  ssh
         在後臺運行. (但是如果 ssh 要求口令或密語, 這種方式就無法工作; 參見 -f 選項.)

 -N      不執行遠程命令. 用於轉發端口. (僅限協議第二版)

 -o option
         可以在這裏給出某些選項, 格式和配置文件中的格式一樣.  它用來設置那些沒有命令行開關的選項.

 -p port
         指定遠程主機的端口. 可以在配置文件中對每個主機單獨設定這個參數.

 -q      安靜模式. 消除所有的警告和診斷信息.

 -s      請求遠程系統激活一個子系統. 子系統是 SSH2 協議的一個特性, 能夠協助 其他應用程序(如 sftp)把SSH用做安全通路.
         子系統通過遠程命令指定.

 -t      強制分配僞終端.  可以在遠程機器上執行任何全屏幕(screen-based)程序, 所以非常有用, 例如菜單服務. 並聯的 -t 選項強制分配終端,
         即使 ssh 沒有本地終端.

 -T      禁止分配僞終端.

 -v      冗詳模式. 使 ssh 打印關於運行情況的調試信息. 在調試連接, 認證和配置問題時非常有用. 並聯的 -v 選項能夠增加冗詳程度.
         最多爲三個.

 -x      禁止 X11 轉發.

 -X      允許 X11 轉發. 可以在配置文件中對每個主機單獨設定這個參數.

         應該謹慎使用 X11 轉發. 如果用戶在遠程主機上能夠繞過文件訪問權限 (根據用戶的X授權數據庫), 他就可以通過轉發的連接訪問本地 X11
         顯示器.  攻擊者可以據此採取行動, 如監視鍵盤輸入等.

 -C      要求進行數據壓縮 (包括 stdin, stdout, stderr 以及轉發 X11 和 TCP/IP 連接 的數據).  壓縮算法和 gzip(1) 的一樣, 協議第一版中,
         壓縮級別 “level” 用 CompressionLevel 選項控制. 壓縮技術在 modem 線路或其他慢速連接上很有用, 但是在高速網絡上反而
         可能降低速度. 可以在配置文件中對每個主機單獨設定這個參數. 另見 Compression 選項.

 -F configfile
         指定一個用戶級配置文件. 如果在命令行上指定了配置文件, 系統級配置文件 (/etc/ssh/ssh_config) 將被忽略. 默認的用戶級配置文件是
         $HOME/.ssh/config.

 -L port:host:hostport
         將本地機(客戶機)的某個端口轉發到遠端指定機器的指定端口.  工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 端口,
         一旦這個端口上有了連接, 該連接就經過安全通道轉發出去, 同時遠程主機和 host 的 hostport 端口建立連接.
         可以在配置文件中指定端口的轉發. 只有 root 才能轉發特權端口.  IPv6 地址用另一種格式說明: port/host/hostport

 -R port:host:hostport
         將遠程主機(服務器)的某個端口轉發到本地端指定機器的指定端口.  工作原理是這樣的, 遠程主機上分配了一個 socket 偵聽 port 端口,
         一旦這個端口上有了連接, 該連接就經過安全通道轉向出去, 同時本地主機和 host 的 hostport 端口建立連接.
         可以在配置文件中指定端口的轉發. 只有用 root 登錄遠程主機 才能轉發特權端口. IPv6 地址用另一種格式說明: port/host/hostport

 -D port
         指定一個本地機器 “動態的” 應用程序端口轉發. 工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 端口,
         一旦這個端口上有了連接, 該連接就經過安全通道轉發出去, 根據應用程序的協議可以判斷出遠程主機將和哪裏連接. 目前支持 SOCKS4 協議,
         ssh 將充當 SOCKS4 服務器. 只有 root 才能轉發特權端口.  可以在配置文件中指定動態端口的轉發.

 -1      強制 ssh 只使用協議第一版.

 -2      強制 ssh 只使用協議第二版.

 -4      強制 ssh 只使用 IPv4 地址.

 -6      強制 ssh 只使用 IPv6 地址.

阿里雲-內網穿透示例

ssh -CqTnN -R 9000:127.0.0.1:8081 aliyun

本地轉發模式原理

創建本地轉發模式的ssh隧道,命令如下

ssh -g -f -N -L forwardingPort:targetIP:targetPort user@sshServerIP

本機上的forwardingPort將會被監聽,訪問本機的forwardingPort,就相當於訪問targetIP的targetPort,ssh隧道建立在本機與sshServer之間

本地轉發模式 - 方案示例一

ServerA:10.1.0.1

ServerB:10.1.0.2

A#

ssh -f -N -L 9906:10.1.0.2:3306 [email protected]

上述命令表示從本機(ServerA)建立一個到ServerB(10.1.0.2)的ssh隧道,使用本地端口轉發模式,監聽ServerA本地的9906端口,訪問本機的9906端口時,通訊數據將會被轉發到ServerB(10.1.0.2)的3306端口。

本地轉發模式 - 方案示例二

ServerAIP:10.1.0.1

ServerBIP:10.1.0.2

ServerCIP:10.1.0.3

ServerA與ServerB上沒有開啓任何mysql服務。

ServerC中開啓了mysql服務,監聽了3306端口。

A#

ssh -f -N -L 9906:10.1.0.3:3306 [email protected]

上述命令表示,從本機(ServerA)建立一條ssh隧道連接到10.1.0.2(ServerB),隧道使用本地轉發模式建立,轉發端口監聽在本地的9906端口上,訪問本機的9906端口時,數據會被ssh隧道轉發到10.1.0.3(ServerC)的3306端口。

遠程轉發模式原理

創建遠程轉發模式的ssh隧道,命令如下

ssh -f -N -R forwardingPort:targetIP:targetPort user@sshServerIP

sshServer上的forwardingPort將會被監聽,訪問sshServer上的forwardingPort,就相當於訪問targetIP的targetPort,ssh隧道建立在本機與sshServer之間。

遠程轉發模式 - 方案示例

B#

ssh -f -N -R 9906:10.1.0.2:3306 [email protected]

上述命令在ServerB中執行,執行後,即可在ServerA與ServerB之間建立ssh隧道,此時,ServerB是ssh客戶端,ServerA是ssh服務端,隧道建立後,ServerA中的9906端口會被監聽。此刻,我們通過外網IP登錄到ServerA,在ServerA中訪問本地迴環地址的9906端口,即可訪問到內網ServerB中的mysql服務。

不過你肯定注意到了,當使用遠程轉發的命令時,我並沒有指定監聽ServerA的外網IP,也沒有使用"-g選項"開啓網關功能,這是因爲,即使你在命令中指定了IP地址,最終在ServerA中還是會只監聽127.0.0.1的9906端口,你可以在ServerB中嘗試一下如下命令

ssh -f -N -R 10.1.0.1:9906:10.1.0.2:3306 [email protected]

即使在ServerB中執行上述命令時指定了IP或者開啓了網關功能,ServerA的9906端口仍然只監聽在127.0.0.1上,當然,如果你一心想要通過別的主機訪問ServerA的9906端口,也可以使用其他程序去反代ServerA的9906端口。
Linux解決ssh tunnels端口不能轉發問題
Linux解決ssh tunnels端口不能轉發問題

我們需要打開公網服務器網管開關/etc/ssh/sshd_config 修改 GatewayPorts yes

參考資料

  1. SSH隧道、端口轉發和內網穿透 https://www.processon.com/view/link/642b8baa3aff4d5813d424b7
  2. ssh使用密鑰進行認證 http://www.zsythink.net/archives/2375
  3. ssh代理轉發 http://www.zsythink.net/archives/2422
  4. ssh端口轉發:ssh隧道 http://www.zsythink.net/archives/2450
  5. ssh反向代理實現內網穿透【親測可用】https://blog.csdn.net/liuxingyuzaixian/article/details/128705262
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章