frp 内网穿透 多系统 多模式(详细+多个应用)

由于国内的家庭宽带多数都没有公网ip,ipv6的公网ip通常不固定,内网穿透就是来解决这个问题
内网穿透需要一个有公网ip的服务器,如果没有一个公网ip的服务器(比如云服务器),则不能穿透
整篇比较长(1万多字),都是实际经验,经过时间验证的,可以参考目录找到自己需要的

一、基本概念

frp有两个程序,frps和frpc,这两个程序是独立的。(如果只用一个可以删除)
服务端,是指具有公网ip的服务器,运行frps
客户端,是指需要被访问的服务器,运行frpc
访问端,需要访问客户端的设备,根据运行模式,或使用frpc(官方没有这个说法,但是为了方便理解,我这里这么说了,算是我定义的吧)


内网穿透的意义:就是解决服务没有公网的问题,但是要先找一个有公网的服务器
为什么不直接用云服务器?涉及到成本,比如你存文件,随便搞几个大硬盘没多少钱,但是你用云服务器价格至少10倍以上,内网穿透就是用低廉的本地服务器配上低价买的公网ip的组合,如果哪一天人人有公网ip了,这个教程就没有意义了(期待一下ipv6民用宽带的普及)

二、frp的下载、安装、启动(windows+linux)

在这里插入图片描述

本教程以0.51.3版本为例(2023年8月版本),0.52开始配置文件变化很大,作者写的是v2的版本正在开发。
最近几个月的版本作者进行了大幅度的改变,很多以前的配置已经不能用了,所以这里还是演示老版本的
官方链接: frp github 《-点击这个也会有显示csdn的镜像
参考文档: frp 文档


穿透一个服务至少要配置两次frp,一个在客户端一个在服务端,不是只配置一个服务端就可以了,所以把windows和linux的客户端、服务端都写了,方便搭配。windows和linux的配置文件完全一样,只有程序运行方式和管理方式略有不同。
注意:无论是客户端还是服务端,都需要在防火墙开用到的对应端口,windows系统手点点就行,云服务器一般可以在控制台设置,自己的服务器根据不同的系统,有的有防火墙的自行放行对应端口,下面的教程不再赘述
下面配置中的所有端口都要开放,包括服务的端口,数据交换的端口,仪表盘的端口,网上很多人是建议关闭防火墙省去这些麻烦,但是我不建议这么做。

(一)windows下安装部署

1.下载如下的文件

在这里插入图片描述

2.解压,目录如下,将文件夹改名为frp并放到C:/目录下(方便使用)

注意:最新的版本中,配置文件时.ini结尾的,现在换成了toml,配置名称发生了较大的改变,我这里暂时还是用老版本的,以后会更新最新版本的

3.运行,如果杀毒软件警告,请允许通过。

还有一种可能,杀毒软件自己删掉了,需要设置信任。
按快捷键windows+R,输入cmd并点击确认(进入命令提示)
在这里插入图片描述进入到frp目录下

cd c:/frp

如果没有改好配置文件,默认的配置运行如下命令是会报错的。不同需求配置方法不一样,往下看具体的配置

客户端运行,用下面的命令:

frpc.exe -c frpc.ini

服务端运行,用下面的命令:

frps.exe -c frps.ini

windows下我就写的详细点,大致如图(图上是运行frp客户端的):
这里会报错,因为没有具体配置,由于一个内网穿透要配置多台机器,还可能跨平台,所以这么写
需要在每台设备这样配置,而不是一台配置就完事了

在这里插入图片描述

4.windows下的开机自启动

参考章节五中的(四)

(二)linux下安装部署

linux多个发行版都可以用下面的,因为不涉及到依赖安装

1.下载解压

软件安装的目录,这是我的习惯,你可以到别的目录

cd /usr/local

下载(如果下载速度慢,就找镜像下载下来上传,国内github不定期抽风)

wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz

解压

tar -zxvf frp_0.51.3_linux_amd64.tar.gz

改名并进入目录

mv ./frp_0.51.3_linux_amd64 ./frp && cd frp

2.测试运行

如果没有改好配置文件,默认的配置运行如下命令是会报错的。不同需求配置方法不一样,下一节的应用里有详细说明
需要在每台设备这样配置,而不是一台配置就完事了
在frp的软件目录下,使用如下命令:
frp客户端

