SSH 反向連接(反向隧道)設置法

為了資安目前大部分的的機器都都放置在防火牆底下,只允許內部主動連出去,但不允許外部連接進來。

不過現實世界就是會有一些臨時性的例外,此時便可以利用「設置 ssh 反向連接」來解決這個短暫需求。

概念如下圖:

  1. 防火牆外的機器,正常狀況無法連線到防火牆後面的機器,如「紅線」所示,連線都被防火牆擋下。
  2. 本文重點所在,讓防火牆內機器(例:192.192.100.1)先「主動」連接(咖啡色實線)到防火牆外的某部機器(例:192.168.100.1),藉此連線同時「被動」的建出一條專屬連線(咖啡色虛線),這條連線就稱為「反向連線」(反向隧道)。

 

實作開始

  1. 確認「防火牆內機器(例:192.192.100.1)」可以 ssh 登入 「防火牆外機器(例:192.168.100.1)」。(此為「正向連線」)
  2. 建立反向連線
  3. 在「防火牆內機器(例:192.192.100.1)」執行以下命令,目的是跟「防火牆外機器(例:192.168.100.1)」建立反向連線。

    完整語法是:
    ssh -NfR 遠端主機 A:3209:想連上主機B:22 帳號@遠端主機 A

    而,我們這裡則寫成:
    ssh -NfR 3209:localhost:22 帳號@192.168.100.1

    說明:
    -N 參數:表示只連線遠端主機,不開啟遠端 shell。

    -f 參數:表示 ssh 連線成功後,轉入背景執行。這樣一來,就可以在不中斷 ssh 連線的情況下,在本地端中進行其他操作。

    -R 參數:表面上 R 參數是接受三個值,分別是「遠端主機A埠號:想連上主機B:想連上主機B埠號」(3209:localhost:22)。

    事實上完整寫法是兩大段, 遠端主機 A:埠號:想連上主機 B:埠號,而遠端主機 A:埠號中的遠端主機 A可以省略,所以就變成現在慣見的三個值「遠端主機埠號:想連上主機:想連上主機埠號」。

    另外,想連上主機,可以是目前正登入的這部主機(192.168.100.1)本身,所以這裡用「localhost」。也可以是其他的主機,而若是其他的主機,就要換成其他主機的 IP 。

    在這裡遠端主機埠 3209,指的是一旦建立反向連線成功,便會在「防火牆外機器(例:192.168.100.1)」上開啟 3209 埠,然後讓「防火牆外機器(例:192.168.100.1)」監聽它自己的 3209 埠。

    而 localhost:22 的意思,是指想連上的主機是目前登入的這部主機自己(localhost , 192.192.100.1),也就是只要是從遠端主機3209埠出來的資料,就會全部由 目前這部主機(localhost) 22 埠 轉進來。

    若是想連上的主機是其他機器的 22 埠,則那部機器則要能夠以 ssh 登入。

    不一定要「3209」埠,只要是合法且閒置的埠,都可以使用。

    所以完整的命令應該是:ssh -NfR 192.192.100.1:3209:localhost:22 帳號@192.168.100.1 ,遠端主機 192.168.100.1 省略掉了!

     

  4. 防火牆外機器如何連回防火牆內的機器
  5. 語法:
    ssh 帳號@localhost -p 3209

    說明:
    帳號是「防火牆內機器(例:192.192.100.1)」上能以 ssh 登入的真實帳號。

    -p 3209 :3209 是一開始建立反向連線時設定的埠號。

     

  6. 在「防火牆外機器」上,若想 scp「防火牆內的機器」上的檔案?
  7. 語法:
    scp -P 3209 帳號@localhost:/(目錄)/檔案 ./

    說明:
    -P 3209:注意是大寫的P,3209 是一開始建立反向連線時設定的埠號。

     

  8. 在「防火牆外機器」上,若想 rsync「防火牆內的機器」上的檔案?
  9. 語法:
    rsync -avz -e ‘ssh -p 3209’ 帳號@localhost:/(目錄)/檔案 ./

    說明:

    透過使用 -e 參數。

    -e 參數其用途是指定遠端登入所要使用的指令,預設的指令就是 ssh,而這裡我們將指令變更為 ssh -p 3209,也就是使用 3209 這個連接埠登入 ssh 的意思,可詳細參考 ssh 指令的 -p 參數用法。

     

  10. 如何避免 ssh 斷線
  11. 為了安全起見,ssh 連線時,在一定時間內若無動作,預設值是「強制斷線」。

    若不想斷線造成困擾,有兩種作法:

    • SSH Client
    • 若只想針對某一使用者,只要在該使用者的 ~/.ssh/config 檔案,加入底下兩行。

      要注意 第二行開始的位置, 必須像上面一樣加上空格

      Host *
      ServerAliveInterval 100

       

      若想對全部使用者的話,在 /etc/ssh/ssh_config 檔案加入一行:

      ServerAliveInterval 100

       

    • SSH Server
    • 修改或編輯 /etc/ssh/sshd_config 檔案:

      ClientAliveInterval 60
      ClientAliveCountMax 3
      #每60秒自動傳送3個訊號給client,而等待client回應

 

參考資源

  1. ssh用法及命令
  2. https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/508094/

  3. SSH 用法进阶 —— 免密登录与端口转发
  4. https://icebergu.com/archives/ssh

    • 远程转发是指将发送到远端主机的请求转发到本地的目标端口
    • ssh -Nf -R <远程主机地址>:<远程主机端口>:<本地目标地址>:<本地目标端口> @

      在本地执行 ssh 远程转发命令,访问 <远程主机地址>:<远程主机端口>时,请求会转发到本地<本地目标地址>:<本地目标端口>

      <远程主机地址>: 可以省略,默认为 127.0.0.1,可以设置为 0.0.0.0 在所有网卡上建立转发 转发远程主机的非 localhost ip 时,需要修改 /etc/ssh/sshd_config

    • ssh -Nf R 10022:localhost:22 iceber@
    • 将远程主机的 localhost:10022 端口接收的请求转发到本地 localhost:22 中,这时在外网登录远程主机,然后 ssh -p 10022 @localhost 就可以登录到局域网中了。

  5. 防止 SSH 連線逾時斷線
  6. https://www.ltsplus.com/linux/disable-ssh-timeout

  7. A visual guide to SSH tunnels
  8. https://robotmoon.com/ssh-tunnels/

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*