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,就是客户端和服务端通信的端口,不是你转发的那个端口,如果要改端口,客户端和服务端两边的配置文件都要改
[[proxies]]
name = "web01"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 80
# 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
transport.proxyProtocolVersion = "v2"
使用frp内网穿透时获取用户的真实ip
[[proxies]]
name = "webhttps"
type = "tcp"
localIP = "127.0.0.1"
localPort = 443
remotePort = 443
# 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
transport.proxyProtocolVersion = "v2"
使用frp内网穿透时获取用户的真实ip
启动
要先启动frp服务端
./frps {start|stop|restart|status|config|version}
再启动frp客户端
Windows黑窗口使用命令
frpc.exe -c frpc.ini # windown上启动客户端
linux终端使用命令
./frpc {start|stop|restart|status|config|version} # 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
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