内网穿透之frp

frp 笔记

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

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

2.安装

  1. frp 支持支持多个平台 Linux windows arm 则需下载。
  2. frp 分为server 端 和client 端。
    systemd #systemd 服务启动脚本 服务端客户端都可用

frps #服务端启动脚本
frps.ini #服务端配置文件
frps_full.ini # 服务端配置文件样列

frpc #客户端启动脚本
frpc.ini #客户端端配置文件
frps_full.ini # 客户端配置文件样列

3.配置文件
1.server端
vim frps.ini

基础配置

bind_addr 服务端监听地址 0.0.0.0
bind_port 服务端监听端口 7000
bind_udp_port 服务端监听 UDP 端口 0
kcp_bind_port 服务端监听 KCP 协议端口 0
proxy_bind_addr 代理监听地址
log_file 日志文件地址 /var/log/frp.log
log_level 日志级别 trace, debug, info, warn, error(默认info)
log_max_days 日志文件保留天数 3
detailed_errors_to_client 服务端返回详细错误信息给客户端 true
tls_cert_file TLS 服务端证书文件路径
tls_key_file TLS 服务端密钥文件路径
tls_trusted_ca_file TLS CA 证书路径

权限验证
authentication_method 鉴权方式 token (默认token 。oidc)
authenticate_heartbeats 开启心跳消息鉴权 false
token 鉴权使用的 token 值 客户端需要设置一样的值才能鉴权通过

管理配置
allow_ports 允许代理绑定的服务端端口 1000-2000,2001,3000-4000
max_pool_count 最大连接池大小 5
max_ports_per_client 限制单个客户端最大同时存在的代理数 0(0表示没有限制)
tls_only 只接受启用了 TLS 的客户端连接 false

监控
dashboard_addr 启用 Dashboard 监听的本地地址 0.0.0.0
dashboard_port 启用 Dashboard 监听的本地端口 0
dashboard_user HTTP BasicAuth 用户名
dashboard_pwd HTTP BasicAuth 密码
enable_prometheus 是否提供 Prometheus 监控接口 false 需要同时启用了 Dashboard 才会生效
asserts_dir 静态资源目录 Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源

HTTP & HTTPS
vhost_http_port 为 HTTP 类型代理监听的端口 0 启用后才支持 HTTP 类型的代理,默认不启用
vhost_https_port 为 HTTPS 类型代理监听的端口 0 启用后才支持 HTTPS 类型的代理,默认不启用
vhost_http_timeout HTTP 类型代理在服务端的 ResponseHeader 超时时间 60
subdomain_host 二级域名后缀
custom_404_page 自定义 404 错误页面地址

TCPMUX
tcpmux_httpconnect_port 为 TCPMUX 类型代理监听的端口 0 启用后才支持 TCPMUX 类型的代理,默认不启用

2.client 端
vim frpc.ini

基础配置
server_addr 连接服务端的地址 0.0.0.0
server_port 连接服务端的端口 7000
http_proxy 连接服务端使用的代理地址 格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm
log_file 日志文件地址 ./frpc.log 如果设置为 console,会将日志打印在标准输出中
log_level 日志等级 info trace, debug, info, warn, error
log_max_days 日志文件保留天数 3
disable_log_color 禁用标准输出中的日志颜色 false
pool_count 连接池大小 0
user 用户名 设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突
dns_server 使用 DNS 服务器地址 默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址
login_fail_exit 第一次登陆失败后是否退出 true
protocol 连接服务端的通信协议 tcp tcp, kcp, websocket
tls_enable 启用 TLS 协议加密连接 false
tls_cert_file TLS 客户端证书文件路径
tls_key_file TLS 客户端密钥文件路径
tls_trusted_ca_file TLS CA 证书路径
tls_server_name TLS Server 名称 为空则使用 server_addr
heartbeat_interval 向服务端发送心跳包的间隔时间 30
heartbeat_timeout 和服务端心跳的超时时间 90
udp_packet_size 代理 UDP 服务时支持的最大包长度 1500 服务端和客户端的值需要一致
start 指定启用部分代理 当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用

权限验证
authentication_method 鉴权方式 token token, oidc 需要和服务端一致
authenticate_heartbeats 开启心跳消息鉴权 false 需要和服务端一致
authenticate_new_work_conns 开启建立工作连接的鉴权 false 需要和服务端一致
token 鉴权使用的 token 值 需要和服务端设置一样的值才能鉴权通过
oidc_client_id oidc_client_id
oidc_client_secret oidc_client_secret
oidc_audience oidc_audience
oidc_token_endpoint_url oidc_token_endpoint_url

UI
admin_addr 启用 AdminUI 监听的本地地址 0.0.0.0
admin_port 启用 AdminUI 监听的本地端口 0
admin_user HTTP BasicAuth 用户名
admin_pwd HTTP BasicAuth 密码
asserts_dir 静态资源目录

4.示例
1.在具有公网 IP 的机器上部署 frps,修改 frps.ini 文件,这里使用了最简化的配置
vim frps.ini

[common]
bind_port = 7000

启动
./frps -c frps.ini

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

[common]
server_addr = 159.75.54.34
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 # 表示在 frp 服务端监听的端口

启动
frpc -c frpc.init

3.验证
ssh -p 6000 root@159.75.54.34
frp 会将请求 159.75.54.34:6000 的流量转发到内网机器的 22 端口。