FRP 內網穿透
內網穿透
本地電腦上起了服務,其他人是訪問不到的,借助服務器的公網IP,服務端幫助轉發消息,其他人才能訪問到本地電腦上的服務。
具體可以用來做什么
1、本地計算機上啟動 web 服務,通過端口映射,別人通過公網和端口就能訪問。
2、Windows 遠程桌面連接,比如,從住的地方連接公司的電腦。(有安全風險,需要和公司報備)
3、SSH 遠程連接到開發板內的 linux 系統。
向日葵的免費賬戶的帶寬有限
我有1臺騰訊的輕量云服務器
frp 文件下載:https://www.123pan.com/s/Lwn8Vv-ul2x.html
提取碼:FAIM
winsw 文件下載:https://www.123pan.com/s/Lwn8Vv-Sl2x.html
提取碼:bYeZ
frp 中文文檔
https://gofrp.org/zh-cn/docs/
https://github.com/fatedier/frp/blob/dev/README_zh.md
服務端
服務端下載 frps
下載frp軟件:https://github.com/fatedier/frp
服務端下載安裝
比如
在 /opt/目錄下
cd /opt/
下載64位0.44版本的,arm服務器要選arm版本,現在常見服務器都是amd64架構的,也就是x86的64位指令集架構。
wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz
服務端配置 frps
解壓
tar -zxvf frp_0.44.0_linux_amd64.tar.gz
重命名,為了后面配置路徑簡單
mv frp_0.44.0_linux_amd64 frp
配置文件,服務端 frps 的 s 即 server,frpc 的 c 即 client。
vi frps.ini
frps.ini 文件內容,默認即可
[common]
bind_port = 7000
也可以設置token,相當于設置了一個密碼,例如
[common]
bind_port = 7000
token = abc123
服務端防火墻,放行端口7000、7001、6000、8080等需要的端口
啟動服務端
正常啟動
./frps -c ./frps.ini
服務端設置程序開機啟動
在frps.service里寫入內容,有時候會提示system目錄不存在,那就先建目錄
mkdir /usr/lib/systemd/system/
vi /usr/lib/systemd/system/frps.service
frps.service 內容
[Unit]
Description=frps service
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.ini
[Install]
WantedBy=multi-user.target
配置生效,啟動,設置開機啟動
systemctl daemon-reload
systemctl start frps
systemctl enable frps
查看狀態
systemctl status frps


客戶端
windows 客戶端配置 frpc
Windows10 當然是amd64位架構的 frp_0.44.0_windows_amd64.zip
比如想在家遠程公司電腦,在公司電腦上安裝設置 frpc。
我喜歡在 C 盤下建一個sw的文件夾來存自己安裝的程序,sw 即 software 的意思。
解壓到 C:\sw\目錄下,也就是現在 frp 目錄是 C:\sw\frp(需要把這個文件夾添加到病毒排除項)

修改 frp 客戶端的配置文件frpc.ini
[common]
server_addr = 127.0.0.1
server_port = 7000
[rdp7001]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
修改第一句 server_addr的127.0.0.1為云服務器的 IP 地址
如果服務端配置了 token,那客戶端也要配置。
windows一般也不用ssh,刪除內容,增加遠程桌面的協議 rdp 的設置
即現在是
[common]
server_addr = 云服務器地址
server_port = 7000
token = abc123
[rdp7001]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
?? “server_addr”是服務端 IP 地址,填入即可,
?? “server_port”為服務器端口,即 bind_port 的值,
?? “token”是你在服務器上設置的連接口令。
?? [rdp]:這個 rdp 是給服務起的名字,名字當然隨意設置,就是服務名字不能重復(從服務端看來,一個端口一個名字),如果有多個遠程桌面需要端口轉發,可以起:[rdp7001]、[rdp7002]
這里用到了 2 個自定義規則,一個是 rdp,一個是 smb:
??RDP,即 Remote Desktop 遠程桌面,Windows 的 RDP 默認端口是 3389,協議為 TCP,本條規則可以實現遠程桌面連接。
??SMB,即 Windows 文件共享所使用的協議,默認端口號 445,協議 TCP,本條規則可實現遠程文件訪問。
在 window10 上啟動 frpc 程序
注意:Microsoft Defender 會給 frpc.exe 軟件報病毒,會給移除,需要還原。
打開 cmd 程序,比如 win + R,輸入 cmd,我一般按 win 鍵,輸入 cmd,右鍵“以管理員身份運行”
切換到 frpc 的目錄
cd C:\sw\frp
frpc.exe -c frpc.ini
就啟動了
win10 啟動遠程桌面:【設置】,【系統】,【遠程桌面】,啟動遠程桌面

Windows 遠程連接:
按 win 鍵,輸入“遠程桌面連接”
計算機:服務端公網IP地址:7001
用戶名和密碼,是 window 電腦的用戶名和密碼。

