步驟兩台 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...