Last-Modified: 2019年6月5日15:45:11html
創建ssh隧道經常使用於, 經過一臺公網的主機或者是你們均可以訪問的主機作跳起色,來訪問內部或者外部不能直接訪問的機器.redis
項目當前用途:vim
因爲服務端上假設架設的redis未設置加密, 所以經過防火牆了屏蔽redis端口(6379), 其餘外網機器須要鏈接到該端口就可使用ssh隧道創建端口轉發繞過防火牆.服務器
參考文章: https://www.cnblogs.com/fbwfb...ssh
我的簡單理解:tcp
ssh -Nf -L {本地端口}:{目標機器}:{目標端口} {中間機器} # 或 ssh -Nf -L {本地地址}:{本地端口}:{目標機器}:{目標端口} {中間機器} # -N 不執行遠程指令 # -f 後臺執行ssh命令 # -L local隧道, [bind_address:]port:host:hostport # -4 強制使用ipv4地址
若{本地地址}
未配置, 則默認爲 127.0.0.1
, 即只有本機能夠訪問該轉發端口加密
{目標機器}
若填 「127.0.0.1」, 則指的是直接轉發到中間機器
ssh -f -N -L 36901:127.0.0.1:3690 root@xx.xx.xx.xx
即創建ssh隧道, 本地訪問36901端口時, 會被轉發到root@xx.xx.xx.xx
的3690端口spa{中間機器}
可指定登錄的用戶名{user@xx.xx.xx.xx}
示例代理
目的: A要訪問C, 但被B屏蔽rest
手段: A經過D來間接訪問C
# 如下命令都是在 192.168.0.100 上執行 # 從 192.168.0.100 經過 123.123.123.123 訪問 234.234.234.234 ssh -N -f -L 2121:234.234.234.234:21 123.123.123.123 ftp localhost:2121 # 如今訪問本地2121端口,就能鏈接234.234.234.234的21端口了
-L 作本地映射端口,被冒號分割的三個部分含義分別是
最後一個參數是咱們用來創建隧道的中間機器的IP地址(IP: 123.123.123.123)
-L X:Y:Z的含義是,將IP爲Y的機器的Z端口經過中間服務器映射到本地機器的X端口。
# ssh -Nf -R {遠程端口}:{本地機器}:{本地端口} {遠程機器} # 或 ssh -Nf -R {遠程綁定地址}:{遠程端口}:{本地機器}:{本地端口} {遠程機器}
{本地機器}
不必定是本機, 也能夠是局域網內與本機聯通的主機, 任何訪問{遠程機器}:{遠程端口}
的都會被鏈接到 {本地機器}:{本地端口}
, 執行上述命令的主機本質上是做爲中轉主機.{遠程綁定地址}
若不填寫, 則默認是 127.0.0.1
, 若要容許其餘機器經過 {遠程機器}:{遠程端口}
來訪問該隧道, 則可將該地址配置爲 0.0.0.0
(即{遠程機器}
上會監聽來自 0.0.0.0:{遠程端口}
的tcp鏈接{遠程機器}
記得將 sshd 的 GatewayPorts
打開
vim /etc/ssh/sshd_config # GatewayPorts yesservice sshd reload
示例
利用 A(內網)-B-D 方向的鏈接 來創建 D-B-A方向的訪問
# 在 192.168.0.100 上執行以下命令 ssh -Nf -R 2222:127.0.0.1:22 123.123.123.123 # 在遠程 123.123.123.123 機器上執行以下命令便可鏈接到 A機器(192.168.0.100)的22端口 ssh -p 2222 localhost
-R 參數
配置使用密鑰鏈接
隧道可能由於某些緣由斷開,例如:機器重啓,長時間沒有數據通訊而被路由器切斷等等。
能夠經過配置 supervisord, 確保連接斷開時自動重連, 但配置時應去掉 -f
參數(不放在後臺執行)
自動重連需配合"免密碼登錄"
supervisord配置示例
[program:ssh_tunel_3690] command=ssh -N -L 36901:127.0.0.1:3690 publisher@123.59.85.161 numprocs=1 autostart=true autorestart=true startretries=10 redirect_stderr=true stdout_logfile=/data/tmp/supervisord/ssh_tunel_3690.log
supervisorctl update