當然也可以把本地 web 服務通過云服務器訪問
增加 web 配置即可
[webxxx]
type = tcp
local_ip = 127.0.0.1
local_port = 本地端口
remote_port = 映射到的服務器端口
現在完整的配置如下
[common]
server_addr = 云服務器地址
server_port = 7000
token = abc123
[rdp7001]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
[web9090]
type = tcp
local_ip = 127.0.0.1
local_port = 8080
remote_port = 9090
windows 客戶端設置程序開機啟動
需要一個軟件 winsw
https://github.com/winsw/winsw
Windows 服務包裝器,WinSW 將任何應用程序作為一個 Windows 服務進行包裝和管理。
WinSW 3可以在安裝了 .NET Framework 4.6.1 或更高版本的Windows平臺上運行。
對于沒有 .NET 框架的系統,該項目提供基于 .NET 核心的本地64位和32位可執行文件。
因為 win11 自帶 .Net 環境
所以下載 WinSW.NET461.exe
配置文件
WinSW.NET461.xml
<service>
<!-- 服務ID,整個 window 系統中唯一-->
<id>frpc</id>
<!-- 服務的顯示名字 -->
<name>frpc</name>
<!-- 服務描述 -->
<description>FRP 客戶端,用來實現內網穿透</description>
<!-- Path to the executable, which should be started -->
<!-- 想要啟動的可執行程序的路徑 -->
<executable>C:\SW\frp\frpc.exe</executable>
<!-- 攜帶的參數 -->
<arguments>-c C:\SW\frp\frpc.ini</arguments>
<!-- 第一次啟動失敗 60秒重啟 -->
<onfailure action="restart" delay="60 sec"/>
<!-- 第二次啟動失敗 120秒后重啟 -->
<onfailure action="restart" delay="120 sec"/>
<!-- 日志模式 -->
<logmode>append</logmode>
<!-- 指定日志文件目錄(相對于WinSW.exe配置的路徑) -->
<logpath>C:\SW\frp\log</logpath>
</service>
將 exe 和 xml 文件放到同一個文件夾下
命令行運行,使用 WinSW-x64.exe
// 安裝服務
WinSW-x64.exe install
// 卸載服務
WinSW-x64.exe uninstall
// 啟動服務
WinSW-x64.exe start
// 停止服務
WinSW-x64.exe stop
// 重啟服務
WinSW-x64.exe restart
// 查看狀態
WinSW-x64.exe status
命令行運行,使用 WinSW.NET461.exe
// 安裝服務
WinSW.NET461.exe install
// 卸載服務
WinSW.NET461.exe uninstall
// 啟動服務
WinSW.NET461.exe start
// 停止服務
WinSW.NET461.exe stop
// 重啟服務
WinSW.NET461.exe restart
// 查看狀態
WinSW.NET461.exe status
按 win 鍵,輸入“服務”,找到 frpc 服務,第一次要手動啟動
啟動失敗,就去看看 frpc 的配置文件 frpc.ini 內容是否不匹配。


