利用frps代理Tcp或者udp或其它类型的连接
1、什么是frps/frpc
frps是代理的服务端、frpc是代理的客户端,使用方数据传输到服务端,服务端再将数据传输到提供方,从而达到相互访问的目的。
2、什么是穿透
穿透就是客户端A和客户端B都没有公网ip,但是客户端A需要和客户端B正常通信。中间需要一个有公网ip的服务器,为两个客户端转发数据,就是客户端A绑定端口发送数据,然后坚挺改端口,然后由公网服务器告诉客户端B,客户端A的公网ip和端口,客户端B链接A的公网ip和公网端口实现客户端A和客户端B相互访问。
公网服务器是负责中转数据的,相当于翻译官的角色。客户端A和客户端B之间通信都由这个翻译官传达。
3、下载
下载地址Releases · fatedier/frp · GitHub
选择对应电脑架构和系统匹配的版本下载使用,服务端和客户端程序都在一个压缩包里面
4、配置
1)服务端配置
[common] bind_port = 7000 # 中转服务器中frp服务的端口号,内网客户端通过访问这个端口连接上 dashboard_port = 7500 # frp的web界面的端口号 dashboard_user = admin # web界面的登陆账户 dashboard_pwd = admin # web界面的登陆密码 authentication_method = token token = pass123456 # frp客户端连接时的密码, 内网客户端使用这个密码验证自己的身份
在linux中执行frps,在windows中执行frps.exe
linux中 ./frps -c frps.ini windows中 ./frps.exe -c frps.ini
如果出现下列提示信息,证明服务端已经启动
2)客户端配置
[common] server_addr = 中转服务器的公网ip authentication_method = token token = pass123456 #客户端的密码 server_port = 7000 #中转服务器的密码 [windows_hong] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 33389
3)以远程连接为例
同理 ,windows可以穿透3389tcp端口,实现远程控制,而linux或者mac也可以可以支持穿透22tcp端口实现远程控制。同时也可以穿透http服务
4)服务端配置表
基础配置
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
bind_addr |
string |
服务端监听地址 |
0.0.0.0 |
||
bind_port |
int |
服务端监听端口 |
7000 |
接收 frpc 的连接 |
|
bind_udp_port |
int |
服务端监听 UDP 端口 |
0 |
用于辅助创建 P2P 连接 |
|
kcp_bind_port |
int |
服务端监听 KCP 协议端口 |
0 |
用于接收采用 KCP 连接的 frpc |
|
proxy_bind_addr |
string |
代理监听地址 |
同 bind_addr |
可以使代理监听在不同的网卡地址 |
|
log_file |
string |
日志文件地址 |
./frps.log |
如果设置为 console,会将日志打印在标准输出中 |
|
log_level |
string |
日志等级 |
info |
trace, debug, info, warn, error |
|
log_max_days |
int |
日志文件保留天数 |
3 |
||
disable_log_color |
bool |
禁用标准输出中的日志颜色 |
false |
||
detailed_errors_to_client |
bool |
服务端返回详细错误信息给客户端 |
true |
||
tcp_mux_keepalive_interval |
int |
tcp_mux 的心跳检查间隔时间 |
60 |
单位:秒 |
|
tcp_keepalive |
int |
和客户端底层 TCP 连接的 keepalive 间隔时间,单位秒 |
7200 |
负数不启用 |
|
heartbeat_timeout |
int |
服务端和客户端心跳连接的超时时间 |
90 |
单位:秒 |
|
user_conn_timeout |
int |
用户建立连接后等待客户端响应的超时时间 |
10 |
单位:秒 |
|
udp_packet_size |
int |
代理 UDP 服务时支持的最大包长度 |
1500 |
服务端和客户端的值需要一致 |
|
tls_cert_file |
string |
TLS 服务端证书文件路径 |
|||
tls_key_file |
string |
TLS 服务端密钥文件路径 |
|||
tls_trusted_ca_file |
string |
TLS CA 证书路径 |
权限验证
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
authentication_method |
string |
鉴权方式 |
token |
token, oidc |
|
authenticate_heartbeats |
bool |
开启心跳消息鉴权 |
false |
||
authenticate_new_work_conns |
bool |
开启建立工作连接的鉴权 |
false |
||
token |
string |
鉴权使用的 token 值 |
客户端需要设置一样的值才能鉴权通过 |
||
oidc_issuer |
string |
oidc_issuer |
|||
oidc_audience |
string |
oidc_audience |
|||
oidc_skip_expiry_check |
bool |
oidc_skip_expiry_check |
|||
oidc_skip_issuer_check |
bool |
oidc_skip_issuer_check |
管理配置
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
allow_ports |
string |
允许代理绑定的服务端端口 |
格式为 1000-2000,2001,3000-4000 |
||
max_pool_count |
int |
最大连接池大小 |
5 |
||
max_ports_per_client |
int |
限制单个客户端最大同时存在的代理数 |
0 |
0 表示没有限制 |
|
tls_only |
bool |
只接受启用了 TLS 的客户端连接 |
false |
Dashboard, 监控
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
dashboard_addr |
string |
启用 Dashboard 监听的本地地址 |
0.0.0.0 |
||
dashboard_port |
int |
启用 Dashboard 监听的本地端口 |
0 |
||
dashboard_user |
string |
HTTP BasicAuth 用户名 |
|||
dashboard_pwd |
string |
HTTP BasicAuth 密码 |
|||
dashboard_tls_mode |
bool |
是否启用 TLS 模式 |
false |
||
dashboard_tls_cert_file |
string |
TLS 证书文件路径 |
|||
dashboard_tls_key_file |
string |
TLS 密钥文件路径 |
|||
enable_prometheus |
bool |
是否提供 Prometheus 监控接口 |
false |
需要同时启用了 Dashboard 才会生效 |
|
asserts_dir |
string |
静态资源目录 |
Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源 |
||
pprof_enable |
bool |
启动 Go HTTP pprof |
false |
用于应用调试 |
HTTP & HTTPS
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
vhost_http_port |
int |
为 HTTP 类型代理监听的端口 |
0 |
启用后才支持 HTTP 类型的代理,默认不启用 |
|
vhost_https_port |
int |
为 HTTPS 类型代理监听的端口 |
0 |
启用后才支持 HTTPS 类型的代理,默认不启用 |
|
vhost_http_timeout |
int |
HTTP 类型代理在服务端的 ResponseHeader 超时时间 |
60 |
||
subdomain_host |
string |
二级域名后缀 |
|||
custom_404_page |
string |
自定义 404 错误页面地址 |
TCPMUX
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
tcpmux_httpconnect_port |
int |
为 TCPMUX 类型代理监听的端口 |
0 |
启用后才支持 TCPMUX 类型的代理,默认不启用 |
|
tcpmux_passthrough |
bool |
是否透传 CONNECT 请求 |
false |
通常在本地服务是 HTTP Proxy 时使用 |
客户端配置表
基础配置
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
server_addr |
string |
连接服务端的地址 |
0.0.0.0 |
||
server_port |
int |
连接服务端的端口 |
7000 |
||
connect_server_local_ip |
string |
连接服务端时所绑定的本地 IP |
|||
dial_server_timeout |
int |
连接服务端的超时时间 |
10 |
||
dial_server_keepalive |
int |
和服务端底层 TCP 连接的 keepalive 间隔时间,单位秒 |
7200 |
负数不启用 |
|
http_proxy |
string |
连接服务端使用的代理地址 |
格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm |
||
log_file |
string |
日志文件地址 |
./frpc.log |
如果设置为 console,会将日志打印在标准输出中 |
|
log_level |
string |
日志等级 |
info |
trace, debug, info, warn, error |
|
log_max_days |
int |
日志文件保留天数 |
3 |
||
disable_log_color |
bool |
禁用标准输出中的日志颜色 |
false |
||
pool_count |
int |
连接池大小 |
0 |
||
user |
string |
用户名 |
设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突 |
||
dns_server |
string |
使用 DNS 服务器地址 |
默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址 |
||
login_fail_exit |
bool |
第一次登陆失败后是否退出 |
true |
||
protocol |
string |
连接服务端的通信协议 |
tcp |
tcp, kcp, websocket |
|
tls_enable |
bool |
启用 TLS 协议加密连接 |
false |
||
tls_cert_file |
string |
TLS 客户端证书文件路径 |
|||
tls_key_file |
string |
TLS 客户端密钥文件路径 |
|||
tls_trusted_ca_file |
string |
TLS CA 证书路径 |
|||
tls_server_name |
string |
TLS Server 名称 |
为空则使用 server_addr |
||
disable_custom_tls_first_byte |
bool |
TLS 不发送 0x17 |
false |
当为 true 时,不能端口复用 |
|
tcp_mux_keepalive_interval |
int |
tcp_mux 的心跳检查间隔时间 |
60 |
单位:秒 |
|
heartbeat_interval |
int |
向服务端发送心跳包的间隔时间 |
30 |
建议启用 tcp_mux_keepalive_interval,将此值设置为 -1 |
|
heartbeat_timeout |
int |
和服务端心跳的超时时间 |
90 |
||
udp_packet_size |
int |
代理 UDP 服务时支持的最大包长度 |
1500 |
服务端和客户端的值需要一致 |
|
start |
string |
指定启用部分代理 |
当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用 |
||
meta_xxx |
map |
附加元数据 |
会传递给服务端插件,提供附加能力 |
权限验证
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
authentication_method |
string |
鉴权方式 |
token |
token, oidc |
需要和服务端一致 |
authenticate_heartbeats |
bool |
开启心跳消息鉴权 |
false |
需要和服务端一致 |
|
authenticate_new_work_conns |
bool |
开启建立工作连接的鉴权 |
false |
需要和服务端一致 |
|
token |
string |
鉴权使用的 token 值 |
需要和服务端设置一样的值才能鉴权通过 |
||
oidc_client_id |
string |
oidc_client_id |
|||
oidc_client_secret |
string |
oidc_client_secret |
|||
oidc_audience |
string |
oidc_audience |
|||
oidc_token_endpoint_url |
string |
oidc_token_endpoint_url |
|||
oidc_additional_xxx |
map |
OIDC 附加参数 |
map 结构,key 需要以 oidc_additional_ 开头 |
UI
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
admin_addr |
string |
启用 AdminUI 监听的本地地址 |
0.0.0.0 |
||
admin_port |
int |
启用 AdminUI 监听的本地端口 |
0 |
||
admin_user |
string |
HTTP BasicAuth 用户名 |
|||
admin_pwd |
string |
HTTP BasicAuth 密码 |
|||
asserts_dir |
string |
静态资源目录 |
AdminUI 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源 |
||
pprof_enable |
bool |
启动 Go HTTP pprof |
false |
用于应用调试 |
代理部分配置表,可配置(tcp, udp, http, https, stcp, sudp, xtcp, tcpmux)
通用配置
通用配置是指不同类型的代理共同使用的一些配置参数。
基础配置
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
type |
string |
代理类型 |
是 |
tcp |
tcp, udp, http, https, stcp, sudp, xtcp, tcpmux |
|
use_encryption |
bool |
是否启用加密功能 |
否 |
false |
启用后该代理和服务端之间的通信内容都会被加密传输 |
|
use_compression |
bool |
是否启用压缩功能 |
否 |
false |
启用后该代理和服务端之间的通信内容都会被压缩传输 |
|
proxy_protocol_version |
string |
启用 proxy protocol 协议的版本 |
否 |
v1, v2 |
如果启用,则 frpc 和本地服务建立连接后会发送 proxy protocol 的协议,包含了原请求的 IP 地址和端口等内容 |
|
bandwidth_limit |
string |
设置单个 proxy 的带宽限流 |
否 |
单位为 MB 或 KB,0 表示不限制,如果启用,会作用于对应的 frpc |
本地服务配置
local_ip 和 plugin 的配置必须配置一个,且只能生效一个,如果配置了 plugin,则 local_ip 配置无效。
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
local_ip |
string |
本地服务 IP |
是 |
127.0.0.1 |
需要被代理的本地服务的 IP 地址,可以为所在 frpc 能访问到的任意 IP 地址 |
|
local_port |
int |
本地服务端口 |
是 |
配合 local_ip |
||
plugin |
string |
客户端插件名称 |
否 |
见客户端插件的功能说明 |
用于扩展 frpc 的能力,能够提供一些简单的本地服务,如果配置了 plugin,则 local_ip 和 local_port 无效,两者只能配置一个 |
|
plugin_params |
map |
客户端插件参数 |
否 |
map 结构,key 需要都以 “plugin_” 开头,每一个 plugin 需要的参数也不一样,具体见客户端插件参数中的内容 |
负载均衡和健康检查
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
group |
string |
负载均衡分组名称 |
否 |
用户请求会以轮询的方式发送给同一个 group 中的代理 |
||
group_key |
string |
负载均衡分组密钥 |
否 |
用于对负载均衡分组进行鉴权,group_key 相同的代理才会被加入到同一个分组中 |
||
health_check_type |
string |
健康检查类型 |
否 |
tcp,http |
配置后启用健康检查功能,tcp 是连接成功则认为服务健康,http 要求接口返回 2xx 的状态码则认为服务健康 |
|
health_check_timeout_s |
int |
健康检查超时时间(秒) |
否 |
3 |
执行检查任务的超时时间 |
|
health_check_max_failed |
int |
健康检查连续错误次数 |
否 |
1 |
连续检查错误多少次认为服务不健康 |
|
health_check_interval_s |
int |
健康检查周期(秒) |
否 |
10 |
每隔多长时间进行一次健康检查 |
|
health_check_url |
string |
健康检查的 HTTP 接口 |
否 |
如果 health_check_type 类型是 http,则需要配置此参数,指定发送 http 请求的 url,例如 “/health” |
TCP
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
remote_port |
int |
服务端绑定的端口 |
是 |
用户访问此端口的请求会被转发到 local_ip:local_port |
UDP
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
remote_port |
int |
服务端绑定的端口 |
是 |
用户访问此端口的请求会被转发到 local_ip:local_port |
HTTP
custom_domains 和 subdomain 必须要配置其中一个,两者可以同时生效。
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
custom_domains |
[]string |
服务器绑定自定义域名 |
是(和 subdomain 两者必须配置一个) |
用户通过 vhost_http_port 访问的 HTTP 请求如果 Host 在 custom_domains 配置的域名中,则会被路由到此代理配置的本地服务 |
||
subdomain |
string |
自定义子域名 |
是(和 custom_domains 两者必须配置一个) |
和 custom_domains 作用相同,但是只需要指定子域名前缀,会结合服务端的 subdomain_host 生成最终绑定的域名 |
||
locations |
[]string |
URL 路由配置 |
否 |
采用最大前缀匹配的规则,用户请求匹配响应的 location 配置,则会被路由到此代理 |
||
route_by_http_user |
string |
根据 HTTP Basic Auth user 路由 |
否 |
|||
http_user |
string |
用户名 |
否 |
如果配置此参数,暴露出去的 HTTP 服务需要采用 Basic Auth 的鉴权才能访问 |
||
http_pwd |
string |
密码 |
否 |
结合 http_user 使用 |
||
host_header_rewrite |
string |
替换 Host header |
否 |
替换发送到本地服务 HTTP 请求中的 Host 字段 |
||
headers |
map |
替换 header |
否 |
map 中的 key 是要替换的 header 的 key,value 是替换后的内容 |
HTTPS
custom_domains 和 subdomain 必须要配置其中一个,两者可以同时生效。
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
custom_domains |
[]string |
服务器绑定自定义域名 |
是(和 subdomain 两者必须配置一个) |
用户通过 vhost_http_port 访问的 HTTP 请求如果 Host 在 custom_domains 配置的域名中,则会被路由到此代理配置的本地服务 |
||
subdomain |
string |
自定义子域名 |
是(和 custom_domains 两者必须配置一个) |
和 custom_domains 作用相同,但是只需要指定子域名前缀,会结合服务端的 subdomain_host 生成最终绑定的域名 |
STCP
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
role |
string |
角色 |
是 |
server |
server,visitor |
server 表示服务端,visitor 表示访问端 |
sk |
string |
密钥 |
是 |
服务端和访问端的密钥需要一致,访问端才能访问到服务端 |
SUDP
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
role |
string |
角色 |
是 |
server |
server,visitor |
server 表示服务端,visitor 表示访问端 |
sk |
string |
密钥 |
是 |
服务端和访问端的密钥需要一致,访问端才能访问到服务端 |
XTCP
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
role |
string |
角色 |
是 |
server |
server,visitor |
server 表示服务端,visitor 表示访问端 |
sk |
string |
密钥 |
是 |
服务端和访问端的密钥需要一致,访问端才能访问到服务端 |
TCPMUX
custom_domains 和 subdomain 必须要配置其中一个,两者可以同时生效。
参数 |
类型 |
说明 |
是否必须 |
默认值 |
可选值 |
备注 |
multiplexer |
string |
复用器类型 |
是 |
httpconnect |
||
custom_domains |
[]string |
服务器绑定自定义域名 |
是(和 subdomain 两者必须配置一个) |
用户通过 tcpmux_httpconnect_port 访问的 CONNECT 请求如果 Host 在 custom_domains 配置的域名中,则会被路由到此代理配置的本地服务 |
||
subdomain |
string |
自定义子域名 |
是(和 custom_domains 两者必须配置一个) |
和 custom_domains 作用相同,但是只需要指定子域名前缀,会结合服务端的 subdomain_host 生成最终绑定的域名 |
||
route_by_http_user |
string |
根据 HTTP Basic Auth user 路由 |
否 |
5、服务端监控面板
6、总结
以上就是本期分享内容,以windows的3389远程服务端口为例,映射了3389端口到公网ip的33389实现访问公网ip访问到本地服务,当然也可以映射tcp, udp, http, https, stcp, sudp, xtcp, tcpmux服务程序,实现公网访问。
原文链接:https://blog.csdn.net/weixin_36723038/article/details/127609345