為了資安目前大部分的的機器都都放置在防火牆底下,只允許內部主動連出去,但不允許外部連接進來。
不過現實世界就是會有一些臨時性的例外,此時便可以利用「設置 ssh 反向連接」來解決這個短暫需求。
概念如下圖:
- 防火牆外的機器,正常狀況無法連線到防火牆後面的機器,如「紅線」所示,連線都被防火牆擋下。
- 本文重點所在,讓防火牆內機器(例:192.192.100.1)先「主動」連接(咖啡色實線)到防火牆外的某部機器(例:192.168.100.1),藉此連線同時「被動」的建出一條專屬連線(咖啡色虛線),這條連線就稱為「反向連線」(反向隧道)。
實作開始
- 確認「防火牆內機器(例:192.192.100.1)」可以 ssh 登入 「防火牆外機器(例:192.168.100.1)」。(此為「正向連線」)
- 建立反向連線
- 防火牆外機器如何連回防火牆內的機器
- 在「防火牆外機器」上,若想 scp「防火牆內的機器」上的檔案?
- 在「防火牆外機器」上,若想 rsync「防火牆內的機器」上的檔案?
- 如何避免 ssh 斷線
- SSH Client
- SSH Server
在「防火牆內機器(例: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 省略掉了!
ssh 帳號@localhost -p 3209
說明:
帳號是「防火牆內機器(例:192.192.100.1)」上能以 ssh 登入的真實帳號。
-p 3209 :3209 是一開始建立反向連線時設定的埠號。
scp -P 3209 帳號@localhost:/(目錄)/檔案 ./
說明:
-P 3209:注意是大寫的P,3209 是一開始建立反向連線時設定的埠號。
rsync -avz -e ‘ssh -p 3209’ 帳號@localhost:/(目錄)/檔案 ./
說明:
透過使用 -e 參數。
-e 參數其用途是指定遠端登入所要使用的指令,預設的指令就是 ssh,而這裡我們將指令變更為 ssh -p 3209,也就是使用 3209 這個連接埠登入 ssh 的意思,可詳細參考 ssh 指令的 -p 參數用法。
為了安全起見,ssh 連線時,在一定時間內若無動作,預設值是「強制斷線」。
若不想斷線造成困擾,有兩種作法:
若只想針對某一使用者,只要在該使用者的 ~/.ssh/config 檔案,加入底下兩行。
Host *
ServerAliveInterval 100
若想對全部使用者的話,在 /etc/ssh/ssh_config 檔案加入一行:
修改或編輯 /etc/ssh/sshd_config 檔案:
ClientAliveCountMax 3
#每60秒自動傳送3個訊號給client,而等待client回應
參考資源
- ssh用法及命令
- SSH 用法进阶 —— 免密登录与端口转发
- 远程转发是指将发送到远端主机的请求转发到本地的目标端口
- ssh -Nf R 10022:localhost:22 iceber@
- 防止 SSH 連線逾時斷線
- A visual guide to SSH tunnels
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/508094/
https://icebergu.com/archives/ssh
ssh -Nf -R <远程主机地址>:<远程主机端口>:<本地目标地址>:<本地目标端口>
在本地执行 ssh 远程转发命令,访问 <远程主机地址>:<远程主机端口>时,请求会转发到本地<本地目标地址>:<本地目标端口>
<远程主机地址>: 可以省略,默认为 127.0.0.1,可以设置为 0.0.0.0 在所有网卡上建立转发 转发远程主机的非 localhost ip 时,需要修改 /etc/ssh/sshd_config
将远程主机的 localhost:10022 端口接收的请求转发到本地 localhost:22 中,这时在外网登录远程主机,然后 ssh -p 10022 @localhost 就可以登录到局域网中了。
https://www.ltsplus.com/linux/disable-ssh-timeout