linux 客戶端配置 frpc
注意版本
開發板一般是arm架構系統32/64位的linux系統,frp_0.44.0_linux_arm.tar.gz,frp_0.44.0_linux_arm64.tar.gz
比如
在 /opt/目錄下
cd /opt/
下載
wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_arm.tar.gz
解壓
tar -zxvf frp_0.44.0_linux_arm.tar.gz
重命名,為了后面配置路徑簡單
mv frp_0.44.0_linux_arm frp
配置文件
修改配置文件 frpc.ini
[common]
server_addr = 服務端公網IP地址
server_port = 7000
token = abc123
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
運行客戶端程序
./frpc -c ./frpc.ini
如果還有開發板客戶端要連接,也就是服務端要用不同的端口幫忙轉發,一個客戶端用一個端口,比如新增加的開發板用 6001 端口,注意段端放開 6001 端口。
linux 客戶端設置程序開機啟動
為 frpc 配置 systemd 的service文件,有時候會提示system目錄不存在,那就先建目錄
mkdir /usr/lib/systemd/system/
vi /usr/lib/systemd/system/frpc.service
frpc.service 文件內容
[Unit]
Description=frpc
Wants=network-online.target
After=network.target network-online.target
Requires=network-online.target
[Service]
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini
ExecStop=/bin/kill $MAINPID
Restart=always
RestartSec=5
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
解釋一下上面文件內容
- Wants:本單元啟動了,它“想要”的單元也會被啟動。但是這個單元若啟動不成功,對本單元沒有影響。
- Requires: 這個單元啟動了,那么它“需要”的單元也會被啟動; 它“需要”的單元被停止了,它自己也活不了。但是請注意,這個設定并不能控制啟動順序,因為它“需要”的單元啟動也需要時間,若它“需要”的單元啟動還未完成,就開始啟動本單元,則本單元也無法啟動,所以不建議使用這個字段。
- OnFailure:若本單元啟動失敗了,那么啟動這個單元作為折衷。
- Before/After:指定啟動順序。
Wants=network-online.target #其中network.target代表有網路,network-online.target代表一個連通著的網絡。
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini #是要運行的命令,文件要絕對地址。
Restart=always #總是重啟
RestartSec=5 #自動重啟當前服務間隔的秒數
StartLimitInterval=0 #無限次重啟,默認是10秒內如果重啟超過5次則不再重啟,設置為0表示不限次數重啟
使frpc服務生效
systemctl daemon-reload
systemctl enable frpc
systemctl start frpc
查看狀態
systemctl status frpc
遠程 SSH 連接開發板就是:
使用SSH工具登錄
- 用戶名,密碼:就是開發板上的用戶名和密碼
- IP地址:公網IP
- 端口:6000
frp配置http
type = tcp 的配置
服務端不修改
客戶端增加
frpc.ini
[common]
server_addr = 49.235.114.132
server_port = 7000
token = abc123
[web]
type = tcp
local_ip = 127.0.0.1
local_port = 48080
remote_port = 8080
type = http 的配置
服務端配置
frps.ini
[common]
bind_port = 7000
token = abc123
vhost_http_port = 8080
客戶端配置
frpc.ini
[common]
server_addr = 49.235.114.132
server_port = 7000
token = abc123
[web-48080]
type = http
local_port = 48080
local_ip = 127.0.0.1
服務起名字
服務名字是隨便取的,要求是不能重復。
當然一般可以起有意義的簡短名字加上端口號
比如 rdp7002、web-48080
比如 kepserver 上的 OPCUA server 服務,我只知道本地端口 49320 轉到服務端端口 49320
類似這樣
[OPCUA-49320]
type = http
local_port = 49320
local_ip = 127.0.0.1
remote_port = 49320
內網服務外網訪問
比如在內網服務器 192.168.10.8 上部署了一個服務 hello,端口 8080
想要能從外網通過公網 IP 訪問
可以在客戶端
[hello-8080]
type = tcp
local_ip = 192.168.10.8
local_port = 8080
remote_port = 8080
hello 相當于服務端的服務名字,不能重復,懶得起名可以使用 UUID
訪問地址:外網IP:8080
Docker 啟動和 toml 格式
Docker 啟動服務端實踐
文件夾
/app/frps
├── docker
│ ├── Dockerfile
│ └── frp
│ ├── frps
│ └── frps.toml
├── frps.toml
└── startup.sh
frps.toml
bindPort = 7000 #服務端監聽端口
auth.method = "token" #服務端連接身份認證,默認token
auth.token = "mytoken" #服務端token密碼
Dockerfile
FROM alpine:3.8
ENV VERSION 0.59.0
ENV TZ=Asia/Shanghai
ENV APP_DIR=/frp
WORKDIR $APP_DIR
COPY ./frp $APP_DIR
RUN apk add --no-cache tzdata \
&& ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone
VOLUME /frp
CMD /frp/frps -c /frp/frps.toml
構建
cd /app/frps/docker
docker build -t frps:1.0 .
啟動命令 startup
docker run -d \
--name frps \
--restart always \
-v /app/frps/frps.toml:/frp/frps.toml \
--log-opt max-size=1m \
--log-opt max-file=3 \
frps:1.0
重啟
docker restart frps
查看日志
docker logs -f frps
Docker 啟動客戶端實踐
內網,所以先下載了對應文件,然后使用 Dockerfile 制作鏡像。
優點:不使用 systemd 管理了,修改了 frpc.toml 后,docker 重啟服務即可。
文件夾,只保留 frpc 和 frpc.toml 文件
/app/frpc/docker/frp
|-- frpc
-- frpc.toml
Dockerfile
FROM alpine:3.8
ENV VERSION 0.59.0
ENV TZ=Asia/Shanghai
ENV APP_DIR=/frp
WORKDIR $APP_DIR
COPY ./frp $APP_DIR
RUN apk add --no-cache tzdata \
&& ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone
VOLUME /frp
CMD /frp/frpc -c /frp/frpc.toml
構建
cd /app/frpc/docker
docker build -t frpc:1.0 .
啟動
docker run -d \
--name frpc \
--restart always \
-v /app/frpc/frpc.toml:/frp/frpc.toml \
--log-opt max-size=1m \
--log-opt max-file=3 \
frpc:1.0
重啟
docker restart frpc
docker logs -f frpc
toml 格式配置文件
服務端 frpc.toml
serverPort = 7000
auth.method = "token"
auth.token = "服務端設置的token值"
客戶端 frpc.toml
serverAddr = "公網IP"
serverPort = 7000
auth.method = "token"
auth.token = "服務端設置的token值"
[[proxies]]
name = "redis-36379"
type = "tcp"
localIP = "192.168.10.8"
localPort = 36379
remotePort = 36379
[[proxies]]
name = "redis-26379"
type = "tcp"
localIP = "192.168.10.8"
localPort = 26379
remotePort = 26379
上面配置是將內網的一個 Redis 服務映射出去,測試用的。
客戶端和服務端版本,最好一致,不一致也能用。

浙公網安備 33010602011771號