淺談虛擬機(jī)下部分內(nèi)網(wǎng)穿透功能實(shí)現(xiàn)方法
最近個(gè)人搭建服務(wù)器的情況有所增長(zhǎng),簡(jiǎn)單介紹一下一些可以使得服務(wù)器能被公網(wǎng)ip訪問(wèn)的方法。內(nèi)網(wǎng)穿透一般用于將位于內(nèi)部私有網(wǎng)絡(luò)(如家庭網(wǎng)絡(luò))的服務(wù)暴露到公共網(wǎng)絡(luò)(如互聯(lián)網(wǎng))上,使外部用戶可以訪問(wèn)這些服務(wù)。內(nèi)網(wǎng)穿透通常用于以下情況:
遠(yuǎn)程訪問(wèn):允許用戶從外部訪問(wèn)內(nèi)部網(wǎng)絡(luò)中的設(shè)備或服務(wù)。
本地測(cè)試與開(kāi)發(fā):開(kāi)發(fā)人員可以通過(guò)內(nèi)網(wǎng)穿透將本地開(kāi)發(fā)環(huán)境暴露到公共網(wǎng)絡(luò)上,方便與他人共享或進(jìn)行測(cè)試。
IoT設(shè)備訪問(wèn):讓用戶可以通過(guò)互聯(lián)網(wǎng)訪問(wèn)家庭或企業(yè)中的物聯(lián)網(wǎng)設(shè)備。
內(nèi)網(wǎng)穿透通常涉及一個(gè)內(nèi)網(wǎng)穿透工具或服務(wù),它可以通過(guò)各種技術(shù)來(lái)實(shí)現(xiàn)內(nèi)外網(wǎng)絡(luò)之間的連接。常見(jiàn)的內(nèi)網(wǎng)穿透工具包括Ngrok、FRP、花生殼等。一般而言,內(nèi)網(wǎng)穿透目前僅適合用于家庭,私人設(shè)備的遠(yuǎn)程訪問(wèn),不建議用于生產(chǎn)環(huán)境或其他非私人環(huán)境使用。下面稍微講解一些內(nèi)網(wǎng)穿透的方式。
一、FRP
frp 是一個(gè)專注于內(nèi)網(wǎng)穿透的高性能的反向代理應(yīng)用,支持 TCP、UDP、HTTP、HTTPS 等多種協(xié)議,且支持 P2P 通信??梢詫?nèi)網(wǎng)服務(wù)以安全、便捷的方式通過(guò)具有公網(wǎng) IP 節(jié)點(diǎn)的中轉(zhuǎn)暴露到公網(wǎng)。它是一個(gè)免費(fèi)且開(kāi)源的項(xiàng)目。目前一種較為實(shí)用的方式是依靠一個(gè)帶有公網(wǎng)ip的跳板服務(wù)器來(lái)訪問(wèn)內(nèi)網(wǎng)服務(wù)器。
下載地址:https://github.com/fatedier/frp/releases。
本節(jié)列舉部分frp可以進(jìn)行的操作:
1.ssh 訪問(wèn)內(nèi)網(wǎng)機(jī)器
在具有公網(wǎng) IP 的機(jī)器上部署 frps部署 frps 并編輯 frps.toml 文件。以下是簡(jiǎn)化的配置,其中設(shè)置了 frp 服務(wù)器用于接收客戶端連接的端口:
bindPort = 7000
在需要被訪問(wèn)的內(nèi)網(wǎng)機(jī)器上部署 frpc。
部署 frpc 并編輯 frpc.toml 文件,假設(shè) frps 所在服務(wù)器的公網(wǎng) IP 地址為 x.x.x.x。以下是示例配置:
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
- localIP 和 localPort 配置為需要從公網(wǎng)訪問(wèn)的內(nèi)網(wǎng)服務(wù)的地址和端口。
- remotePort 表示在 frp 服務(wù)端監(jiān)聽(tīng)的端口,訪問(wèn)此端口的流量將被轉(zhuǎn)發(fā)到本地服務(wù)的相應(yīng)端口。
啟動(dòng) frps 和 frpc。
通過(guò) SSH 訪問(wèn)內(nèi)網(wǎng)機(jī)器。
使用以下命令通過(guò) SSH 訪問(wèn)內(nèi)網(wǎng)機(jī)器,假設(shè)用戶名為 test:
ssh -o Port=6000 test@x.x.x.x
frp 會(huì)將請(qǐng)求發(fā)送到 x.x.x.x:6000 的流量轉(zhuǎn)發(fā)到內(nèi)網(wǎng)機(jī)器的 22 端口。
2.對(duì)外提供簡(jiǎn)單的文件訪問(wèn)服務(wù)
通過(guò)使用 static_file 插件,您可以輕松地提供一個(gè)基于 HTTP 的文件訪問(wèn)服務(wù),讓其他人可以訪問(wèn)您指定的文件。
(1)配置 frps.toml
在 frps.toml 文件中添加以下內(nèi)容:
bindPort = 7000
(2)配置 frpc.toml
在 frpc.toml 文件中添加以下內(nèi)容,確保設(shè)置合適的文件路徑、用戶名和密碼:
serverAddr = "x.x.x.x" #服務(wù)器公網(wǎng)ip
serverPort = 7000
[[proxies]]
name = "test_static_file"
type = "tcp"
remotePort = 6000
[proxies.plugin]
type = "static_file"
# 本地文件目錄,對(duì)外提供訪問(wèn)
localPath = "/tmp/file"
# URL 中的前綴,將被去除,保留的內(nèi)容即為要訪問(wèn)的文件路徑
stripPrefix = "static"
httpUser = "abc"
httpPassword = "abc"
根據(jù)實(shí)際情況修改 localPath、stripPrefix、httpUser 和 httpPassword。
(3)啟動(dòng) frps 和 frpc
(4)通過(guò)瀏覽器訪問(wèn)文件
使用瀏覽器訪問(wèn)http://x.x.x.x:6000/static/.
以查看位于 /tmp/file 目錄下的文件。系統(tǒng)會(huì)要求輸入設(shè)置的用戶名和密碼。
frp較為容易使用,但是需要有公網(wǎng)ip的服務(wù)器作為跳板機(jī),畢竟它是將公網(wǎng) IP 服務(wù)器的一個(gè)端口接收到的所有數(shù)據(jù),轉(zhuǎn)發(fā)到內(nèi)網(wǎng) IP 的主機(jī)上從而實(shí)現(xiàn)遠(yuǎn)程控制。目前阿里云等云服務(wù)商的服務(wù)器帶寬等方面費(fèi)用較高,如果僅個(gè)人需求遠(yuǎn)程操控可以使用其他方法。
二、Tailscale
Tailscale屬于一種虛擬組網(wǎng)工具,基于WireGuard。簡(jiǎn)單來(lái)說(shuō)它可以把所有安裝Tailscale服務(wù)的機(jī)器,都放到同一個(gè)局域網(wǎng)從而實(shí)行內(nèi)網(wǎng)穿透。
下載地址:https://github.com/tailscale/tailscale。
它的主要特點(diǎn)可以用下面一張圖解釋:
相比與frp,tailscale安裝方式更加方便,以centos8為例 可以使用一下命令安裝。
curl -fsSL https://tailscale.com/install.sh | sh
或者使用下面命令安裝。
sudo dnf config-manager --add-repo https://pkgs.tailscale.com/stable/centos/8/tailscale.repo
sudo dnf install tailscale
sudo systemctl enable --now tailscaled
sudo tailscale up
完成后會(huì)輸出一條鏈接大致如下:
等待第二臺(tái)服務(wù)器安裝完成,加入后會(huì)得到以下提示 Tailscale 網(wǎng)絡(luò)中的每臺(tái)設(shè)備都有一個(gè)私有 100.x.y.z IP 地址, 每個(gè)協(xié)議都有效 - SSH、RDP、HTTP、Minecraft - 在 Tailscale 運(yùn)行時(shí)使用您想要的任何協(xié)議。
接下來(lái)使用tailscale set --ssh 使得ssh功能可以添加到tailscale服務(wù)器,從而可以在任意端上遠(yuǎn)程登陸,以手機(jī)端為例,操作效果如下:
同時(shí),由其他段ssh連接會(huì)在結(jié)束后自動(dòng)刪除會(huì)話,保證了一定的安全性。
總體而言,F(xiàn)rp和Tailscale都可以用于實(shí)現(xiàn)內(nèi)網(wǎng)穿透功能,他們也各有優(yōu)缺點(diǎn)。Frp開(kāi)源免費(fèi)、靈活性高,但配置較復(fù)雜;Tailscale簡(jiǎn)單易用、安全性強(qiáng),但是需要通過(guò)第三方驗(yàn)證身份,同時(shí)是商業(yè)軟件,免費(fèi)版本有一定限制。其他的內(nèi)網(wǎng)穿透方式還有cloudflare tunnel ,zerotier等,但由于筆者并不熟悉,本篇暫且不寫(xiě)。同時(shí),內(nèi)網(wǎng)穿透也有相應(yīng)風(fēng)險(xiǎn),僅建議個(gè)人遠(yuǎn)程連接自用設(shè)備使用,非必要不建議在公司生產(chǎn)環(huán)境等情況下使用。