Serveo.net 如果訪問不了赠尾,可以看文章后面的官網(wǎng)截圖淮捆。
Serveo 的功能:將局域網(wǎng)內(nèi)的服務(wù)端口開放到因特網(wǎng)上验懊,實現(xiàn)通過外網(wǎng)訪問內(nèi)網(wǎng)的需求雨让;在 Setveo 官網(wǎng) https://serveo.net 上的解釋是:Expose local servers to the internet, No installation, no signup; 即 將本地服務(wù)向公網(wǎng)開發(fā)卧惜,后面是它的廣告詞 -- 不用安裝厘灼,無需注冊夹纫。
最簡單的用法
如果你的本地電腦啟動了11000端口的web服務(wù),現(xiàn)在想要通過互聯(lián)網(wǎng)域名讓別人訪問设凹,只需要在你的電腦上輸入 ssh -R 80:localhost:11000 serveo.net
即可舰讹,之后會在下方打印一個訪問你的服務(wù)的域名,例如:
首先闪朱,我在本地啟動一個jupyter notebook服務(wù)(當(dāng)然其他的服務(wù)也可以)月匣,服務(wù)端口號為 11000:jupyter notebook --ip=0.0.0.0 --port=11000
,現(xiàn)在就可以通過地址 localhost:11000
訪問 jupyter notebook 的本地服務(wù)了:
現(xiàn)在奋姿,在你的機(jī)子上輸入:ssh -R 80:localhost:11000 serveo.net
首先锄开,如果是初次輸這條命令,會詢問你是否相信傳送過來的RSA鑰匙指紋称诗,選擇 yes,之后就會用綠字給你提供一個網(wǎng)址院刁,你用這個網(wǎng)址給任何一臺能夠訪問互聯(lián)網(wǎng)的電腦,在瀏覽器中輸入該域名(在上面的例子中粪狼,我將輸入
https://utrius.serveo.net
, 你所生成的域名的一定不一樣)退腥,就可以訪問你電腦上的服務(wù)了:如果你覺得目的已經(jīng)達(dá)到,下面的就可以不用看了再榄。
具體的參考手冊
基本用法
開放本地服務(wù)
ssh -R 80:localhost:3000 serveo.net
其中 -R 使用格式為: ssh -R remote_socket:host:hostport serveo.net
該命令會使本機(jī)和 serveo.net 建立 ssh 連接狡刘,并且和 serveo.net
進(jìn)行協(xié)商:
本 機(jī) : “喂,serveo.net困鸥,以后發(fā)送到你的 remote_socket 的請求嗅蔬,直接轉(zhuǎn)發(fā)給 host:hostport 行不行,就不勞煩您親自處理了疾就!”
serveo.net: “好噠澜术,你告訴其他人,要訪問這項特殊的服務(wù)猬腰,就使用這個子域名就ok了鸟废,子域名是:XXX.serveo.net”
之后,發(fā)送給 remote_socket
的請求就會全部轉(zhuǎn)發(fā)給 host:hostport
姑荷。
開放局域網(wǎng)內(nèi)其他服務(wù)器的服務(wù)
通常來說盒延,host 基本上是 localhost
,但也可以是與本機(jī)在同一局域網(wǎng)的一臺服務(wù)器鼠冕。
例如添寺,與我同在一個局域網(wǎng)有臺服務(wù)器 192.168.1.250 開啟了服務(wù)端口 10010,我們輸入ssh -R 80:192.168.1.250:10010 serveo.net
懈费,就可以通過提供的子域名訪問本局域網(wǎng)內(nèi)的其他服務(wù)器的服務(wù)计露。
劃重點:我們不僅可以開放自己的服務(wù),只要本機(jī)能夠在局域網(wǎng)內(nèi)所獲取的所有服務(wù),都能夠開放給外網(wǎng)票罐。
不過通過親測叉趣,速度會比本地服務(wù)慢,畢竟發(fā)送給 serveo.net 的請求要先通過 ssh 隧道轉(zhuǎn)發(fā)給本機(jī)胶坠,本機(jī)再轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器,其單向過程中多了一次轉(zhuǎn)發(fā)過程繁堡,一個來回就多了兩次沈善。
一次開啟多個端口服務(wù)
注意:開啟多個端口部分是 serveo.net 官網(wǎng)上所稱的具有的功能,不過經(jīng)過親測椭蹄,給出的兩個域名訪問的都是第一個端口所對應(yīng)的服務(wù)闻牡,所以,我總覺得哪里不對绳矩,各位可以自己親自試試罩润。
比如除了 11000 的 jupyter notebook 服務(wù)外,我們在 11001 也開啟了新的服務(wù)(如果覺得開啟個web服務(wù)比較困難翼馆,可以直接用命令 python -m http.server 11001
即可)割以,之后輸入命令:
ssh -R 80:localhost:11000 -R 80:localhost:11001 serveo.net
輸出為:
選擇特殊的子域名
之前 serveo.net 提供給我們的訪問域名是根據(jù)你的 IP 地址,你所提供的 SSH 用戶名以及當(dāng)前還能夠分配的子域名綜合計算之后应媚,反饋給你的严沥,所以你重新運行命令后,通常能夠得到相同的子域名中姜。你也可以指定子域名:
ssh -R incubo:80:localhost:11000 serveo.net
等價于:
ssh -R incubo.serveo.net:80:localhost:11000 serveo.net
可以看到消玄,返回給我們的子域名就是 incubo.serveo.net。通過該網(wǎng)址就可以訪問了丢胚。
不過,如果指定的子域名已經(jīng)被占用,那么會有如下提示:
修改 SSH 用戶名以獲得不同的子域名:
我們通過3次命令進(jìn)行實驗:
第一次:
ssh -R 80:localhost:11000 foo@serveo.net
第二次:ssh -R 80:localhost:11000 fff@serveo.net
第三次:ssh -R 80:localhost:11000 -l fff serveo.net
可以看出:第一次和第二次相比械念,由于修改了用戶名衡创,所以得到的子域名不相同;而第二次和第三次的結(jié)果是完全相同的峡蟋;
直接連接內(nèi)網(wǎng)服務(wù)器的 ssh 服務(wù)
我們可以將 serveo.net 主機(jī)視為一個跳板浮定,使我們的終端能夠直接通過ssh訪問內(nèi)網(wǎng)服務(wù)器,假設(shè)在內(nèi)網(wǎng) 192.168.1.250 上有 ssh 服務(wù)层亿,我們可以通過用戶名 linux_fhb 進(jìn)行登錄桦卒,將該 ssh 服務(wù)開放的方法為:
ssh -R myalias:22:192.168.1.250:22 serveo.net
注:如果 myalias 不成功,換一個子域名再進(jìn)行嘗試匿又;
之后我們就可以通過 myalias 進(jìn)行 ssh 連接了:
ssh -J serveo.net linux_fhb@myalias
實驗結(jié)果為:
其中參數(shù) -J 的解釋為:
This is a shortcut to specify a ProxyJump configuration directive.
該參數(shù)在 OpenSSH 的 7.3客戶端版本中引入方灾,如果是之前的版本,可以使用下面的命令進(jìn)行替代(不過還是建議升級比較方便快捷):
ssh -o ProxyCommand="ssh -W myalias:22 serveo.net" linux_fhb@myalias
普通TCP端口的轉(zhuǎn)發(fā)
如果你需要對除了 80,443裕偿,22 這些端口之外的端口進(jìn)行包轉(zhuǎn)發(fā)洞慎,被轉(zhuǎn)發(fā)的將是原始的 TCP 包。(在這種情況下嘿棘,我們就沒必要指定子域名了)劲腿,完成下面這個實驗一個需要3步:
- 打開本地的 12355 TCP端口服務(wù):
nc -l 12355
;至于網(wǎng)絡(luò)工具 nc 怎么用鸟妙,各位可以查資料焦人,不過大家這里照著寫就可以了; - 開啟 serveo.net 的端口轉(zhuǎn)發(fā)功能:
ssh -R 12355:localhost:12355 serveo.net
重父; - 測試:
nc serveo.net 12355
實驗結(jié)果如下:
其中從上到下的終端分別對應(yīng)步驟1花椭、2、3房午,最后發(fā)現(xiàn)矿辽,終端3發(fā)送的 ni hao a 被顯示到了終端1,說明 serveo.net 實現(xiàn)了轉(zhuǎn)發(fā)功能郭厌;
如果你指定 serveo.net 的端口為0袋倔,則將隨機(jī)分配一個可用的端口號(如果指定端口號,可能因該端口已經(jīng)被占用而開啟失斦勰)奕污,命令為:ssh -R 0:localhost:12355 serveo.net
可以看到液走,serveo 給我們分配的隨機(jī)端口號是 40985碳默。
連接端口 443
有時候,22連接端口被禁止了缘眶。你可以 連接到 443 端口:
ssh -p 443 -R 80:localhost:8888 serveo.net
注:這個啥用我也不太清楚嘱根,猜測應(yīng)該是能夠通過443端口進(jìn)行ssh連接。
保持連接不斷開
如果連接長時間空閑巷懈,會自動斷開该抒,所以我們需要發(fā)送“心跳包”以保持連接,保持連接的命令為:
ssh -o ServerAliveInterval=60 -R 80:localhost:11000 serveo.net
自動重連接
使用 autossh 命令可以創(chuàng)建更加“頑強(qiáng)”的通道顶燕。
autossh -M 0 -R 80:localhost:11000 serveo.net
autossh 的具體用法可查看 https://www.everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh/
自定義域名
注:這部分由于沒有域名凑保,所以沒有試驗過,見諒涌攻!
如果你想用自己已有的域名或者是子域名欧引,你首先需要 SSH key pair。如果你沒有key pair恳谎,可以使用 ssh-keygen 程序可以生成芝此。
之后憋肖,使用 ssh-keygen -l
,可以打印出你的ssh 指紋婚苹,形式類似于:
2048 SHA256:pmc7ZRv7ymCmghUwHoJWEm5ToSTd33ryeDeps5RnfRY no comment (RSA)
上面例子的指紋為:SHA256:pmc7ZRv7ymCmghUwHoJWEm5ToSTd33ryeDeps5RnfRY
之后岸更,你需要為你的域名或子域名添加兩條DNS記錄(DNS如何添加請自行搜索):
- 一條記錄指向 159.89.214.31,該 IP 地址即為 serveo.net 的公網(wǎng) IP膊升;
- 為了使 SSH key 生效怎炊,需要添加這么一段文本:
authkeyfp=[fingerprint]
。在上面的例子中廓译,DNS 記錄的形式為:authkeyfp=SHA256:pmc7ZRv7ymCmghUwHoJWEm5ToSTd33ryeDeps5RnfRY
在修改完DNS記錄后评肆,你就可以像下面這樣使用了:
ssh -R subdomain.example.com:80:localhost:11000 serveo.net
當(dāng)你訪問 subdomain.example.com 時, Serveo 將會從你的DNS 服務(wù)器獲取剛才填寫的文本記錄责循,只有你所提供的公鑰和記錄的 ssh 指紋一致糟港,你的請求才會被轉(zhuǎn)發(fā)攀操。
替代方案
ngrok
Serveo 是 ngrok 的替代方案院仿。Serveo 就是受 ngrok 啟發(fā)所開發(fā)出來的,因此兩者有很多相似之處速和。Serveo 相較于 ngrok 的最大優(yōu)勢是Serveo使用你的 SSH 客戶端歹垫,這樣你就沒有必要安裝其他的客戶端程序了。
其他的區(qū)別比如Serveo免費連接及提供子域名(ngrok 需要一點點錢)颠放,Serveo 在終端中請求檢查和重播(ngrok 使用 web 接口)排惨。注:由于沒用過 ngrok,對最后一句話不太理解碰凶。
OpenSSH Server
使用 OpenSSH 暮芭,你必須要自己配置和維護(hù)一臺服務(wù)器。它也需要處理 HTTPS 以及子域名的產(chǎn)生欲低,這兩點使 SSH 端口轉(zhuǎn)發(fā)機(jī)制的設(shè)置變得復(fù)雜辕宏。
如果 Serveo 沒有滿足你的需求,該指南 也許對你使用 OpenSSH 有所幫助砾莱。
自己架設(shè)服務(wù)
上面的免費版本僅用于體驗瑞筐,僅供個人使用,每個實例最多同時擁有3個隧道腊瑟。不過聚假,我通過實驗,發(fā)現(xiàn)至少能同時開5個隧道闰非,應(yīng)該可以開更多膘格,我沒有再試了,下面是實驗的結(jié)果:
如果你打算將 Serveo 進(jìn)行商用财松,或是是需要一次使用多于3個隧道闯袒,你可以發(fā)送郵件 trevor@serveo.net 聯(lián)系開發(fā)者。
下載 serveo 服務(wù)程序
Linux 版本
Mac 版本
Windows 版本
使用方法
可以通過命令行對服務(wù)軟件進(jìn)行設(shè)置,使用 -h
查看幫助文檔:
./serveo -h
-private_key_path
首先政敢,你需要需要指定用于建立 SSH 連接的密鑰路徑其徙。密鑰路徑應(yīng)該是 /etc/ssh/ssh_host_rsa_key
或者是 $HOME/.ssh/id_rsa
中的一個,根據(jù)實際所在位置運行下面中的一條命令(如果這兩個位置都沒有的話喷户,你要使用 ssh-keygen 生成密鑰唾那,使用命令為 ssh-keygen -t rsa -f ssh_host_rsa_key
)。
設(shè)置方法為:
./serveo -private_key_path=/etc/ssh/ssh_host_rsa_key
或者是
./serveo -private_key_path=$HOME/.ssh/id_rsa
-port褪尝,-http_port闹获,-https_port
這些參數(shù)指定 Serveo 哪些端口視為 SSH, HTTP, HTTPS 連接的服務(wù)端口:
./serveo -private_key_path=ssh_host_rsa_key
-port=22 -http_port=80 -https_port=443
./serveo -private_key_path=ssh_host_rsa_key
-port=2222 -http_port=8080 -https_port=8443
-cert_dir
如果提供 HTTPS 服務(wù)的話,需要改參數(shù)河哑。指定的目錄中需要包含 TLS 證書以及 keys避诽。例如,一個 cert_dir 可能包含如下的文件:abc.crt, ? abc.key, ? foo.crt, ? foo.key璃谨。
證書文件的后綴必須是 .crt
沙庐,keys 文件后綴必須是 .key
。證書除后綴外的命名可以隨意佳吞,但是證書和keys文件的文件名需要相同(即:abc.{crt, key} 必須同時存在)拱雏。可以使用通配符證書底扳,證書也支持多個 DNS 名稱铸抑。
./serveo -cert_dir=certs
-domain
該參數(shù)指定在沒有給定域名時,默認(rèn)的域名:
./serveo -domain=example.com
-disable_telemetry
開發(fā)者為了調(diào)試需要衷模,會打印一些基本事件的報告(例如程序開啟鹊汛,包轉(zhuǎn)發(fā)開始等),指定該選項阱冶,這些信息將不再打印刁憋。
后記
局域網(wǎng)IP地址(內(nèi)部)的動態(tài)分配問題:如果提供服務(wù)的服務(wù)器 IP 地址在局域網(wǎng)內(nèi)部變了(例如,路由器動態(tài)分配地址熙揍,服務(wù)器在斷網(wǎng)后可能局域網(wǎng)內(nèi)的IP被重新分配)职祷,那么服務(wù)一定是不可用的,因為就算你在該局域網(wǎng)內(nèi)届囚,不知道服務(wù)器新分配的 IP 照樣不能訪問服務(wù)器有梆,更何況是遠(yuǎn)端機(jī)子。
局域網(wǎng)對外的公網(wǎng)IP改變了(如果局域網(wǎng)的網(wǎng)絡(luò)提供商沒有提供靜態(tài)IP意系,那每次分配給局域網(wǎng)的公網(wǎng)IP都是會變化的)泥耀,那么意味著本機(jī)與 serveo.net 的 SSH 必定已經(jīng)斷開過,而我們是通過本機(jī)與serveo.net的SSH隧道訪問內(nèi)網(wǎng)服務(wù)的蛔添,除非SSH服務(wù)重連痰催,否則內(nèi)網(wǎng)服務(wù)也將斷開兜辞。
能力有限,如果有任何寫得不對的地方夸溶,可在評論區(qū)提出逸吵,多謝多謝!