FRP内网穿透服务

frp 的作用

利用处于防火墙后的机器,对外网环境提供 http 或 https 服务。

对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。

利用处于防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司局部环境的主机。

有了内网穿透你能干什么?

远程访问内网的 http/https 服务
远程桌面(Windows/Mac)
远程文件、 SSH
小程序开发
有了内网穿透在外访问家里的电脑、NAS、树莓派、摄像头等网络设备或远程控制,那都不是事儿~
frp是一个开源的内网穿透应用,有客户端软件和服务端软件,大概工作过程如下:

服务端运行在具有公网IP的服务器上,比如Linux上,并监听某个端口,等待客户端连接。
客户端运行在需要穿透的内网机器上,比如本地电脑上,连接到服务器之后,服务器开始监听客户端需要穿透的指定端口。
外网用户连接服务器监听的指定端口,然后服务器将用户数据转发到内网客户端,实现内网穿透

frp工作原理

服务端运行,监听一个主端口,等待客户端的连接;

客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;

服务端fork新的进程监听客户端指定的端口;

外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;

客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。

原理简单解释

服务器端和客户端约定通过7000端口通信,客户端告诉服务端要监听6000端口(客户端配置的remote_port =6000),然后外网服务器就会监听是否有连接请求:外网服务器Ip地址:6000,如果有就把连接给客户端,这样就可以达到内网穿透的目的。

配置http穿透

  • 有域名配置http穿透

编辑frps.ini文件

#默认端口7000,就是客户端和服务端通信的端口,不是你转发的那个端口,如果要改端口,客户端和服务端两边的配置文件都要改
bind_port = 7000 

# 控制台配置,frp的web管理控制台的用户名和密码,7500是默认端口(所以前面把7500端口提前放开了),可以通过服务端ip+7500端口登录
dashboard_port = 7500 
dashboard_user = admin 
dashboard_pwd = admin

# 配置http和https服务要监听的端口,这两个端口也要在阿里云安全组上放开,且不能是服务器已经使用的端口
# 为将服务器的80端口做http,443端口做https,原理就像nginx一样,可以多个网站使用这两个端口。
vhost_http_port = 80
vhost_https_port = 443

编辑frpc.ini文件

[common]
server_addr = 云服务器公网IP        #frps服务端所在的公网IP
server_port = 7000        # 默认端口7000,就是客户端和服务端通信的端口,不是你转发的那个端口,如果要改端口,客户端和服务端两边的配置文件都要改

[ssh]        # frp内网穿透通道的名称,一定要唯一,自定义
type = tcp    # 连接类型
local_ip = 127.0.0.1    # 本地的地址
local_port = 22        # 穿透到本地内网的端口号
remote_port = 6000    # 本次TCP服务要监听的端口,就是外网服务器要监听的端口

# 自己有域名配置http穿透,要将指定域名解析到frps服务端的IP上。
[httptest]    # frp内网穿透通道的名称,一定要唯一,自定义
type = http    # 连接类型
local_ip = 127.0.0.1    # 本地的地址
local_port = 8081    # 穿透到本地内网的端口号
custom_domains = test.yang.com    # 填写你已经解析到frps服务端IP上的域名
# custom_domains = 这里填写你已经解析到frps服务端IP上的域名,自己每个穿透对应服务,都可以绑定一个专属域名用于访问,包括使用tcp和udp协议。然后就可以通过这个已经自定义域域名访问到自己的对应HTTP服务。

另外一种配置方式

有域名的http穿透是通过在frpc.ini中配置custom_domains域名,还有另外一种方式,就是在当 frp服务器frps.ini 中配置了 subdomain_host 参数(配置二级域名),并为所有用户提供了子域名服务.那么此时可以在frpc.ini中使用 subdomain 参数,其参数值应仅为主机头 .

例如:服务器frps.ini提供了subdomain_host= frp.com 的泛域名服务,那么在frpc.ini中设置 subdomain = nas 就可以使用 nas.frp.com 来穿透本条服务,当然主机头也是唯一性的,先到先得.此种配置多数用于 自建frps服务器 ,方便自己使用一个域名的泛域名来配置穿透.

  • 无域名配置http穿透

编辑frps.ini文件

#默认端口7000,就是客户端和服务端通信的端口,不是你转发的那个端口,如果要改端口,客户端和服务端两边的配置文件都要改
bind_port = 7000 

# 控制台配置,frp的web管理控制台的用户名和密码,7500是默认端口(所以前面把7500端口提前放开了),可以通过服务端ip+7500端口登录
dashboard_port = 7500 
dashboard_user = admin 
dashboard_pwd = admin

编辑frpc.ini文件

[common]
server_addr = 云服务器公网IP        #frps服务端所在的公网IP
server_port = 7000        # 默认端口7000,就是客户端和服务端通信的端口,不是你转发的那个端口,如果要改端口,客户端和服务端两边的配置文件都要改

[httpname]        # frp内网穿透通道的名称,一定要唯一,自定义
type = tcp    # 连接类型
local_ip = 127.0.0.1    # 本地的地址
local_port = 8082    # 穿透到本地内网的端口号
remote_port = 6000    # 访问公网IP+6000就可以访问127.0.0.1:8082了


启动

要先启动frp服务端

./frps -c ./frps.ini &    #后台启动
nohup ./frps -c ./frps.ini &  #后台启动

再启动frp客户端

Windows黑窗口使用命令

frpc.exe -c frpc.ini  # windown上启动客户端

linux终端使用命令

./frpc -c frpc.ini  # linux上启动客户端

查看面板

frp穿透服务已经成功了,我们再查看下frp面板,浏览器地址栏输入:服务器公网IP+7500

如果frp客户端配置在Linux上,远程连接

