經驗 使用FRP搭建內網穿透服務

2021-09-26 23:05:41 字數 4644 閱讀 9338

步驟兩台 server 沒有公網 ip ( server 連線的路由器倒是有教育網的 ip ),boss 想在公網訪問,想利用手上一台 vps 做內網穿透,比如把 server 的 1:10000 埠對映到 vps 的 10001:20000 上。vps和server的系統均為ubuntu。

嘗試的做法是 vps 上搭個 ovpn server,兩台 server 連線之後用iptables的 dnat 對映把 vps 指定埠**給 10.8.0.x,但是遇到了兩個問題:

iptables沒法非對稱對映埠段

(要麼 8000→20000 單個埠對映

要麼 1000:2000→1000:2000 對稱對映

沒法 1:10000→10001:20000 非對稱的埠段對映)

server 連線 ovpn 之後,server 的全部流量都走那個 ovpn 的虛擬網絡卡了…

又因為從 vps 傳到 server 的請求是從公網來的,源 ip 都是公網 ip,沒法單獨區分返回的資料報只讓它走虛擬網絡卡…

如果ovpn配置上no-route,那麼除了來自虛擬子網、源 ip 是 10.8.0.x 的請求能通過虛擬網絡卡回去,

一般來自公網的請求都會嘗試走物理網絡卡回去,也就是實際上收不到返回值…

經過v友們的推薦,嘗試使用frp解決:

vps使用frps,使用systemd實現自啟動;

使用某一台server執行frpc,將vps的10001:20000**到server1的1:10000埠,將vps的20001:30000**到server2的1:10000埠。

如果有想要自建的朋友,建議閱讀完全文再動手安裝。

wget 

tar -zxf frp_0.29.0_linux_amd64.tar.gz

mv frp_0.29.0_linux_amd64 frp

進入frp資料夾,編輯frps.ini

cd frp

vim frps.ini

配置檔案為:

[common]

bind_port =

2221

max_pool_count =

5log_level =

error

繫結的埠2221需要在vps防火牆設定中放行udp和tcp流量。

然後執行frps,進行測試:

./frps -c frps.ini
和frpc測試連通(見下文)後,可以設定為service,實現自啟動:

先修改service檔案:

vim frp/systemd/frps.service
修改execstart的路徑為實際frp解壓路徑,並且注意如果是以root使用者執行,預設的user=nobody會出現錯誤,需要改為user=root。並注意以service執行的程式受到io限制,無法開啟太多埠,新增limitnofile=65535以放寬限制。

[unit]

description=frp server service

after=network.target

[service]

type=******

user=root

restart=on-failure

restartsec=

5***ecstart=

/root/frp/frps -c /root/frp/frps.ini

limitnofile=

65535

[install]

wantedby=multi-user.target

之後新增服務並設定為自啟動

cp systemd/frps.service /lib/systemd/system/ 

systemctl daemon-reload

systemctl enable frps

systemctl start frps

這時可以使用systemctl status frps檢視程序的pid,之後使用cat /proc/1238/limits確認max open files項是否放寬為65535。

wget 

tar -zxf frp_0.29.0_linux_amd64.tar.gz

mv frp_0.29.0_linux_amd64 frp

進入frp資料夾,編輯frpc.ini

cd frp

vim frpc.ini

配置檔案為:

[common]

server_addr = vps的ip

server_port =

2221

pool_count=2[

range

:server1_tcp]

type

= tcp

local_ip = 內網server1的ip,可以是本機127.0

.0.1,也可以是內網裡其他server的ip如192.168

.1.101

local_port =1-

10000

remote_port =

10001

-20000

[range

:server1_udp]

type

= udp

local_ip = 內網server1的ip,可以是本機127.0

.0.1,也可以是內網裡其他server的ip如192.168

.1.101

local_port =1-

10000

remote_port =

10001

-20000

[range

:server2_tcp]

type

= tcp

local_ip = 內網server2的ip,可以是本機127.0

.0.1,也可以是內網裡其他server的ip如192.168

.1.101

local_port =1-

10000

remote_port =

20001

-30000

[range

:server2_udp]

type

= udp

local_ip = 內網server2的ip,可以是本機127.0

.0.1,也可以是內網裡其他server的ip如192.168

.1.101

local_port =1-

10000

remote_port =

20001

-30000

先啟動vps上的frps,再啟動server上的frpc

./frpc -c frpc.ini
這時就可以通過vps ip:port+10000訪問server1的ip:port,vps ip:port+20000訪問server2的ip:port了。

因為實際使用frpc是在server的docker容器內,systemd自啟動有些問題,所以目前frpc使用screen工具來後台執行:

screen -s frpcscreen

./frpc -c frpc.ini

然後按ctrl+a

ctrl+d退出當前screen。

終止正在前台執行的frpc以及frps需要使用ctrl+c組合鍵關閉,如果使用ctrl+z或者break或者關閉ssh客戶端的方式終止,則已經開啟的埠無法解除占用,只能重啟系統。

測試tcp連通性可以在內網server上執行python3 -m http.server 8888來啟動乙個http服務,然後訪問http://vps ip:18888/測試是否能夠開啟網頁。

測試udp連通性可以使用netcat這個工具包。

安裝netcat

apt install netcat-openbsd
內網server執行udp監聽:

nc -ul 8883
vps上連線netcat,注意這裡是連線vps本機的18883埠,frp給**到內網server的8883埠上:

nc -u 127.0.0.1 18883
之後類似於聊天工具,在任意一方輸入字元並回車,另一方可以看到對方的輸入,證明udp連線成功。

作者聲稱沒有對於大範圍的ip段對映進行優化,但實際測試對映20000個埠是可實現的。目前還需要繼續觀察是否存在效能和穩定性問題。

使用frp搭建內網穿透服務

目錄客戶端使用 受制於第三方內網穿透服務的各種限制,加上自己恰好有臺雲伺服器,因此通過frp搭建了內網穿透服務。首先,我們給出官方文件位址,便於資深玩家探索新的玩法。但我們要主要注意,frp 仍然處於開發階段,未經充分測試與驗證,官方不推薦用於生產環境。但是由於這玩意我是個人使用的,可容忍其部分的不...

使用frp搭建內網穿透

frp是乙個高效能的反向 應用,可以幫助您輕鬆地進行內網穿透,對外網提供服務,支援tcp,http,https等協議型別,並且web服務支援根據網域名稱進行路由 frp的用途很多,本文只做基礎的內網穿透應用 要搭建乙個frp服務,需要伺服器端和客戶端安裝frp應用,通過frp應用進行通訊,安裝在伺服...

frp內網穿透搭建

建立目錄 mkdir p usr local frp wget 解壓安裝包 tar zxvf frp 0.13.0 linux amd64.tar.gz內網伺服器 centos7 本地計算機 建立目錄 mkdir p usr local frp wget 解壓安裝包 tar zxvf frp 0.1...