背景介紹:
目前,線上有好幾個資料中心,不同資料中心之間的速度差異還是比較大的,我們一般選擇一個最優的資料中心作為VPN的存取點。
但有些時候直接通過VPN訪問其它資料中心的服務會很慢,於是就臨時通過SSH Tunnel來解決。
應用情境:
直接存取伺服器idc1-server1很快,但是直接存取idc2-server2很慢,而idc1-server1到idc2-server2卻很快;
於是,我們打算用idc1-server1伺服器作為跳板來串連idc2-server2。
ssh -i /path/to/sshkey -l username -f -N -T -L 8088:idc2-server2:80 idc1-server1
通過瀏覽器直接存取http://localhost:8088就相當於訪問了http://idc2-server2
關鍵參數介紹:
-L 8088:idc2-server2:80
將本地的某個連接埠轉寄到遠端指定機器的指定連接埠。工作原理是:本地機器上分配了一個socket偵聽port連接埠,一旦這個連接埠上有了串連, 該串連就經過安全隧道(idc1-server1)轉寄出去,即
localhost:8088 -> (idc1-server1) -> idc2-server2:80;
ssh -i /path/to/sshkey -l username -f -N -T -L 2022:idc2-server2:22 idc1-server1
通過scp可以將檔案通過idc1-server1中轉後傳送到idc2-server2中:
scp -i /path/to/sshkey -P 2022 upload_file_name.tgz dong@localhost:/path/to/upload/
假設
位於公網的用戶端是10.66.0.78(當然事實上這是一個私網IP),
公司有一個暴露在公網的主機,公網IP是10.66.0.190(當然事實上這還是一個私網IP),公司私網的IP是192.168.200.20,
我在公司真正要登入的主機是192.168.200.100。
那麼我可以做如下操作
方法1
在 10.66.0.190上執行
[root@dhcp-0-190 ~]# ssh -Nf -L 10.66.0.190:10000:localhost:22 192.168.200.100
方法2
a. 在10.66.0.190上修改設定檔/etc/ssh/sshd_config
開啟
GatewayPorts yes
然後重新載入sshd配置
[root@dhcp-0-190 ~]# service sshd reload
Reloading sshd: [ OK ]
b. 然後在192.168.200.100上執行
[root@localhost ~]# ssh -Nf -R 10.66.0.190:10000:192.168.200.100:22 192.168.200.20
然後我們就可以在公網通過訪問10.66.0.190:10000連接埠來串連192.168.200.100的22連接埠了。
安全因素
大家看我上面其中2條命令
# ssh -Nf -L 10000:localhost:80 209.132.177.100
# ssh -Nf -L 10.66.0.190:10000:localhost:22 192.168.200.100
再看下ssh tunnel用例
-L [bind_address:]port:host:hostport
bind_address預設是127.0.0.1
格式是
[要開啟的監聽IP:]要開啟的監聽連接埠:要映射到的監聽IP:要隱射到的監聽連接埠
為什麼有時候用locahost,有時候用10.66.0.190?
如果說ssh tunnel開啟的連接埠只需要給本機用到,那麼就讓連接埠只在迴環介面監聽,如果需要讓別的機器共用ssh tunnel開啟的連接埠,則需要讓ssh在可訪問的IP上開啟連接埠了。
總之處處小心,設好安全許可權,防止入侵。
Ssh tunnel通常能實現3種功能
1) 加密網路傳輸
2) 繞過防火牆
3) 讓位於廣域網路的機器串連到區域網路內的機器