什么是SSH隧道
SSH隧道是一種通過加密的SSH連接傳輸任意網(wǎng)絡(luò)數(shù)據(jù)的方法。它可以用來為任何應(yīng)用程序添加加密通道;也可以用它來實現(xiàn)VPN和跨防火墻訪問局域網(wǎng)的服務(wù)。
SSH是一個通過不受信任的網(wǎng)絡(luò)進行安全遠程登錄和文件傳輸?shù)臉藴?。通過SSH隧道傳輸TCP/IP數(shù)據(jù),它還提供了一種使用端口轉(zhuǎn)發(fā)保護任何給定應(yīng)用程序數(shù)據(jù)流量的方法。采用了這種方法后,應(yīng)用程序的數(shù)據(jù)流量都會走SSH的加密連接,從而不會被竊聽或攔截。對于本身不支持加密的應(yīng)用程序來說,使用SSH隧道可以很方便地添加網(wǎng)絡(luò)安全性。

上圖簡要介紹了SSH隧道。不可信網(wǎng)絡(luò)的安全連接建立在SSH客戶端和SSH服務(wù)器之間。這個連接是加密的,可用于保護機密性和完整性,并且可以對通信方進行身份驗證。
客戶端應(yīng)用使用SSH來連接到服務(wù)端應(yīng)用。隧道啟用后
- 應(yīng)用程序連接到SSH客戶端所在的本地主機上的端口。
- SSH客戶端通過加密隧道將數(shù)據(jù)轉(zhuǎn)發(fā)到SSH服務(wù)端。
- SSH服務(wù)端連接到應(yīng)用程序服務(wù)器,這個服務(wù)器和SSH服務(wù)端在同一個主機上,或者在相同的數(shù)據(jù)中心中。
通過上面的轉(zhuǎn)發(fā),無需修改應(yīng)用程序,就能保證應(yīng)用程序客戶端和服務(wù)端通信的安全。
這個方式的缺點是,任何能登陸服務(wù)器的用戶都可以啟用端口轉(zhuǎn)發(fā)。內(nèi)部IT人員經(jīng)常在他們的家里的機器或云上的服務(wù)器上啟用轉(zhuǎn)發(fā),從而能在企業(yè)內(nèi)網(wǎng)中,從工作機器上訪問家里的機器或云上的服務(wù)器。黑客或惡意軟件會利用類似的方式在局域網(wǎng)中留一個后門。還可以在多個設(shè)備上開啟隧道,攻擊者通過在這些隧道中跳來跳去來隱藏蹤跡。
兩種轉(zhuǎn)發(fā)方式
本地轉(zhuǎn)發(fā)
本地代理用于將端口從客戶端計算機轉(zhuǎn)發(fā)到服務(wù)端計算機。SSH客戶端監(jiān)聽來自某個端口的連接,當它收到連接時,將請求通過隧道轉(zhuǎn)發(fā)到SSH服務(wù)器;然后SSH服務(wù)器將請求轉(zhuǎn)到目標端口。
本地轉(zhuǎn)發(fā)比較常見的場景有:
- 通過跳板機登陸遠程服務(wù)器或傳輸文件
- 從外部連接到內(nèi)部網(wǎng)絡(luò)上的服務(wù)
- 遠程文件共享
在OpenSSH中,使用-L參數(shù)開啟本地轉(zhuǎn)發(fā)
ssh -L p1(localport):server:p2(remoteport) remote
這個命令工作的過程如下圖

默認情況下,其他的機器都能夠連接到本地的SSH客戶端指定的端口;為了安全起見,一般綁定地址,將連接來源限制在同一主機的程序
ssh -L 127.0.0.1:p1:server:p2 remote
也可以在OpenSSH客戶端的配置中配置本地轉(zhuǎn)發(fā),這樣就不用單獨輸入命令行了
比如在~/.ssh/config中這樣寫
Host serverfw
HostName remote
User username
LocalForward p1 server:p2
這樣在開啟轉(zhuǎn)發(fā)的時候只需要輸入ssh serverfw而不用再輸入完整的命令了
遠程轉(zhuǎn)發(fā)
如果希望通過本地計算機,讓遠程服務(wù)器remote可以連接到server上的服務(wù),可以使用SSH遠程轉(zhuǎn)發(fā)。
使用SSH遠程轉(zhuǎn)發(fā)一個典型的用途是,在企業(yè)內(nèi)部開一個后門,讓公網(wǎng)的計算機可以訪問到企業(yè)的某個內(nèi)部服務(wù),這個是有一定風險的,使用的時候需要特別小心。
在OpenSSH中,遠程轉(zhuǎn)發(fā)通過-R參數(shù)開啟,在本地計算機上輸入命令
ssh -R p1(remoteport):server:p2(targetport) remote
上面命令的工作過程如下

默認情況下,OpenSSH僅允許從服務(wù)器主機(上圖的remote)連接到遠程轉(zhuǎn)發(fā)端口server:p2,如果想要其他的主機也能連上server:p2,需要在sshd_config文件中設(shè)置
GatewayPorts yes
如果需要指定來源IP,可以將配置改為
GatewayPorts clientspecified
比如
ssh -R 52.194.1.73:8080:localhost:80 host147.aws.example.com
將只允許52.192.1.73到端口8080的連接
OpenSSH的遠程轉(zhuǎn)發(fā)支持多個規(guī)則,比如
ssh -R 2222:d76767.nyc.example.com:22 -R 5432:postgres3.nyc.example.com:5432 aws4.mydomain.net
同樣的,可以在~/.ssh/config配置host,比如
Host exportme
HostName remote
RemoteForward remoteport server:targetport