@Author : Roger TX (425144880@qq.com)
@Link : https://github.com/paotong999
什么是SSH隧道
首先看下面的例子蝌蹂,我們所面臨的大部分情況都和它類似短荐。
- 內(nèi)網(wǎng)的機器A,公網(wǎng)的機器B,某服務(wù)器C
- A可以連接B,B可以連接C,但是AC之間不能連接
- 這個時候如果B能運行一個OpenSSH服務(wù)器嗅虏,那么就可以通過B形成隧道連接AC
跳轉(zhuǎn)機的端口轉(zhuǎn)發(fā)服務(wù)
我們建立ssh隧道的時候,往往是想通過一臺公網(wǎng)的主機或者是大家都可以訪問的主機做跳轉(zhuǎn)機上沐,來訪問內(nèi)部或者外部不能直接訪問的機器皮服。所以一般像這種情況下,請將跳轉(zhuǎn)機中的ssh服務(wù)器中的GatewayPorts設(shè)為yes
ssh是linux遠程登錄的安全協(xié)議奄容,是 C/S 模式的架構(gòu)冰更,配置文件分為服務(wù)器端配置文件 [/etc/ssh/sshd_config] 與客戶端配置文件默認配置文件[/etc/ssh/ssh_config] 用戶配置文件[~/.ssh/config]产徊。sshd_config 是服務(wù)端主配置文件這個文件的宿主應(yīng)當是root昂勒,權(quán)限最大可以是"644"
關(guān)于sshd_config配置詳解,這里不會過多涉及舟铜,有興趣的同學(xué)可以自行查找材料戈盈,這里主要說下GatewayPorts
GatewayPorts
1、是否允許遠程主機連接本地的轉(zhuǎn)發(fā)端口谆刨。默認值是"no"塘娶。
2、sshd(8) 默認將遠程端口轉(zhuǎn)發(fā)綁定到loopback地址痊夭。這樣將阻止其它遠程主機連接到轉(zhuǎn)發(fā)端口刁岸。
3、GatewayPorts 指令可以讓 sshd 將遠程端口轉(zhuǎn)發(fā)綁定到非loopback地址她我,這樣就可以允許遠程主機連接了虹曙。
4、"no"表示僅允許本地連接番舆,"yes"表示強制將遠程端口轉(zhuǎn)發(fā)綁定到統(tǒng)配地址(wildcard address)酝碳,
"clientspecified"表示允許客戶端選擇將遠程端口轉(zhuǎn)發(fā)綁定到哪個地址。
修改完成之后恨狈,重啟sshd服務(wù)
service sshd reload
本地SSH隧道
在建立本地SSH隧道之前要清楚下面幾個參數(shù):
- 公網(wǎng)機器B的IP地址(這里是192.168.199.16)
- 公網(wǎng)機器B的端口號(這里是3333)
- 某服務(wù)器C的IP地址(這里是139.199.0.37)
- 某服務(wù)器C的端口號(端口:22)
在清楚了上面的參數(shù)后疏哗,我們使用下面的命令來建立一個遠程SSH隧道,在192.168.199.16的主機上執(zhí)行下面的命令:
ssh -Nf -L 192.168.199.16:3333:139.199.0.37:22 192.168.199.16
這里我們用到了SSH客戶端的三個參數(shù)禾怠,下面我們一一做出解釋:
- -N 告訴SSH客戶端返奉,這個連接不需要執(zhí)行任何命令。僅僅做端口轉(zhuǎn)發(fā)
- -f 告訴SSH客戶端在后臺運行
- -L 做本地映射端口吗氏,被冒號分割的三個部分含義分別是最后一個參數(shù)是我們用來建立隧道的中間機器的IP地址(IP: 192.168.199.16)
- 需要使用的本地端口號(端口: 3333)
- 需要訪問的目標機器IP地址(IP: 139.199.0.37)
- 需要訪問的目標機器端口(端口: 22)
那么本地局域網(wǎng)的任何機器訪問192.168.199.16:3333都會自動被映射到139.199.0.37:22芽偏。
遠程SSH隧道
內(nèi)網(wǎng)的機器A,公網(wǎng)的機器B牲证,某服務(wù)器C
A可以連接B哮针,B可以連接C,但是AC之間不能連接
這個時候如果B能運行一個OpenSSH服務(wù)器,那么就可以通過B形成隧道連接AC
1十厢、上述例子中A-B-C連通后等太,我們思考一個問題,如果C想通過B連接A蛮放,也就是C-B-A可以連接嗎缩抡?
2、也許你已經(jīng)注意到了包颁,A是內(nèi)網(wǎng)機器瞻想,所以C-B-A這個方向的連接不通。
3娩嚼、雖然D-B-A這個方向的連接不通蘑险,但是A-B-D這個方向的連接是沒有問題的。
4岳悟、我們可以使用遠程SSH隧道的功能利用一條已經(jīng)連接好的A-B-D方向的連接來完成 D-B-A方向的訪問佃迄。
與本地SSH一樣,我們在建立遠程SSH隧道之前要清楚下面幾個參數(shù):
- 公網(wǎng)機器B的IP地址(這里是139.199.0.37)
- 公網(wǎng)機器B的端口號(這里是2222)
- 內(nèi)網(wǎng)的機器A的IP地址(這里是192.168.199.16)
- 內(nèi)網(wǎng)的機器A的端口號(端口:22)
在清楚了上面的參數(shù)后贵少,我們使用下面的命令來建立一個遠程SSH隧道呵俏,在192.168.199.16的主機上執(zhí)行下面的命令:
ssh -Nf -R 139.199.0.37:2222:192.168.199.16:22 139.199.0.37
1、這個命令也可以在局域網(wǎng)里192.168.199.12上執(zhí)行
2滔灶、只要在局域網(wǎng)里192.168.199.12可以直接連接內(nèi)網(wǎng)主機192.168199.16
3普碎、且192.168.199.12可以直接與公網(wǎng)主機139.199.0.37建立ssh連接
4、那么任何外網(wǎng)主機通過訪問公網(wǎng)主機139.199.0.37:2222就會被連接到192.168.199.16:22
5录平、從而可以完成外網(wǎng)穿越NAT到內(nèi)網(wǎng)的訪問麻车,而不需要在內(nèi)網(wǎng)網(wǎng)關(guān)和路由器上做任何操作。
現(xiàn)在萄涯,在IP是139.199.0.37的機器上绪氛,我們用下面的命令就可以登陸公司的IP是192.168.199.16的機器了。
ssh -p 2222 localhost
SSH隧道需要注意的地方
自動重連
? ? ? ?隧道可能因為某些原因斷開涝影,例如:機器重啟枣察,長時間沒有數(shù)據(jù)通信而被路由器切斷等等。因此我們可以用程序控制隧道的重新連接燃逻,可以使用一個簡單的循環(huán)控制隧道重新連接序目。
保持長時間連接
? ? ? ?有些路由器會把長時間沒有通信的連接斷開。SSH客戶端的TCPKeepAlive選項可以避免這個問題的發(fā)生伯襟,默認情況下它是被開啟的猿涨。如果它被關(guān)閉了,可以在ssh的命令上加上-o TCPKeepAlive=yes來開啟姆怪。
? ? ? ?另一種方法是叛赚,去掉-N參數(shù)澡绩,加入一個定期能產(chǎn)生輸出的命令。例如: vmstat俺附,下面給出一個這種方法的例子:
ssh -R 139.199.0.37:2222:192.168.199.16:22 139.199.0.37 "vmstat 30"
如何將端口綁定到外部地址上
? ? ? ?使用上面的方法肥卡,映射的端口只能綁定在127.0.0.1這個接口上。也就是說事镣,只能被本機自己訪問到步鉴。如何才能讓其他機器訪問這個端口呢?我們可以把這個 映射的端口綁定在0.0.0.0的接口上璃哟,方法是加上參數(shù)-b 0.0.0.0氛琢。同時還需要打開SSH服務(wù)器端的一個選項-GatewayPorts。默認情況下它應(yīng)當是被打開的随闪。如果被關(guān)閉的話阳似,可以在/etc /sshd_config中修改GatewayPorts no為GatewayPorts yes來打開它。