原创

FRP内网穿透

温馨提示:
本文最后更新于 2022年10月19日,已超过 926 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

官网文档https://gofrp.org/docs/

1.什么是frp

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

2.frp能做什么?

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。

  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。

  • 代理组间的负载均衡。

  • 端口复用,多个服务通过同一个服务端端口暴露。

  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。

  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。

  • 服务端和客户端 UI 页面。

3.安装

下载地址https://github.com/fatedier/frp/releases

4.如何使用?

启动方式

#linux服务端启动,可根据实际需要进行后台运行
./frps -c frps.ini
#windows客户端启动
frpc -c frpc.ini

1. 通过 SSH 访问内网机器

  1. 在具有公网 IP 的机器上部署 frps,修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:

    [common]
    bind_port = 7000
  2. 在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:

    [common]
    server_addr = x.x.x.x
    server_port = 7000

    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000

    local_iplocal_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口

2.通过自定义域名访问内网的 Web 服务

  1. 修改 frps.ini 文件,设置监听 HTTP 请求端口为 8080:

    [common]
    bind_port = 7000
    vhost_http_port = 8080
  2. 修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 Web 服务监听的端口, 绑定自定义域名为 custom_domains

    [common]
    server_addr = x.x.x.x
    server_port = 7000

    [web]
    type = http
    local_port = 80
    custom_domains = www.yourdomain.com

    [web2]
    type = http
    local_port = 8080
    custom_domains = www.yourdomain2.com
  3. 分别启动 frps 和 frpc。

  4. www.yourdomain.comwww.yourdomain2.com 的域名 A 记录解析到 IP x.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。或者可以通过修改 HTTP 请求的 Host 字段来实现同样的效果。

  5. 通过浏览器访问 http://www.yourdomain.com:8080 即可访问到处于内网机器上 80 端口的服务,访问 http://www.yourdomain2.com:8080 则访问到内网机器上 8080 端口的服务。

3. 更多示例参考官网https://gofrp.org/docs/examples/vhost-http/

4. 其他配置

平时在使用frp时,需要配置链接验证,web监控等

  1. 服务端

[common]
bind_port = 7004 #绑定的端口
dashboard_port = 7500 #绑定的web访问端口 ip+port
token = 12345678 #客户端链接服务端的token
dashboard_user = zhangsan #web监控访问用户名
dashboard_pwd = zhangsan #web监控访问密码
vhost_http_port = 7005 #http监听端口
  1. 客户端

[common]
server_addr = xxxxxx #服务端真实ip地址(可访问的公网服务器)
server_port = 7004   #绑定的端口 对应服务端端口
token = 12345678     # 链接token

[ssh] #当前配置名称(命名)
type = tcp #链接类型
local_ip = 127.0.0.1 #本地ip地址
local_port = 27017 #本地服务端口
remote_port = 7003 #使用的服务器端口

[mongo]
type = http
local_port = 27017
custom_domains = 域名

5. 服务端参考配置

参数类型说明默认值可选值备注
bind_addrstring服务端监听地址0.0.0.0
bind_portint服务端监听端口7000接收 frpc 的连接
bind_udp_portint服务端监听 UDP 端口0用于辅助创建 P2P 连接
kcp_bind_portint服务端监听 KCP 协议端口0用于接收采用 KCP 连接的 frpc
proxy_bind_addrstring代理监听地址同 bind_addr可以使代理监听在不同的网卡地址
log_filestring日志文件地址./frps.log如果设置为 console,会将日志打印在标准输出中
log_levelstring日志等级infotrace, debug, info, warn, error
log_max_daysint日志文件保留天数3
disable_log_colorbool禁用标准输出中的日志颜色false
detailed_errors_to_clientbool服务端返回详细错误信息给客户端true
tcp_mux_keepalive_intervalinttcp_mux 的心跳检查间隔时间60单位:秒
tcp_keepaliveint和客户端底层 TCP 连接的 keepalive 间隔时间,单位秒7200负数不启用
heartbeat_timeoutint服务端和客户端心跳连接的超时时间90单位:秒
user_conn_timeoutint用户建立连接后等待客户端响应的超时时间10单位:秒
udp_packet_sizeint代理 UDP 服务时支持的最大包长度1500服务端和客户端的值需要一致
tls_cert_filestringTLS 服务端证书文件路径
tls_key_filestringTLS 服务端密钥文件路径
tls_trusted_ca_filestringTLS CA 证书路径
权限验证
参数类型说明默认值可选值备注
authentication_methodstring鉴权方式tokentoken, oidc
authenticate_heartbeatsbool开启心跳消息鉴权false
authenticate_new_work_connsbool开启建立工作连接的鉴权false
tokenstring鉴权使用的 token 值客户端需要设置一样的值才能鉴权通过
oidc_issuerstringoidc_issuer
oidc_audiencestringoidc_audience
oidc_skip_expiry_checkbooloidc_skip_expiry_check
oidc_skip_issuer_checkbooloidc_skip_issuer_check
管理配置
参数类型说明默认值可选值备注
allow_portsstring允许代理绑定的服务端端口格式为 1000-2000,2001,3000-4000
max_pool_countint最大连接池大小5
max_ports_per_clientint限制单个客户端最大同时存在的代理数00 表示没有限制
tls_onlybool只接受启用了 TLS 的客户端连接false
Dashboard, 监控
参数类型说明默认值可选值备注
dashboard_addrstring启用 Dashboard 监听的本地地址0.0.0.0
dashboard_portint启用 Dashboard 监听的本地端口0
dashboard_userstringHTTP BasicAuth 用户名
dashboard_pwdstringHTTP BasicAuth 密码
enable_prometheusbool是否提供 Prometheus 监控接口false需要同时启用了 Dashboard 才会生效
asserts_dirstring静态资源目录Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源
pprof_enablebool启动 Go HTTP pproffalse用于应用调试
HTTP & HTTPS
参数类型说明默认值可选值备注
vhost_http_portint为 HTTP 类型代理监听的端口0启用后才支持 HTTP 类型的代理,默认不启用
vhost_https_portint为 HTTPS 类型代理监听的端口0启用后才支持 HTTPS 类型的代理,默认不启用
vhost_http_timeoutintHTTP 类型代理在服务端的 ResponseHeader 超时时间60
subdomain_hoststring二级域名后缀
custom_404_pagestring自定义 404 错误页面地址
TCPMUX
参数类型说明默认值可选值备注
tcpmux_httpconnect_portint为 TCPMUX 类型代理监听的端口0启用后才支持 TCPMUX 类型的代理,默认不启用
tcpmux_passthroughbool是否透传 CONNECT 请求false通常在本地服务是 HTTP Proxy 时使用