连接:

ssh -o Port=6001 test@x.x.x.x

注:test为内网机器的用户名,x.x.x.x为服务器的公网IP,连接时需要输入内网test用户的密码


服务开机自启动/重启/查看状态命令

FRPS

vim /usr/lib/systemd/system/frps.service
[Unit]
Description=frps
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/home/frps/frps -c /home/frps/frps.ini  
#这里是执行文件的路径和配置文件的路径
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

FRPC

vim /usr/lib/systemd/system/frpc.service
[Unit]
Description=frpc daemon
After=syslog.target network.target
Wants=network.target

[Service]
Type=simple
#此处的路劲地址根据自己的实际放置的地址进行修改
ExecStart=/home/frpc/frpc -c /home/frpc/frpc.toml
Restart=always
RestartSec=1min

[Install]
WantedBy=multi-user.target

解析一下



[Unit]

Description=Frp Server Service           # 服务描述

After=network.target                    # frps 将会在 network.service 启动完毕之后再启动

[Service]

Type=simple              # 不论进程是否启动成功,systemctl start 都执行成功

User=nobody           # 设置进程在执行时使用的用户   为了不报错 最好直接用 root

Restart=on-failure      # on-failure 表示仅在服务进程异常退出时重启

RestartSec=5s             # 设置在重启服务前暂停多长时间

ExecStart=/usr/bin/frps -c /etc/frp/frps.ini             # 在启动该服务时需要执行的命令行

[Install]

WantedBy=multi-user.target        # 用于 systemctl enable 时创建软连接 


第一、启动、终止、重启

systemctl start frpc.service #启动

systemctl stop frpc.service #停止

systemctl restart frpc.service #重启

第二、设置开机启动/关闭

systemctl enable frpc.service #开机启动

systemctl disable frpc.service #开机不启动

第三、检查frpc状态

systemctl status frpc.service

第四、查看所有已启动的服务

systemctl list-units --type=service

版本更新

下载地址:

FRP下载地址

Down: 蓝秦网盘 Down蓝秦网盘

密码:bpcd

  • 0.58.1 版

修复

修复了 https2http 和 https2https 插件未启用 HTTP/2 的问题。

修复 INI 配置参数默认值与其他配置格式不一致的问题。

变化

将默认值从 60 更新为 30。transport.tcpMuxKeepaliveInterval

在Android平台上,只有在无法获取默认DNS服务器时才会使用Google DNS服务器。

  • v0.57.0

特征

https2http插件现在支持 Header。https2httpsX-Forwared-For

修复

X-Forwared-For现在,在对代理类型 HTTP 的后端服务器的请求中正确设置了标头。

  • v0.56.0 版

特征

支持使用 go 模板语法在 TOML/YAML/JSON 配置文件中映射范围端口。

例如:


{{- range $_, $v := parseNumberRangePair "6000-6006,6007" "6000-6006,6007" }}
[[proxies]]
name = "tcp-{{ $v.First }}"
type = "tcp"
localPort = {{ $v.First }}
remotePort = {{ $v.Second }}
{{- end }}

这将创建 8 个代理,例如 .tcp-6000, tcp-6001, ... tcp-6007

健康检查支持自定义请求头。

为Android系统开启兼容模式,解决时区问题和默认DNS解析失败导致的日志时间不正确的问题。

修复

修复按天轮换日志的间隔时间不正确的问题。

默认禁用quic-go的ECN支持。它可能会导致某些操作系统出现问题。

  • v0.55.1 版

没有功能更改,只是修复了 0.55.0 版中没有发布资产的问题。

  • v0.55.0 版

显著变化

支持的最低 Go 版本已更新为 。在新版本的 Go 中,默认支持的最低 TLS 版本已更改为 。1.22TLS 1.2

的默认值已从 更改为 。如果配置文件使用不存在的配置项目或出现拼写错误,则应用程序将引发错误。此启动参数是在版本 中引入的。如果希望继续使用旧行为,则需要显式设置 。--strict-configfalsetruev0.53.0--strict-config=false

特征

代理支持配置注解,注解将显示在 frps 仪表板中。

变化

删除了对 kcp-go 和 beego log 的分叉版本的依赖,kcp-go 现在使用上游版本,golib/log 取代了 beego log。

  • v0.54.0 版

弃用通知

不推荐在标志名称中使用下划线,并已替换为连字符。下划线格式将在一段时间内保持兼容,直到在将来的版本中完全删除。例如,替换为 。--remote_port--remote-port

特征

和 按钮已添加到 frps 的仪表板中。RefreshClearOfflineProxies

修复

路由规则中的主机/域匹配已更改为不区分大小写。

  • v0.53.2

修复

FRPC在登录时有一定的几率恐慌:关闭关闭通道。

  • v0.53.0

特征

添加了新的命令行参数以启用严格的配置验证模式。它将为未知字段抛出错误,而不是忽略它们。在未来的版本中,我们会将此参数的默认值设置为 true,以避免配置错误。--strict_config

支持。使用此功能,您可以在不运行 frpc 的情况下公开本地服务,只需使用 SSH。与 frpc 代理相比,SSH 反向隧道代理具有许多功能限制。目前支持的代理类型包括 tcp、http、https、tcpmux 和 stcp。SSH reverse tunneling

frpc tcpmux 命令行参数已更新为支持配置 和 。http_userhttp_pwd

frpc stcp/sudp/xtcp 命令行参数已更新为支持配置 .allow_users

修复

frpc:首次登录尝试失败并退出时返回代码 1。

当 auth.method 为 且 auth.additionalScopes 包含 时,如果获取 AccessToken 失败,则应用程序将无响应。oidcHeartBeats

评论留言
验证码
一共0条留言
︿