遠程辦公何時了,網(wǎng)絡(luò)打洞幫你搞
本文轉(zhuǎn)載自微信公眾號「小姐姐味道」,作者小姐姐養(yǎng)的狗 。轉(zhuǎn)載本文請聯(lián)系小姐姐味道公眾號。
最近,有位像詩一樣的朋友,充滿了羅曼蒂克一樣的墮落主義思想。他不想上班,不想工作,就想翹著腿躺在床上刷手機。作為又一個被優(yōu)美的生活所摧殘的青年,我深刻理解他的想法,他愛上了遠程辦公。他的電腦在公司,人在家,可以用類似TeamView一類的軟件去做。另外,他還精通網(wǎng)絡(luò)打洞技術(shù),能夠遠程控制很多網(wǎng)絡(luò)環(huán)境很復(fù)雜的機器。
什么叫打洞呢?其實就是內(nèi)網(wǎng)穿透。
你可能有這樣的需求:
- 調(diào)試一些支付回調(diào)接口,但是又想在本地的Idea中接受請求進行debug;
- 家里有一臺性能非常霸道的機器,想要在上班時能夠連上它,做一些不可告人的操作
- 手里有一大批broiler chicken,但對方在各種防火墻之內(nèi),你想要集中控制它
- 廉價的遠程辦公
- 遠程控制手機打卡簽到!
- 給客戶做演示,懶得再搭建環(huán)境,想要直接訪問自己機器上的程序...
不要著急,你所能想到的這些,看完本篇文章,都可以搞定。而且,不需要你親自動手編碼。
這些需求,有的是正當?shù)?,有的是邪惡的,這也體現(xiàn)了技術(shù)的兩面性。工具在不同的人手里,會有不同的功效。比如到了xjjdog手里,它僅僅變成了一篇水文。
重回正題,為了讓你能夠上手應(yīng)用這種內(nèi)網(wǎng)穿透技術(shù),你需要一臺能夠上網(wǎng)的云主機。要最便宜的那種就可以,它將作為我們的流量轉(zhuǎn)發(fā)中樞。
1. 這是什么原理
?我們當然要拿一個比較正當?shù)挠猛荆瑏碚f明一下它的基本原理。打洞方式有很多,我們只介紹一種最直觀、最簡單的(嚴格來說,下面的介紹只屬于隧道,為了描述方便,我們統(tǒng)稱為打洞)。
要明白一個事實:“網(wǎng)絡(luò)連接,是雙向的。” 請銘記這個看起來再自然不過的特點,它將是我們接下來介紹的這種方式的根本。
拿支付例子來說。程序調(diào)用了微信或者支付寶的api進行支付后,平臺會將支付結(jié)果通過回調(diào)地址通知我。
由于我的386機器在內(nèi)網(wǎng)中,加上層層的路由器和交換機防火墻,再加上ipv4的珍貴性,微信根本找不到我。大隱隱于市,也不過如此吧。
幸運的是,我能上網(wǎng)!這可以說是公司對我的最大恩賜了。
遇到網(wǎng)絡(luò)問題,最好的解決方式就是加上一個中間層。這和nginx有異曲同工之處。nginx通過加入一個配置,就可以把服務(wù)端的資源暴露到公網(wǎng)上。我們也使用類似的思路去解決,但這次,我希望的是把自己本地的386,暴露到公網(wǎng)上。
不能用nginx做反向代理,因為nginx同樣訪問不了處于墻內(nèi)的我(淦)。
這時候,我們上面提到的基本事實,就起作用了。
加入一個中間層墻內(nèi)翻譯,再加入一個中間層墻外翻譯。一旦它們連接上,不管是誰連接上誰,都能夠相互進行流量轉(zhuǎn)發(fā)。注意我們的箭頭,正向的數(shù)據(jù)流動,和反向的數(shù)據(jù)流動,對于一個連接來說,并沒有什么區(qū)別。
為了更明白的看一下這個過程。我畫了兩組端口圖。紅色防火墻左邊的,就是本地機器;右邊的,就是轉(zhuǎn)發(fā)服務(wù)器。
剛開始的時候,轉(zhuǎn)發(fā)服務(wù)器監(jiān)聽在7000端口。在本地機器上,進行了一個配置,告訴服務(wù)端:麻煩您再監(jiān)聽一個9090端口,當有數(shù)據(jù)請求到來的時候,麻煩通過你的客戶端,轉(zhuǎn)發(fā)到我的8080端口上。
這就是整個內(nèi)網(wǎng)穿透的基本思路。
2. 實踐一下
原理,只是贈送給對內(nèi)網(wǎng)穿透有好奇心的同學。對于大部分人來說,直接用就對了! 誰有閑工夫去搞明白為啥發(fā)動機是怎么設(shè)計的。
需求催生工具。目前常用的開源工具,有很多比如zerotier、ngrok、frp等。下面以frp為例,來說明一下它的使用方式。
- https://github.com/fatedier/frp/
如果你看過上面的原理,就會發(fā)現(xiàn)它的配置,實在是很簡單的。
首先,準備一臺云主機。我們叫它server。
在server上,下載frp,解壓。然后配置frps.ini。好家伙,只有兩行,就是一個綁定端口。這證明了我們要在客戶端的配置上下點功夫。
- [common]
- bind_port = 14000
接下來,在本地機器上操作,我們記做386。
在386上,下載相應(yīng)平臺版本的frp,解壓。這次要修改的是frpc.ini文件。
- [common]
- server_addr = 139.202.186.135
- server_port = 14000
- [springboot-1]
- type = tcp
- local_ip = 127.0.0.1
- local_port = 8080
- remote_port = 9090
在這里,我們指定連上了server的14000。并告訴它,啟動一個9090端口。當有請求的時候,轉(zhuǎn)發(fā)到我386的8080端口。
在386上,已經(jīng)用idea啟動了一個springboot項目。當微信的支付回調(diào),調(diào)到server的9090端口時,我就可以在idea里打斷點進行調(diào)試了。
3. 兩個小案例
我們再來看兩種常見的操作系統(tǒng)完全控制。
對于Linux服務(wù)器來說,對外開放的一般是22端口。我們可以通過ssh來連接它。
- [ssh]
- type = tcp
- local_ip = 127.0.0.1
- local_port = 22
- remote_port = 6000
在本地,通過下面命令即可連接放在家里的機器。
- ssh -oPort=6000 test@x.x.x.x
同樣的,要想遠程控制windows,還是得首先把遠程連接功能給打開。
在windows機器上,簡單的配置一下端口就可以。因為它是通用的tcp連接,所以我們并不需要配置什么額外的東東。
- [RDP]
- type = tcp
- local_ip = 127.0.0.1
- local_port = 3389
- remote_port = 33891
可以看到,由于22和3389都是基于tcp協(xié)議的,所以這種轉(zhuǎn)發(fā)配置,也簡單的像是吃飯一樣。
市面上的一些打洞軟件,難的并不是技術(shù),而是從業(yè)資格證書。畢竟,別人用你的服務(wù),向外傳輸?shù)膬?nèi)容,都是不得而知的。這時候如果沒有運營證書或者嚴格的內(nèi)容審查,就只能背鍋。
講完了打洞的原理和簡單使用案例,我們有必要著重提一下它的安全性。
溫馨提示:打洞請尤其注意它的安全。如果你是打通的ssh或者3389,請確保打了相關(guān)的補丁,并且采用了強密碼。一般公司會采用方式管理遠程訪問,打洞可以說是直接繞過,是非常危險的行為。
如果你打的洞,被其他別有用心的人獲得,通常會造成內(nèi)網(wǎng)的崩潰。如果你的公司并不允許這種行為,就不要把公司內(nèi)網(wǎng)的服務(wù)暴露到外面。
打洞還通常與泄密有關(guān)。一個被嚴格保密的內(nèi)網(wǎng)系統(tǒng),由于其中的一臺機器能夠上網(wǎng),就可以把服務(wù)暴露出去供外部人員訪問參考。
建議在打洞之前,先了解一下什么叫做“面向法律編程”。演示一類的打洞,需要經(jīng)過公司授權(quán);拒絕一切公司內(nèi)網(wǎng)類的ssh和3389打洞。
否則,出了事情,被請到局子里喝茶去,就不太好了。
作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。