./frpc -c ./frpc.ini

frp服务端

./frps -c ./frps.ini

3.文件说明

frpc:客户端的二进制程序(go编译的)
frpc.ini:作为自己的客户端的配置文件
frps:服务端的二进制程序(go编译的)
frps.ini:作为自己的服务端的配置文件
可以看到每两个是一组的,可以删掉用不到的一半

三、运行模式、配置及应用

(一)应用场景1-标准内网穿透

标准的穿透,等同于将内网的服务器搬到了公网。
不能控制访问者,如果需要控制,需要在在应用层面控制。
你在网上看到别人的教程一般就是这个


案例:访问内网的windows(远程桌面)系统,穿透3389端口
其它端口穿透方法一致,就是改个数
如果要穿透ssh,穿透22端口,客户端在linux上配置即可
强烈建议:公网的端口不要使用默认的3389,因为这个端口太有名了,很容易被扫然后进行破解,我这里的公网是3389只是为了方便说明,请自己一定要换公网的一个别的端口。我尝试过,每秒至少会有3-10次的破解

1.公网ip服务器:运行配置frps(linux系统)

买的公网服务器通常使用liunx,常用的liunx系列都可以
在这个服务器下载并解压frp(上一节有)
修改配置文件

vi /usr/local/frp/frps.ini

内容修改如下,详细解释在代码里

[common]
# 服务端和客户端的tcp通信端口,建议1024以上端口
bind_port = 10086
# 服务端和客户端udp通信端口,本案例中不需要
bind_udp_port = 7001
# 客户端访问服务端的密码
token = abc123456

# 服务端仪表盘的端口,可以用浏览器访问查看
dashboard_port = 8888
# 服务端仪表盘的用户密码,自己设定,这里随便写的
dashboard_user = abc
dashboard_pwd = abc123456

# 日志保存设定,保存位置、保存时长
log_file = ./frps.log
log_level = info
log_max_days = 7

写成systemctl服务

vi /usr/lib/systemd/system/frps.service

内容如下

[Unit]
Description=frps
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
ExecStop=/bin/kill $MAINPID
Restart=always 
RestartSec=5

[Install]
WantedBy=multi-user.target

刷新systemctl

systemctl daemon-reload

启动、开机启动

systemctl start frps && systemctl enable frps

查看运行状态

systemctl status frps

2.被访问的设备:运行配置frpc(windows)

下载安装
双击打开frpc.ini
修改如下:

[common]
# 服务端的ip,这里的xxx替换为你的公网服务器ip
server_addr = xxx.xxx.xxx.xxx
# 服务端口,设置为上面服务端设置的
server_port = 10086
# 客户端和服务端通信的密码
token = abc123456

[3389]
type = tcp
# 访问本机的服务
local_ip = 127.0.0.1
# 端口
local_port = 3389
# 如果这里写比如2222,那么你远程访问的时候就是2222端口才能访问了
remote_port = 3389

打开cmd(命令提示符)

cd c:/frp
frpc -c frpc.ini

成功后如下,请不要关闭这个窗口:
在这里插入图片描述

3.使用远程桌面访问

如果你是别的服务,就用对应的工具。xxx替换为你的公网服务器ip
注意:部分windows是默认关闭远程桌面的,你需要先开启
强烈建议:公网的端口不要使用默认的3389,因为这个端口太有名了,很容易被扫然后进行破解
如果比如公网是13389端口,那么下图中的计算机名就是xxx.xxx.xxx.xxx:13389
在这里插入图片描述

(二)应用场景2-安全内网穿透stcp

安全的穿透,访问时需要启动frp的客户端。
使用stcp协议,自带认证。这种方法要配置3次frp。


案例:访问公司内网的服务器(通过ssh),不希望别人也能直接访问端口

1.服务端-公网ip服务器(linux)

修改配置文件,下载解压等操作在上一节

vi /usr/local/frp/frps.ini

内容修改如下,详细解释在代码里

[common]
# 服务端和客户端的tcp通信端口,建议1024以上端口
bind_port = 10086
# 服务端和客户端udp通信端口,本案例中不需要
bind_udp_port = 7001
# 客户端访问服务端的密码
token = abc123456

