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穿透
编辑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服务器 ,方便自己使用一个域名的泛域名来配置穿透.
编辑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
版本更新
下载地址:
密码:bpcd
修复
修复了 https2http 和 https2https 插件未启用 HTTP/2 的问题。
修复 INI 配置参数默认值与其他配置格式不一致的问题。
变化
将默认值从 60 更新为 30。transport.tcpMuxKeepaliveInterval
在Android平台上,只有在无法获取默认DNS服务器时才会使用Google DNS服务器。
特征
https2http插件现在支持 Header。https2httpsX-Forwared-For
修复
X-Forwared-For现在,在对代理类型 HTTP 的后端服务器的请求中正确设置了标头。
特征
支持使用 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支持。它可能会导致某些操作系统出现问题。
没有功能更改,只是修复了 0.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。
弃用通知
不推荐在标志名称中使用下划线,并已替换为连字符。下划线格式将在一段时间内保持兼容,直到在将来的版本中完全删除。例如,替换为 。--remote_port--remote-port
特征
和 按钮已添加到 frps 的仪表板中。RefreshClearOfflineProxies
修复
路由规则中的主机/域匹配已更改为不区分大小写。
修复
FRPC在登录时有一定的几率恐慌:关闭关闭通道。
特征
添加了新的命令行参数以启用严格的配置验证模式。它将为未知字段抛出错误,而不是忽略它们。在未来的版本中,我们会将此参数的默认值设置为 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