Frp内网穿透
1.Frp简介
frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。
学习Frp最好的文档还是官方文档!
官方文档链接:https://gofrp.org/zh-cn/docs
2.下载
注:本文示例的版本为v0.58.1
官方下载链接:https://github.com/fatedier/frp/releases/tag/v0.58.1
若打不开可以从本页面下载:
frp_0.58.1_android_arm64.tar.gz
frp_0.58.1_darwin_amd64.tar.gz
frp_0.58.1_darwin_arm64.tar.gz
frp_0.58.1_freebsd_amd64.tar.gz
frp_0.58.1_linux_amd64.tar.gz
frp_0.58.1_linux_arm.tar.gz
frp_0.58.1_linux_arm64.tar.gz
frp_0.58.1_linux_arm_hf.tar.gz
frp_0.58.1_linux_mips.tar.gz
frp_0.58.1_linux_mips64.tar.gz
frp_0.58.1_linux_mips64le.tar.gz
frp_0.58.1_linux_mipsle.tar.gz
frp_0.58.1_linux_riscv64.tar.gz
frp_0.58.1_windows_amd64.zip
frp_0.58.1_windows_arm64.zip
3.安装
- 编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。
- 使用以下命令启动服务器:
./frps -c ./frps.toml
。 - 使用以下命令启动客户端:
./frpc -c ./frpc.toml
。 - 如果需要在后台长期运行,建议结合其他工具,如
systemd
和supervisor
。
4.配置文件
(1)服务器配置文件
bindPort = #设置Frp服务的端口(可选,默认为7000)[int]
bindAddr = #设置监听的地址(可选,默认0.0.0.0)[string]
kcpBindPort = #服务端监听 KCP 协议端口(可选)[int]
quicBindPort = #服务端监听 QUIC 协议端口(可选)[int]
proxyBindAddr = #设置代理监听地址(可选,默认和bindAddr相同)[string]
vhostHTTPPort = #HTTP类型代理监听的端口(可选)[int]
vhostHTTPTimeout = #HTTP类型代理在服务端的ResponseHeader超时时间,单位s(可选,默认60)[int]
vhostHTTPSPort = #HTTPS类型代理监听的端口(可选)[int]
tcpmuxHTTPConnectPort = #tcpmux类型代理监听的端口(可选)[int]
tcpmuxPassthrough = #对于tcpmux类型的代理是否透传CONNECT请求(可选,默认false)[bool]
custom404Page = #自定义 404 错误页面地址(可选)[string]
subdomainHost = #指定二级域名(可选)[string]
maxPortsPerClient = #限制单个客户端最大同时存在的代理数(可选,默认无限制)[int]
userConnTimeout = #用户建立连接后等待客户端响应的超时时间,单位s(可选,默认10)[int]
udpPacketSize = #代理 UDP 服务时支持的最大包长度,服务端和客户端的值需要一致(可选,默认1500)[int]
#鉴权配置(可选)
auth.method= #鉴权方式,可选值为 token 或 oidc(可选,默认为token)[String]
auth.additionalScopes= #鉴权信息附加范围,可选值为 HeartBeats 和 NewWorkConns(可选)[string[]]
auth.token= #设置token(可选)[String]
auth.oidc = #oidc 鉴权配置(可选)[AuthOIDCServerConfig](AuthOIDCServerConfig这里不做阐述,具体可以查看官方文档)
#ssh 隧道网关配置(可选)
SSHTunnelGateway.bindPort= #SSH 服务器监听端口(必选)[int]
SSHTunnelGateway.privateKeyFile= #SSH 服务器私钥文件路径(可选,默认读取autoGenPrivateKeyPath路径下的私钥文件)[string]
SSHTunnelGateway.autoGenPrivateKeyPath = #私钥文件自动生成路径(可选,默认为./.autogen_ssh_key)[string]
SSHTunnelGateway.authorizedKeysFile = #SSH 客户端授权密钥文件路径(可选,默认不进行SSH客户端鉴权认证)[string]
#WebServer配置(可选)
WebServer.addr = #监听地址(可选,默认127.0.0.1)[string]
WebServer.port = #监听端口(必选)[int]
WebServer.user = #设置用户名(可选)[string]
WebServer.password = #设置密码(可选)[string]
WebServer.assetsDir = #静态资源目录静态资源目录
#webServer.tls配置(可选)
WebServer.tls.certFile = #TLS 证书文件路径(必选)[string]
WebServer.tls.keyFile = #TLS 密钥文件路径(必选)[string]
WebServer.tls.trustedCaFile = #CA 证书文件路径(可选)[string]
WebServer.tls.serverName = #TLS Server 名称(可选)[string]
#日志配置(可选)
log.to = #日志输出文件路径,如果为 console则会输出到控制台(可选)[string]
log.level = #日志级别(可选,可选值为 trace, debug, info, warn, error,默认为info)[string]
log.maxDays = #日志文件最多保留天数(可选,默认为3)[int]
log.disablePrintColor = #禁用标准输出中的日志颜色(可选)[bool]
#允许代理绑定的端口配置(可选)
[[allowPorts]]
start = # 起始端口[int]
end = # 截止端口[int]
[[allowPorts]]
single = #端口[int]
(2)客户端配置文件
serverAddr = #服务器的IP(可选)[string]
serverPort = #服务端Frp的端口(可选,默认7000)[int]
dnsServer = #使用 DNS 服务器地址(可选,默认为系统设定的dns)[string]
loginFailExit = #第一次登陆失败后是否退出(可选,默认为true)[bool]
udpPacketSize = #代理 UDP 服务时支持的最大包长度(可选,默认为1500)[int]
transport.protocol = #和frps之间的通信协议,可选值为 tcp, kcp, quic, websocket, wss(可选,默认tcp)[string]
dialServerTimeout = #连接服务端的超时时间,单位s(可选,默认10)[int]
dialServerKeepalive = #和服务端底层 TCP 连接的 keepalive 间隔时间,单位s(可选,默认10)[int]
transport.poolCount = #连接池大小(可选)[int]
transport.tcpMux = #TCP 多路复用(可选,默认true)[bool]
#鉴权配置
auth.method= #鉴权方式,可选值为 token 或 oidc(可选,默认为token)[String]
auth.additionalScopes= #鉴权信息附加范围,可选值为 HeartBeats 和 NewWorkConns(可选)[string[]]
auth.token= #设置token(可选)[String]
auth.oidc = #oidc 鉴权配置(可选)[AuthOIDCServerConfig](AuthOIDCServerConfig这里不做阐述,具体可以查看官方文档)
#WebServer配置(可选)
WebServer.addr = #监听地址(可选,默认127.0.0.1)[string]
WebServer.port = #监听端口(必选)[int]
WebServer.user = #设置用户名(可选)[string]
WebServer.password = #设置密码(可选)[string]
WebServer.assetsDir = #静态资源目录静态资源目录
WebServer.pprofEnable = #启动 Go HTTP pprof,用于应用调试(可选)[bool]
#webServer.tls配置(可选)
WebServer.tls.certFile = #TLS 证书文件路径(必选)[string]
WebServer.tls.keyFile = #TLS 密钥文件路径(必选)[string]
WebServer.tls.trustedCaFile = #CA 证书文件路径(可选)[string]
WebServer.tls.serverName = #TLS Server 名称(可选)[string]
#日志配置(可选)
log.to = #日志输出文件路径,如果为 console则会输出到控制台(可选)[string]
log.level = #日志级别(可选,可选值为 trace, debug, info, warn, error,默认为info)[string]
log.maxDays = #日志文件最多保留天数(可选,默认为3)[int]
log.disablePrintColor = #禁用标准输出中的日志颜色(可选)[bool]
#Tcp & Udp 配置
[[proxies]]
name = #隧道名字[string]
type = "tcp"
localIP = #代理的IP[string]
localPort = #代理的端口[int]
remotePort = #映射的远程端口[int]
transport.useEncryption = true #frpc 与 frps 之间的通信内容加密传输
transport.useCompression = true #对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量
#负载均衡
loadBalancer.group = #分组名称[string]
loadBalancer.groupKey = #分组key[string]
transport.bandwidthLimit = "1MB" #代理限速,目前仅支持 MB 和 KB 单位
#Http & Https 配置
[[proxies]]
name = "web"
type = "http"
localPort = 80
customDomains = ["域名"]
transport.proxyProtocolVersion = "v2" #获得代理的请求的真实 IP
transport.bandwidthLimit = "1MB" #代理限速,目前仅支持 MB 和 KB 单位
subdomain = #代理的二级域名[string]
#仅限Http请求
hostHeaderRewrite = #修改请求头Host字段[string]
requestHeaders.set.字段 = 值[string]
# 设置 BasicAuth 鉴权
httpUser = #用户名[string]
httpPassword = #密码[string]
#配置证书
[proxies.plugin]
type = "https2https"
localAddr = "127.0.0.1:443"
crtPath = #证书文件路径[string]
keyPath = #密钥文件路径[string]
5.附录
(1)HeartBeats 和 NewWorkConns
(2)透传
指的是代理服务器接收到CONNECT
请求后,不对其进行处理,直接将这个请求转发给目标服务器。这样,代理服务器就像是一个透明的中介,不对传递通过它的数据做任何修改。