終於弄懂內網穿透知識了

今天跟大家分享下內網穿透的知識和使用方法,希望能讓大家對這個知識點有所瞭解。



內網穿透概念

百度百科是這麼表述的:

內網穿透,也即 NAT 穿透,進行 NAT 穿透是為了使具有某一個特定源 IP 地址和源端口號的數據包不被 NAT 設備屏蔽而正確路由到內網主機。


簡單的表述就是:

讓外網能夠訪問本地的服務。


通俗的例子是這樣的:

假設你本機電腦搭建了一個博客網站,想讓深圳的朋友看一眼效果,那麼通過這個內網穿透技術,就可以給遠在深圳的同學直接電腦/手機訪問網站。


結構圖

結構圖

這裡說明一下:

•User:互聯網外的主機

•frps:frp的服務端,它是一臺擁有公網IP的服務器地址。

•frpc: frp的客戶端,它會跟frp服務端進行溝通。

•tcp or http service:提供tcp或者http的服務,比如你電腦啟動了一個網頁服務器。


流程

根據上面的圖,講解下大致的流程:

1.frps所在的服務器(比如開放了公網端口7000),對外提供這個服務。

2.frpc配置frps的信息,連接到frps,建立一條通道。

3.frpc配置好本地的端口(比如5432端口)和對應公網端口(80端口)之間的關係。

4.當User用戶訪問frps所在的服務器開放的端口(如公網80端口),frps接收到連接請求之後馬上把這連接請求通過先前建立好的隧道轉發到frpc內網主機。

5.內網主機收到隧道發來的數據,進行內網服務【tcp or http service】的數據請求,直到【tcp or http service】服務返回了響應數據。

6.內網主機再將數據返回給frps服務端。

7.frps服務器的服務(80端口)返回給User用戶相應的資源。


部署過程

終於到正題了,不容易。


1.下載

去官網下載(
https://github.com/fatedier/frp/releases)相應平臺的壓縮包,這裡我是64位Linux系統。

<code>$ wget

https:

/

/github.com/fatedier

/frp/releases

/download/v

0

.

33.0

/frp_

0

.

33.0_

linux_amd64.tar.gz/<code>


2.服務端配置

2.1 解壓

<code>

tar zxf frp_0.33.0_linux_amd64.tar.gz

cd

frp_0.33.0_linux_amd64

/<code>


2.2 服務端解壓後刪除客戶端相關的配置(非必須的操作)

<code>$ rm frpc*/<code>


2.3 配置服務端frps.ini配置文件

<code>$ cat frps.ini [ ] bind_port =

17000

/<code>

這裡說明下參數,bind_port 是監聽的端口,後面frpc配置服務端端口需要配置此端口。


2.4 服務端啟動

<code>$ ./frps -c frps.ini /<code>

如果要後臺運行,通過nohup方式進行後臺啟動。

<code>$ nohup ./frps -c frps.ini &/<code>


3.客戶端配置

3.1 解壓

<code>

tar zxf frp_0.33.0_linux_amd64.tar.gz

cd

frp_0.33.0_linux_amd64

/<code>


3.2 客戶端解壓後刪除服務端相關的配置(非必須的操作)

<code>$ rm frps*/<code>


3.3 配置客戶端frpc.ini配置文件

<code>

cat

frpc.ini

[common]

server_addr

=

公網IP地址

server_port

=

7000

[ssh]

type

=

tcp

local_ip

=

127.0.0.1

local_port

=

22

remote_port

=

6000

/<code>

這裡說明下參數:

•server_addr: 填寫frps服務端的公網IP

•server_port: 填寫frps服務端的端口

•[xxx] : 這個是服務名,可以任意修改,本例命名為ssh,注意多個規則不能重複名字。

•type: 連接類型,比如http、tcp。ssh方式連接就用tcp。

•local_ip: 填寫本地服務的IP

•local_port: 填寫本地服務的端口

•remote_port: frps服務端公網的開放端口,這裡需要注意不是frps服務的端口。


3.4 客戶端啟動

<code>$ ./frpc -c frpc.ini /<code>

如果要後臺運行,通過nohup方式進行後臺啟動。

<code>$ nohup ./frpc -c frpc.ini &/<code>


一些更細緻的配置

比如服務端配置:

<code>$ cat frps.ini [common] bind_port = 17000 token = myfrptest dashboard_port = 7500 dashboard_user = admin dashboard_pwd = admin/<code>

詳細參數說明:

•token:服務器上設置的連接口令

•dashboard_port:服務端儀表板的端口,若使用7500端口,在配置完成服務啟動後可以通過瀏覽器訪問 x.x.x.x:7500 (其中x.x.x.x為公網服務器的IP)查看frp服務運行信息。

•dashboard_user:打開儀表板頁面登錄的用戶名

•dashboard_pwd:打開儀表板頁面登錄的密碼

對應客戶端配置:

<code>$ cat frpc.ini [common] server_addr = 填寫公網IP server_port = 17000 token = myfrptest admin_addr = 本機的IP admin_port = 7400 admin_user = admin2 admin_pwd = admin2 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 8081 remote_port = 17001/<code>

詳細參數說明:

•token:要連接frps服務的連接口令

•admin_addr:客戶端管理界面的IP

•admin_port:客戶端管理界面的端口

•admin_user:打開客戶端管理界面登錄的用戶名

•admin_pwd:打開客戶端管理界面登錄的密碼


配置的小技巧

我們在客戶端的配置時候需要填寫公網IP,或者開放的端口,我們可以用環境變量來生效。

<code>$ cat frpc.ini [common] server_addr = {{ .Envs.FRP_SERVER_ADDR }} server_port = 17000 token = myfrptest/<code>

我們配置了環境變量{{ .Envs.FRP_SERVER_ADDR }},那麼在啟動服務之前,我們需要做一個環境變量export操作。

<code>

export

FRP_SERVER_ADDR=

"120.xxx.xx.xx"

./frpc -c frpc.ini

/<code>

這樣就可以正常啟動,不需要在配置文件顯示具體公網IP。


效果圖

•公網IP開放了17001的端口



•frps服務端儀表板

首頁


TCP頁面


•frpc客戶端管理界面

客戶端配置文件修改界面


重要說明

1.確保防火牆放行相關的端口。

2.如果你是在阿里雲或者騰訊雲等雲平臺上,注意在安全組上放行相關的端口。


更多安全的配置,可以去GitHub研究實踐。


歡迎關注我的公眾號testerzhang,原創技術文章第一時間推送。