建立稳定安全的SSH隧道
本文將教你如何通過(guò) SSH 隧道把本地服務(wù)映射到外網(wǎng),以方便調(diào)試,通常把這種方法叫內(nèi)網(wǎng)穿透。
目的
把運(yùn)行在本地開(kāi)發(fā)機(jī)上的 SSH 服務(wù)(或其他服務(wù)如HTTP等)映射到外網(wǎng),讓全世界都能通過(guò)外網(wǎng) IP 服務(wù)到你本地開(kāi)發(fā)機(jī)上 的SSH、HTTP 服務(wù)。例如你本地的 HTTP 服務(wù)監(jiān)聽(tīng)在?127.0.0.1:22,你有一臺(tái)公網(wǎng) IP 為?12.34.56.78?的服務(wù)器,通過(guò)本文介紹的方法,可以讓全世界的用戶(hù)通過(guò)?http://12.34.56.78:22?訪(fǎng)問(wèn)到你本地開(kāi)發(fā)機(jī)上的 SSH 服務(wù)。
前提條件
為了把內(nèi)網(wǎng)服務(wù)映射到外網(wǎng),以下資源為必須的:
要滿(mǎn)足以上條件很簡(jiǎn)單:
- 對(duì)于條件1:購(gòu)買(mǎi)一臺(tái)低配 Linux 服務(wù)器,推薦國(guó)外的?DigitalOcean;
- 對(duì)于條件2:對(duì)于 Mac、Linux 開(kāi)發(fā)機(jī)是內(nèi)置了 ssh 客戶(hù)端的,對(duì)于 Windows 可以安裝?Cygwin。
公網(wǎng)IP申請(qǐng)
去網(wǎng)上申請(qǐng)服務(wù)器,一般都會(huì)收費(fèi),如阿里云、騰訊云、百度云等。在這里推薦由世紀(jì)互聯(lián)運(yùn)營(yíng)的微軟Azure云服務(wù)器,1元體驗(yàn)一個(gè)月,申請(qǐng)與部署方式很簡(jiǎn)單,而且服務(wù)器配置與帶寬很高,可惜的是就能使用一個(gè)月,其實(shí)學(xué)服務(wù)器開(kāi)發(fā)的大學(xué)朋友們也可以申請(qǐng)一個(gè)練練手,畢竟這是一次難得的實(shí)踐機(jī)會(huì)嘛!申請(qǐng)免費(fèi)使用網(wǎng)址如下https://www.azure.cn/pricing/1rmb-trial-full/。
下面這個(gè)操作尤為重要,部署成功服務(wù)器后,務(wù)必參照微軟的文檔為服務(wù)器添加入站與出站規(guī)則,也就是哪些類(lèi)型的數(shù)據(jù)包可以進(jìn)出你的服務(wù)器,那些類(lèi)型的數(shù)據(jù)包會(huì)被防火墻攔截,這個(gè)步驟決定著偽裝的數(shù)據(jù)包是否能夠進(jìn)入到我們的VBS。然后我們需要建立linux虛擬機(jī),性能不需要太好,因?yàn)樗墓δ苤皇且粋€(gè)橋接的作用。虛擬機(jī)申請(qǐng)完成后我們就會(huì)得到系統(tǒng)自動(dòng)分配的一個(gè)公網(wǎng)IP地址,通過(guò)遠(yuǎn)程連接軟件我們可以遠(yuǎn)程連接到這臺(tái)公網(wǎng)的服務(wù)器。我們想要作的是將內(nèi)網(wǎng)中的機(jī)器映射到外網(wǎng),然后我們可以在公網(wǎng)上通過(guò)連接這臺(tái)服務(wù)器連接到我們的這臺(tái)內(nèi)網(wǎng)計(jì)算機(jī)。最簡(jiǎn)單的實(shí)現(xiàn)方式就是利用SSH隧道進(jìn)行端口映射。
實(shí)現(xiàn)原理
SSH 隧道就像一根管道,能把任何2臺(tái)機(jī)器連接在一起,把發(fā)送到其中一臺(tái)機(jī)器的數(shù)據(jù)通過(guò)管道傳輸?shù)搅硪慌_(tái)機(jī)器。假如已經(jīng)通過(guò) SSH 隧道把本地開(kāi)發(fā)機(jī)和外網(wǎng)服務(wù)器連接在了一起,外網(wǎng)服務(wù)器端監(jiān)聽(tīng)在?12.34.56.78:8080,那么所有發(fā)給?12.34.56.78:8080?的數(shù)據(jù)都會(huì)通過(guò) SSH 隧道原封不動(dòng)地傳輸給本地開(kāi)發(fā)機(jī)的?127.0.0.1:8080,如圖所示:
也就是說(shuō),去訪(fǎng)問(wèn)?12.34.56.78:22?就像是訪(fǎng)問(wèn)本地開(kāi)發(fā)機(jī)的?127.0.0.1:22,本地開(kāi)發(fā)機(jī)上的 22 端口被映射到了外網(wǎng)服務(wù)器上的 22 端口。
如果你的外網(wǎng)服務(wù)器 IP 配置了域名解析,例如?yourdomin.com?會(huì)通過(guò) DNS 解析為?12.34.56.78,那么也可以通過(guò)?yourdomin.com:8080?去訪(fǎng)問(wèn)本地開(kāi)發(fā)機(jī)上的服務(wù)。這樣就做到了訪(fǎng)問(wèn)外網(wǎng)地址時(shí)其實(shí)是本地服務(wù)返回的結(jié)果。
備注:通過(guò) SSH 隧道傳輸數(shù)據(jù)時(shí),數(shù)據(jù)會(huì)被加密,就算中間被劫持,黑客也無(wú)法得到數(shù)據(jù)的原內(nèi)容。所以 SSH 隧道還有一個(gè)功能就是保證數(shù)據(jù)傳輸?shù)陌踩浴?/p>
實(shí)現(xiàn)步驟
把本地開(kāi)機(jī)和外網(wǎng)服務(wù)器通過(guò) SSH 隧道連接起來(lái)就和在本地開(kāi)發(fā)機(jī) SSH 登入遠(yuǎn)程登入到外網(wǎng)服務(wù)器一樣簡(jiǎn)單。
先來(lái)回顧以下 SSH 遠(yuǎn)程登入命令,假如想在本地遠(yuǎn)程登入到?12.34.56.78,可以在本地開(kāi)發(fā)機(jī)上執(zhí)行以下命令:
ssh username@12.34.56.78而實(shí)現(xiàn) SSH 隧道只需在本地開(kāi)發(fā)機(jī)上執(zhí)行:
ssh -R 2000:127.0.0.1:22 username@12.34.56.78如果想同時(shí)映射多個(gè)端口則可以執(zhí)行:
ssh username@12.34.56.78 -R 2000:127.0.0.1:22 -R 8081:127.0.0.1:8081可以看出實(shí)現(xiàn) SSH 隧道的命令相對(duì)于 SSH 登入多出來(lái)?-R 8080:127.0.0.1:22,多出的這部分的含義是:
在遠(yuǎn)程機(jī)器(12.34.56.78)上啟動(dòng) TCP 8080端口監(jiān)聽(tīng)著,再把遠(yuǎn)程機(jī)器(12.34.56.78)上8080端口映射到本地的127.0.0.1:22。
執(zhí)行完以上命令后,就可以通過(guò)?12.34.56.78:8080?去訪(fǎng)問(wèn)本地的?127.0.0.1:22?了。
通常把這種技術(shù)叫做 SSH 遠(yuǎn)程端口轉(zhuǎn)發(fā)(remote forwarding)。
其實(shí)不限于只能把本地開(kāi)發(fā)機(jī)上運(yùn)行的服務(wù)映射到外網(wǎng)服務(wù)器上去,還可以把任何本地開(kāi)發(fā)機(jī)可以訪(fǎng)問(wèn)的服務(wù)映射到外網(wǎng)服務(wù)器上去。例如在本地開(kāi)發(fā)機(jī)上能訪(fǎng)問(wèn)?github.com:80,在本地開(kāi)發(fā)機(jī)上執(zhí)行:
ssh -R 8080:github.com:80 username@12.34.56.78就能通過(guò)?12.34.56.78:8080?去訪(fǎng)問(wèn)?github.com:80?了。
保持運(yùn)行
在執(zhí)行完上面介紹的 SSH 隧道命令后,你會(huì)發(fā)現(xiàn)登入到了外網(wǎng)服務(wù)器上去了,如果你登出外網(wǎng)服務(wù)器,就會(huì)發(fā)現(xiàn)?12.34.56.78:8080?無(wú)法訪(fǎng)問(wèn)了。導(dǎo)致這個(gè)問(wèn)題的原因是你登出外網(wǎng)服務(wù)器時(shí),在外網(wǎng)服務(wù)器上本次操作對(duì)應(yīng)的 SSH 進(jìn)程也跟著退出了,而這個(gè)退出的進(jìn)程曾負(fù)責(zé)監(jiān)聽(tīng)在 8080 端口進(jìn)行轉(zhuǎn)發(fā)操作。
為了讓 SSH 隧道一直保持在后臺(tái)執(zhí)行,有以下方法。
通過(guò) SSH 自帶的參數(shù)
SSH 還支持這些參數(shù):
- N參數(shù):表示只連接遠(yuǎn)程主機(jī),不打開(kāi)遠(yuǎn)程shell;
- T參數(shù):表示不為這個(gè)連接分配TTY;
- f參數(shù):表示連接成功后,轉(zhuǎn)入后臺(tái)運(yùn)行;
因此要讓 SSH 隧道一直保持在后臺(tái)執(zhí)行,可以通過(guò)以下命令:
ssh -NTf -R 8080:127.0.0.1:8080 username@12.34.56.78OpenSSH基于安全的理由,如果用戶(hù)連線(xiàn)到SSH Server后閑置一段時(shí)間,SSH Server會(huì)在超過(guò)特定時(shí)間后自動(dòng)終止SSH連線(xiàn)。
用 ssh 命令連接服務(wù)器之后,如果一段時(shí)間不操作,再次進(jìn)入 Terminal 時(shí)會(huì)有一段時(shí)間沒(méi)有響應(yīng),然后就出現(xiàn)錯(cuò)誤提示:
Write failed: Broken pipe只能重新用 ssh 命令進(jìn)行連接。
解決方法
方法一:如果您有多臺(tái)服務(wù)器,不想在每臺(tái)服務(wù)器上設(shè)置,只需在客戶(hù)端的 ~/.ssh/ 文件夾中添加 config 文件,并添加下面的配置:
ServerAliveInterval 60方法二:如果您有多臺(tái)個(gè)人管理服務(wù)器,不想在每個(gè)客戶(hù)端進(jìn)行設(shè)置,只需在服務(wù)器的 /etc/ssh/sshd_config 中添加如下的配置:
ClientAliveInterval 60方法三:如果您只想讓當(dāng)前的 ssh 保持連接,可以使用以下的命令:
$ ssh -o ServerAliveInterval=60 user@sshserver但是有時(shí)候還是會(huì)出問(wèn)題,這個(gè)可能就是由于網(wǎng)絡(luò)不穩(wěn)定造成的問(wèn)題,我們想讓SSH隧道不會(huì)調(diào)線(xiàn)就需要在網(wǎng)絡(luò)不穩(wěn)定的時(shí)候讓他自己去自動(dòng)連接,重新建立通信隧道。然后時(shí)刻保持連接,這個(gè)時(shí)候AutoSSH這個(gè)小軟件就是個(gè)不錯(cuò)的選擇。
通過(guò)?AutoSSH
SSH 隧道是不穩(wěn)定的,在網(wǎng)絡(luò)惡劣的情況下可能隨時(shí)斷開(kāi)。如果斷開(kāi)就需要手動(dòng)去本地開(kāi)發(fā)機(jī)再次向外網(wǎng)服務(wù)器發(fā)起連接。
AutoSSH 能讓 SSH 隧道一直保持執(zhí)行,他會(huì)啟動(dòng)一個(gè) SSH 進(jìn)程,并監(jiān)控該進(jìn)程的健康狀況;當(dāng) SSH 進(jìn)程崩潰或停止通信時(shí),AutoSSH 將重啟動(dòng) SSH 進(jìn)程。
使用AutoSSH 只需在本地開(kāi)發(fā)機(jī)上安裝 AutoSSH ,方法如下:
- Mac 系統(tǒng):brew install autossh;
- Linux 系統(tǒng):apt-get install autossh;
安裝成功后,在本地開(kāi)發(fā)機(jī)上執(zhí)行:
autossh -N -R 8080:127.0.0.1:8080 username@12.34.56.78就能完成和上面一樣的效果,但本方法能保持 SSH 隧道一直運(yùn)行。
可以看出這行命令和上面的區(qū)別在于把?ssh?換成了?autossh,并且少了?-f?參數(shù),原因是 autossh 默認(rèn)會(huì)轉(zhuǎn)入后臺(tái)運(yùn)行。
其它代替方案
除了 SSH 隧道能實(shí)現(xiàn)內(nèi)網(wǎng)穿透外,還有以下常用方法。
frp
frp 是一個(gè)可用于內(nèi)網(wǎng)穿透的高性能的反向代理應(yīng)用,支持 tcp, udp, http, https 協(xié)議。
frp 有以下特性:
- frp 比 SSH 隧道功能更多,配置項(xiàng)更多;
- frp 也需要一臺(tái)外網(wǎng)服務(wù)器,并且需要在外網(wǎng)服務(wù)器上安裝 frps,在本地開(kāi)發(fā)機(jī)上安裝 frpc;
ngrok
ngrok 是一個(gè)商用的內(nèi)網(wǎng)穿透工具,它有以下特點(diǎn):
- 不需要有外網(wǎng)服務(wù)器,因?yàn)?ngrok 會(huì)為你提供;
- 只需要在本地開(kāi)發(fā)機(jī)安裝 ngrok 客戶(hù)端,和注冊(cè) ngrok 賬戶(hù);
- 按照服務(wù)收費(fèi);
這些代替方案的缺點(diǎn)在于都需要再額外安裝其它工具,沒(méi)有 SSH 隧道來(lái)的直接。
想了解更多可以訪(fǎng)問(wèn)它們的主頁(yè)。
總結(jié)
舉兩個(gè)例子具體說(shuō)明一下ssh隧道建立的具體命令參數(shù)
ssh的確很強(qiáng)大,可以很方便的實(shí)現(xiàn)從本地端口到遠(yuǎn)程端口的映射,通常情況下使用 -L 或者 -R參數(shù),例如:
ssh xxx@xxx.xxx -L 8023:RemoteIP:23
-L 將本地的某個(gè)端口映射到遠(yuǎn)程主機(jī)的某個(gè)端口上,上例中就是將本地的8023端口映射到遠(yuǎn)程主機(jī)的23號(hào)端口上,這樣就可以直接telnet本機(jī)的8023端口來(lái)訪(fǎng)問(wèn)遠(yuǎn)程主機(jī)了。
但是需要說(shuō)明的是RemoteIP可以是127.0.0.1,此時(shí)127.0.0.1指的是遠(yuǎn)程計(jì)算機(jī),而非本機(jī)地址。
-R 則正好與-L相反,它將遠(yuǎn)程主機(jī)的某個(gè)端口映射到本地的某個(gè)端口上,例如:
ssh xxx@xxx.xxx -R 8023:LocalIP:23
上例將遠(yuǎn)程主機(jī)的8023端口映射到本機(jī)的23號(hào)端口,這樣遠(yuǎn)程主機(jī)就可以telnet 自己的8023端口來(lái)訪(fǎng)問(wèn)本地主機(jī)了。
最后-D參數(shù)將在本地開(kāi)啟一個(gè)socks5代理端口,該端口接收到的數(shù)據(jù)將通過(guò)加密隧道傳輸?shù)竭h(yuǎn)程主機(jī),并有遠(yuǎn)程主機(jī)代理發(fā)出,例如:
ssh xxx@xxx.xxx -D 7070
上例在本地開(kāi)啟一個(gè)7070號(hào)socks5代理,瀏覽器等應(yīng)用程序可以使用該端口通過(guò)遠(yuǎn)程主機(jī)訪(fǎng)問(wèn)網(wǎng)絡(luò)。
需要說(shuō)明的是,-D參數(shù)開(kāi)啟的socks代理,在我的機(jī)器上好像只有Chrome能使用,IE不能使用,原因未明,估計(jì)是DNS解析的問(wèn)題。
開(kāi)發(fā)中經(jīng)常需要外網(wǎng)服務(wù)映射到本機(jī)內(nèi)網(wǎng)服務(wù)的需要,便于調(diào)試。
以前都是同事幫著配,這兩天自己也看了一下 ssh 端口轉(zhuǎn)發(fā)。 同事分分鐘鐘搞定的事情,自己折騰了 2 天, 真是弱爆了。
最初老想不明白一件事,為什們外網(wǎng)服務(wù)器能夠找到我的內(nèi)網(wǎng)機(jī)器,現(xiàn)在才明白原來(lái)走的是 ssh 隧道。
需求我的內(nèi)網(wǎng)機(jī)器 ?192.168.9.100, 我的阿里云外網(wǎng) 123.56.86.52, ?現(xiàn)在需要所有對(duì)?123.56.86.52 ?80 端口的訪(fǎng)問(wèn)都映射到 ?192.168.9.100 的 80 端口。
顯然?123.56.86.52 訪(fǎng)問(wèn)不到 ?192.168.9.100, 但?192.168.9.100 能訪(fǎng)問(wèn)到?123.56.86.52 , 所以很簡(jiǎn)單 ssh 建立一個(gè)遠(yuǎn)程端口轉(zhuǎn)發(fā)就行了。
1 ?在?192.168.9.100 上執(zhí)行
ssh -N -v -R 3000:127.0.0.1:80 root@123.56.86.52-R 表示遠(yuǎn)程轉(zhuǎn)發(fā), ?這句話(huà)的意思是 通過(guò) ssh 連接到 123.56.86.52,讓?123.56.86.52 監(jiān)聽(tīng)自己的 3000 端口, 所有通過(guò) 3000 端口的數(shù)據(jù)都通過(guò) ssh 轉(zhuǎn)發(fā)到?127.0.0.1 的 80 端口。
這里 127.0.0.1 就是?192.168.9.100 這個(gè)機(jī)器。 ?在 ?ssh 連接的時(shí)候通道就建立了, 以后所有的通信都走的是這個(gè)通道。
2 既然??123.56.86.52 已經(jīng)監(jiān)聽(tīng)在 3000 端口了, 接下來(lái)就非常簡(jiǎn)單了, ?服務(wù)器上用 nginx 做一個(gè)反向代理, 把 ?80 端口代理到 ?3000 端口就行了
參考文獻(xiàn)
https://github.com/gwuhaolin/blog/issues/11
https://www.cnblogs.com/zlgxzswjy/p/9796671.html
https://www.cnblogs.com/wumz/p/9721666.html
https://blog.csdn.net/u013511989/article/details/79972435
http://www.ha97.com/4070.html
https://www.cnblogs.com/kevingrace/p/6110842.html
?
?
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的建立稳定安全的SSH隧道的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于fiddler的网络爬虫校园网自动登
- 下一篇: SSH常见问题