6.客户端参考配置

基础配置
参数类型说明默认值可选值备注
server_addrstring连接服务端的地址0.0.0.0
server_portint连接服务端的端口7000
connect_server_local_ipstring连接服务端时所绑定的本地 IP
dial_server_timeoutint连接服务端的超时时间10
dial_server_keepaliveint和服务端底层 TCP 连接的 keepalive 间隔时间,单位秒7200负数不启用
http_proxystring连接服务端使用的代理地址格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm
log_filestring日志文件地址./frpc.log如果设置为 console,会将日志打印在标准输出中
log_levelstring日志等级infotrace, debug, info, warn, error
log_max_daysint日志文件保留天数3
disable_log_colorbool禁用标准输出中的日志颜色false
pool_countint连接池大小0
userstring用户名设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突
dns_serverstring使用 DNS 服务器地址默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址
login_fail_exitbool第一次登陆失败后是否退出true
protocolstring连接服务端的通信协议tcptcp, kcp, websocket
tls_enablebool启用 TLS 协议加密连接false
tls_cert_filestringTLS 客户端证书文件路径
tls_key_filestringTLS 客户端密钥文件路径
tls_trusted_ca_filestringTLS CA 证书路径
tls_server_namestringTLS Server 名称为空则使用 server_addr
disable_custom_tls_first_byteboolTLS 不发送 0x17false当为 true 时,不能端口复用
tcp_mux_keepalive_intervalinttcp_mux 的心跳检查间隔时间60单位:秒
heartbeat_intervalint向服务端发送心跳包的间隔时间30建议启用 tcp_mux_keepalive_interval,将此值设置为 -1
heartbeat_timeoutint和服务端心跳的超时时间90
udp_packet_sizeint代理 UDP 服务时支持的最大包长度1500服务端和客户端的值需要一致
startstring指定启用部分代理当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用
meta_xxxmap附加元数据会传递给服务端插件,提供附加能力
权限验证
参数类型说明默认值可选值备注
authentication_methodstring鉴权方式tokentoken, oidc需要和服务端一致
authenticate_heartbeatsbool开启心跳消息鉴权false需要和服务端一致
authenticate_new_work_connsbool开启建立工作连接的鉴权false需要和服务端一致
tokenstring鉴权使用的 token 值需要和服务端设置一样的值才能鉴权通过
oidc_client_idstringoidc_client_id
oidc_client_secretstringoidc_client_secret
oidc_audiencestringoidc_audience
oidc_token_endpoint_urlstringoidc_token_endpoint_url
oidc_additional_xxxmapOIDC 附加参数map 结构,key 需要以 oidc_additional_ 开头
UI
参数类型说明默认值可选值备注
admin_addrstring启用 AdminUI 监听的本地地址0.0.0.0
admin_portint启用 AdminUI 监听的本地端口0
admin_userstringHTTP BasicAuth 用户名
admin_pwdstringHTTP BasicAuth 密码
asserts_dirstring静态资源目录AdminUI 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源
pprof_enablebool启动 Go HTTP pproffalse用于应用调试
正文到此结束