# 服务端仪表盘的端口,可以用浏览器访问查看
dashboard_port = 8888
# 服务端仪表盘的用户密码,自己设定,这里随便写的
dashboard_user = abc
dashboard_pwd = abc123456

# 日志保存设定,保存位置、保存时长
log_file = ./frps.log
log_level = info
log_max_days = 7

写成systemctl服务

vi /usr/lib/systemd/system/frps.service

内容如下

[Unit]
Description=frps
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
ExecStop=/bin/kill $MAINPID
Restart=always 
RestartSec=5

[Install]
WantedBy=multi-user.target

刷新systemctl

systemctl daemon-reload

启动、开机启动

systemctl start frps && systemctl enable frps

查看运行状态

systemctl status frps
2.客户端-公司内部服务器(linux)
vi /usr/local/frp/frpc.ini

内容如下

[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 10086
token = abc123456

[ssh]
# 注意此处的类型为stcp
type = stcp
# 和访问者一致,相当于验证密码
sk = abcdefg
# 访问的本地内网的ip和地址
local_ip = 127.0.0.1
local_port = 22

写成systemctl服务

vi /usr/lib/systemd/system/frpc.service

内容如下

[Unit]
Description=frpc
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini
ExecStop=/bin/kill $MAINPID
Restart=always 
RestartSec=5

[Install]
WantedBy=multi-user.target

刷新systemctl

systemctl daemon-reload

启动、开机启动

systemctl start frpc && systemctl enable frpc

查看运行状态

systemctl status frpc
3.访问端-自己的pc(windows)

打开编辑frpc.ini

[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 10086
token = abc123456

[p2p]
type = stcp
# 角色为访问者
role = visitor
# 和客户端的服务名称,就是[]里的一样
server_name = ssh
# 和客户端的sk保持一致
sk = abcdefg
bind_addr = 127.0.0.1
bind_port = 22

打开cmd(命令提示符)

cd c:/frp
frpc -c frpc.ini

这时候,访问本地的端口127.0.0.1:22就可以了。
这个应用的整个连接的大致:
访问端127.0.0.1:22端口——服务端的10086端口——客户端的127.0.0.1:22端口
注意,此时的最大带宽就是你的公网ip带宽和你现在的带宽的最小的那个

(三)应用场景3-点对点穿透p2p

访问端和客户端之间直接建立连接,带宽不受限于服务端(有公网ip的)的带宽
速度快,通常可以大幅超过有公网服务器的带宽。
注意:和第二个案例的唯一区别就是通讯协议为xtcp,其余一样,为了方便查阅,还是完整写了一遍


案例:拿我自己的案例吧,我自己写了个http协议的网盘吧,直接穿透速度太慢(受限于公网的带宽,通常不高),我就用了这个点对点协议,速度就上来了,但是一个小区内(对外ip一致的)是不能通过这个连通的,所以你要试验就找远点的地方测试。

1.服务端-公网ip服务器(linux)

修改配置文件,下载解压等操作在上一节

vi /usr/local/frp/frps.ini

内容修改如下,详细解释在代码里

[common]
# 服务端和客户端的tcp通信端口,建议1024以上端口
bind_port = 10086
# 服务端和客户端udp通信端口,必须开启这一个端口!
bind_udp_port = 7001
# 客户端访问服务端的密码
token = abc123456

# 服务端仪表盘的端口,可以用浏览器访问查看
dashboard_port = 8888
# 服务端仪表盘的用户密码,自己设定,这里随便写的
dashboard_user = abc
dashboard_pwd = abc123456

# 日志保存设定,保存位置、保存时长
log_file = ./frps.log
log_level = info
log_max_days = 7

写成systemctl服务

vi /usr/lib/systemd/system/frps.service

内容如下

[Unit]
Description=frps
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
ExecStop=/bin/kill $MAINPID
Restart=always 
RestartSec=5

[Install]
WantedBy=multi-user.target

刷新systemctl

systemctl daemon-reload

启动、开机启动

systemctl start frps && systemctl enable frps

查看运行状态

systemctl status frps

2.客户端-内网需要被穿透的服务器(linux)

vi /usr/lib/systemd/system/frpc.service

内容如下

[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 10086
token = abc123456

[p2p]
# 注意此处的类型为xtcp
type = xtcp
# 和访问者一致,相当于验证密码
sk = abcdefg
# 访问的本地内网的ip和地址
local_ip = 127.0.0.1
local_port = 5188

写成systemctl服务

vi /usr/lib/systemd/system/frpc.service

内容如下

[Unit]
Description=frpc
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini
ExecStop=/bin/kill $MAINPID
Restart=always 
RestartSec=5

[Install]
WantedBy=multi-user.target

刷新systemctl

systemctl daemon-reload

启动、开机启动

systemctl start frpc && systemctl enable frpc

查看运行状态

systemctl status frpc

3.访问端-需要访问服务器的电脑(windows)

打开编辑frpc.ini

[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 10086
token = abc123456

[p2p]
type = xtcp
# 角色为访问者
role = visitor
# 和客户端的服务名称,就是[]里的一样
server_name = p2p
# 和客户端的sk保持一致
sk = abcdefg
bind_addr = 127.0.0.1
bind_port = 5199

打开cmd(命令提示符)

cd c:/frp
frpc -c frpc.ini

这时候,访问本地的端口127.0.0.1:5188就可以了。
这个应用的整个连接的大致:
访问端127.0.0.1:5199端口——通过公网服务器建立连接到——客户端的127.0.0.1:5188端口
理论上能跑满访问端和客户端两边的带宽最小值,但是实测是达不到的,中间还有很多不可控的因素。(比如通信公司的机房限制,数据完整性的验证造成的损耗)


小结:

1.可以看到,上面三个案例,服务端frps的配置是一样的,除了部分需要开启udp协议的端口。
2.frp的服务端是提供穿透服务的,具体的连接不再服务端内容写,而是在客户端写
3.如果需要穿透多个端口,直接把[xxx]及下面的配置复制到下面就行
注意,无论是客户端还是服务端都可以部署在任何系统中,甚至是多架构,arm,mips,risv都有
我的案例中部署的系统是做个演示而已

四、其它应用

(一)NAS及个人存储

我觉得不少人是为了这个来的
每个nas系统、每个人开的服务都不一样。如果想要穿透,遵循几个步骤
1.确定你开的服务的端口,可能不止一个,通常底层协议都是tcp,少数是udp(名字大概率不叫tcp或udp)
2.内网(局域网)内能访问
3.按照上面的应用场景1的标准穿透方法搞,具体情况具体分析
4.不建议随意穿透,那样所有人都能访问,建议有安全措施,比如需要账号登录
5.绝对不要内网和外网的端口一样,默认的著名端口都会被扫描!

常见的有ftp,smb,ntf等,

(二)websocket

ws用tcp来做穿透就可以了。wss需要证书,使用的时候注意证书配置。
用法和配置ssh穿透一样。
会用wss的肯定懂怎么操作

(三)http和https网站

首先声明,如果在国内的域名解析到云服务器,是需要备案的,否则无法访问
http和https在frp里有配套的类型type=http,type=https
但是建议使用tcp(http和https的底层也是tcp,先不讨论http3.0),在frp用http作为类型配置有很多细节,基础掌握不牢很容易配置错误,就按照上面的ssh这些配置就行,如果需要将访问者的ip同时传递,在frpc的配置文件中添加proxy_protocal_version = v2(这时候ip会出现在请求头里面,如果你开了cdn,还是让cdn加到请求头中吧,不要用这个了)
(frp还可以像nginx那样做负载均衡等操作,这里就不细说了,通常家用不会涉及到这些)

五、其它说明和常见问题

(一)仪表盘(一般不会天天去看的)

用浏览器访问,地址栏输入
你的公网ip:8888(端口是上面自己设置的,本教程的是8888)
如下图,可以在proxies选项下查看具体的协议及使用量

(二)多个公网ip(云服务器)访问一个内网服务(设备)

本地一个服务,但是可以通过两个公网ip的云服务器进行访问
如果需要确保有一条备用的线路或者使用dns负载均衡(这样就把多个小云服务器利用起来了)
具体方法是在客户端配置两个frpc进程,用不同的配置文件。同时部署两个服务端即可
比如:
客户端(本地服务设备)
用frpc将frpc.ini和frpc_b.ini(复制一份改改)分别启动(同样要写两个服务)
每个配置的文件都是对应具体的服务端(公网ip)
服务端(云服务器)
在两台公网服务器中配置两个一模一样的frps

(三)多台内网服务(设备)共用一个公网ip(云服务器)

本地有多台设备和服务需要穿透,只有一个云服务器
假如有多台设备要穿透,无需给每个服务都配个云服务器,只需要分别配置frpc即可,当然可以在一台设备配置,然后穿透的ip为局域网内的ip。但是不建议这么做,这样服务就依赖这个主服务器,一旦运行frpc的这台宕机了,其它穿透也失效了,建议每个设备自己部署自己的frpc。
注意:穿透后的公网端口不能重复

(四)windows系统下开机启动和一键启动脚本

windows开机启动可以用计划任务,运行bat脚本。
下面给个bat脚本的案例访问端的,仅供参考。
在c:/frp中新建xxx.bat,然后把这个bat文件放到桌面快捷方式,就算移动了frp程序的文件夹,也可以不用修改地址


功能说明:
运行frpc,2s后打开默认浏览器(根据你的系统设置),访问本地5199端口(可以把手动操作的全部写上,这样以后双击脚本就有自己想要的了)
注意这种写法是用的相对的位置,因为脚本文件和程序一个目录,更多的用法请去学习bat脚本的写法

start frpc.exe -c frpc.ini
timeout /nobreak /t 2
@echo off
explorer.exe http://127.0.0.1:5199/

如果单纯的启动就更简单了,如下
客户端

frpc.exe -c frpc.ini

服务端

frps.exe -c frps.ini

(五)其它应用中的问题

1.限制客户端使用服务端公网的端口

在服务端的frps中添加允许开启的端口,用英文逗号分割
allow_ports = 80,443,xxxx

2.使用tcp流复用

在服务端的frps中开启tcp_mux=true

3.frp还有使用加密证书的功能,可以单向验证和双向验证

一个是数据交换通道的加密,即frps中的bind_port配置 (这个重要,数据从这个端口进行交换的)
还有就是仪表盘的证书加密。参考我的这篇博客。注意:如果配置了,每个关联的客户端、服务端和访问端都要配置。
教程: frp ssl证书配置

(六)杀毒警告和误报

1.windows下部分杀毒软件会提示有风险

原因有多方面,因为这个软件可以开端口、操作文件等重要的操作。杀毒软件一般会提出警告。
放行即可(多数杀毒软件不会报)

2.部分云服务器会清除frp

原因我也不知道,但是只遇到过一次。可能是因为可以用作代理?

(七)查询日志

日志通常查询服务端的frps.log还有本地的frpc的日志,里面有具体的连接ip,可以看看归属地,其中有不少是搜索引擎的爬虫,也有可能发现入侵者,建议定期查阅日志,提早发现可疑的使用者。


有什么问题就在下面问吧,假如我恰好知道,肯定回复你
如果有错误,也请指出来。

  • 18
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
要实现frp内网穿透多台机器的功能,你需要按照以下步骤进行操作: 1. 首先,确保你有一台有公网IP的云主机,可以用作frp的服务器端。 2. 在云主机上安装并配置frp服务端。可以使用引用中提供的frp服务端自动拉起脚本来方便地进行安装和配置。 3. 在frp服务端的配置文件frps.ini中添加对应的多个映射规则。你可以参考引用中的配置示例来编写frps.ini文件。在配置文件中,你需要为每台需要进行内网穿透的机器定义一个对应的映射规则,并设置相应的参数,如本地IP、本地端口和远程端口等。 4. 在每台需要进行内网穿透的机器上安装frp客户端,并配置对应的frpc.ini文件。根据引用中的配置示例,你可以为每台机器定义一个对应的配置段,设置type、local_ip、local_port、remote_port等参数。 5. 启动frp服务端和客户端。首先启动frp服务端,在云主机上运行frps命令。然后在每台机器上分别运行frpc命令启动对应的frp客户端。 6. 验证内网穿透是否成功。可以使用frp提供的客户端工具或者其他网络工具来验证内网穿透是否生效,例如通过访问云主机的IP和对应的远程端口来访问内网机器的服务。 通过以上步骤,你可以实现frp内网穿透多台机器的功能。每台机器通过配置不同的映射规则,可以分别将内网服务暴露在公网环境中。请注意,确保云主机的端口放行和frp服务端和客户端的配置参数与映射规则保持一致,以确保正常的内网穿透功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ziqibit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值