利用云服务实现远程办公和内网穿透访问内网服务
应用场景
1.在家远程公司电脑
2.同事之间远程调用本地服务
原理
frp 主要由 客户端(frpc) 和 服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。
内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。
用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。
代理
在 frp 中一个代理对应一个需要暴露的内网服务。一个客户端支持同时配置多个代理。
代理类型
frp 支持多种代理类型来适配不同的使用场景。
类型 | 描述 |
---|---|
tcp | 单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务。 |
udp | 单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务。 |
http | 针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header,增加鉴权。 |
https | 针对 HTTPS 应用定制了一些额外的功能。 |
stcp | 安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。 |
sudp | 安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。 |
xtcp | 点对点内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转。 |
tcpmux | 支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务。 |
安装配置
我这里服务端使用的是linux系统 客户端是windows系统 使用的frp版本是最新版V0.38.0
下载地址
https://github.com/fatedier/frp/releases/
把下载的对应的版本上传到服务端
之后解压
mkdir frp
tar -zxvf frp_0.38.0_linux_386.tar.gz
cp -r frp_0.38.0_linux_386/* ./frp
rm -rf ./frp_0.38.0_linux_386*
cd frp
chmod 777 ./frps
vim frps.ini
配置完服务端 客户端根据自己平台下载对应的产品
下方有配置文件说明
服务端启动命令
./frps -c ./frps.ini
客户端启动命令
frpc.exe -c ./frpc.ini
服务端配置 可参考frps_full.ini进行配置
# 基础配置
[common]
# 服务端监听地址 0.0.0.0是默认所有IP访问 IPv6地址需要带中括号包围 例如[ab:1a:ff:1c:cc:6a] 这里默认无需修改
bind_addr = 0.0.0.0
# 服务端监听端口 接收 frpc 的连接
bind_port = 7000
# 服务端监听 UDP 端口 用于辅助创建 P2P 连接 不使用可注释
bind_udp_port = 7001
# 服务端监听 KCP 协议端口 用于接收采用 KCP 连接的 frpc 不使用可注释
kcp_bind_port = 7000
# 代理监听地址,默认值与bind_addr相同 可以使代理监听在不同的网卡地址
# proxy_bind_addr = 127.0.0.1
# 日志输出文件路径地址 可修改位置 这里默认当前路径
log_file = ./frps.log
# 日志等级 默认info 如果觉得日志过多可以调整日志级别
log_level = info
# 日志文件保留天数
log_max_days = 3
# 当日期文件为控制台时禁用颜色 默认false
disable_log_color = false
# 服务端返回详细错误信息给客户端 默认为true
detailed_errors_to_client = true
# 服务端和客户端心跳连接的超时时间 默认90
# heartbeat_timeout = 90
# 用户建立连接后等待客户端响应的超时时间
# user_conn_timeout = 10
# upd数据包大小 默认1500
udp_packet_size = 1500
# TLS 服务端证书文件路径
# tls_cert_file = server.crt
# TLS 服务端密钥文件路径
# tls_key_file = server.key
# TLS CA 证书路径
# tls_trusted_ca_file = ca.crt
# [权限验证]
# 鉴权方式 默认 token 可选值 token, oidc
authentication_method = token
# 开启心跳消息鉴权 默认false
authenticate_heartbeats = false
# 开启建立工作连接的鉴权
authenticate_new_work_conns = false
# 鉴权使用的 token 值 这里设置123456 自行修改
token = 123456
# oidc_issuer =
# oidc_audience =
# oidc_skip_expiry_check = false
# oidc_skip_issuer_check = false
# [管理配置]
# 只允许客户端绑定端口 格式为 1000-2000,2001,3000-4000 可以根据自己需求修改
allow_ports = 2000-3000,3001,3003,4000-50000
# 最大连接池数量
max_pool_count = 5
# 限制单个客户端最大同时存在的代理数 0为不限制
max_ports_per_client = 0
# 只接受启用了 TLS 的客户端连接 默认为false
tls_only = false
# [Dashboarh(管理面板), 监控]
# 管理面板可访问地址 0.0.0.0允许所有 IPv6加中括号
dashboard_addr = 0.0.0.0
# 管理面板端口
dashboard_port = 7500
# 管理面板账号密码
dashboard_user = admin
dashboard_pwd = admin
# 是否提供 Prometheus 监控接口 需要同时启用了 Dashboard 才会生效
enable_prometheus = true
# Web后台的静态资源目录 只支持debug模式 后台使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源
# assets_dir = ./static
# [HTTP & HTTPS]
# 如果要支持虚拟主机,必须设置用于侦听的http端口(可选)
# 可以根据自己需要的端口修改 用于http和https访问端口
vhost_http_port = 8090
# vhost_https_port = 443
# 响应超时时间 默认60s 无需修改 HTTP 类型代理在服务端的 ResponseHeader 超时时间
# vhost_http_timeout = 60
# 二级域名后缀 自行修改域名 默认不开启
# subdomain_host = baidu.com
# 自定义 404 错误页面地址
# custom_404_page = /path/to/404.html
# [TCPMUX]
# 为 TCPMUX 类型代理监听的端口 启用后才支持 TCPMUX 类型的代理,默认不启用
# tcpmux_httpconnect_port = 1337
#[配置拆分] 通过 includes 参数可以在主配置中包含其他配置文件,从而实现将代理配置拆分到多个文件中管理
# includes = ./confd/*.ini
# 用户管理插件设置
# [plugin.user-manager]
# addr = 127.0.0.1:9000
# path = /handler
# ops = Login
# 端口管理插件
# [plugin.port-manager]
# addr = 127.0.0.1:9001
# path = /handler
# ops = NewProxy
客户端配置 可参考frpc_full.ini进行配置
# [基础配置]
[common]
# 连接服务端的地址 这里需要修改为服务端IP
server_addr = 1.2.3.4
server_port = 7000
# 连接服务端使用的代理地址 格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm
# http_proxy = http://user:passwd@192.168.1.128:8080
# http_proxy = socks5://user:passwd@192.168.1.128:1080
# http_proxy = ntlm://user:passwd@192.168.1.128:2080
# 日志文件地址 这里是客户端配置 所以我不需要 就注释掉
# log_file = ./frpc.log
# 日志级别 trace, debug, info, warn, error
# log_level = info
# 日志保留天数
# log_max_days = 3
# 禁用标准输出中的日志颜色
# disable_log_color = false
# 连接池大小
# pool_count = 0
# 用户名 设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突
# user = user
# 使用 DNS 服务器地址 默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址
# dns_server= 114.114.114.114
# 第一次登陆失败后是否退出 默认true 我这里修改为false
login_fail_exit = false
# 连接服务端的通信协议 默认TCP 可选值 tcp, kcp, websocket
protocol = tcp
# 启用 TLS 协议(安全传输层协议)加密连接 默认false
# tls_enable = false
# TLS 客户端证书文件路径
# tls_cert_file = client.crt
# TLS 客户端密钥文件路径
# tls_key_file = client.key
# TLS CA 证书路径
# tls_trusted_ca_file = ca.crt
# TLS Server 名称
# tls_server_name = example.com
# TLS 不发送 0x17 默认为false 当为 true 时,不能端口复用
disable_custom_tls_first_byte = false
# 向服务端发送心跳包的间隔时间 默认30 单位s
# heartbeat_interval = 30
# 和服务端心跳的超时时间 默认90 单位s
# heartbeat_timeout = 90
# 代理 UDP 服务时支持的最大包长度 服务端和客户端的值需要一致
udp_packet_size = 1500
# 指定启用部分代理 当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用
# start = ssh,dns
# [权限验证]
# 鉴权方式 需要和服务端一致 默认值token 可选值 token, oidc
authentication_method = token
# 开启心跳消息鉴权 需要和服务端一致
authenticate_heartbeats = false
# 开启建立工作连接的鉴权 需要和服务端一致
authenticate_new_work_conns = false
# 鉴权使用的 token 值 需要和服务端设置一样的值才能鉴权通过
token = 123456
# OIDC(OpenId Connect)身份认证相关配置 我这里没用到就注释了
# oidc_client_id =
# oidc_client_secret =
# oidc_audience =
# oidc_token_endpoint_url =
# [AdminUI]
# 启用 AdminUI 监听的本地地址 默认值 0.0.0.0
admin_addr = 127.0.0.1
# 启用 AdminUI 监听的本地端口
admin_port = 7400
admin_user = admin
admin_pwd = admin
# 静态资源目录 AdminUI 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源
# assets_dir = ./static
# [代理配置]
# 这里注释的是非必须配置的 没有注释的则是必须配置的
# 转发ssh 此处是唯一的 整个配置文件只能有一个ssh标签
[ssh]
# [通用配置] 不管是什么协议都有的配置
# 代理类型默认tcp 可选值tcp, udp, http, https, stcp, sudp, xtcp, tcpmux
type = tcp
# 是否启用加密功能 启用后该代理和服务端之间的通信内容都会被加密传输
# use_encryption = false
# 是否启用压缩功能
# use_compression = false
# 启用 proxy protocol 协议的版本 默认值 无 可选值v1, v2
# 如果启用,则 frpc 和本地服务建立连接后会发送 proxy protocol 的协议,包含了原请求的 IP 地址和端口等内容
# proxy_protocol_version = v1
# 设置单个代理的带宽限流 单位为 MB 或 KB,0 表示不限制,如果启用,会作用于对应的 frpc
# bandwidth_limit = 0
# [本地服务配置]
# local_ip 和 plugin 的配置必须配置一个,且只能生效一个,如果配置了 plugin,则 local_ip 配置无效。
# 本地服务 IP 可代理本地局域网IP 例如192.168.0.x 默认是本地 127.0.0.1
local_ip = 127.0.0.1
# 本地服务端口 配合 local_ip
local_port = 8081
# 用于扩展 frpc 的能力,能够提供一些简单的本地服务,如果配置了 plugin,则 local_ip 和 local_port 无效,两者只能配置一个
# plugin =
# 客户端插件参数 map 结构,key 需要都以 “plugin_” 开头,每一个 plugin 需要的参数也不一样,具体见客户端插件参数中的内容
# plugin_params =
# [负载均衡和健康检查]
# 负载均衡分组名称用户请求会以轮询的方式发送给同一个 group 中的代理 这个有点像nginx的代理做的
# group =
# 负载均衡分组密钥 用于对负载均衡分组进行鉴权 group_key相同的代理才会被加入到同一个分组中
# group_key =
# 健康检查类型 可选值tcp,http
# health_check_type
# 健康检查超时时间(秒) 默认3
# health_check_timeout_s = 3
# 健康检查连续错误次数 默认1 连续检查错误多少次认为服务不健康
# health_check_max_failed = 1
# 健康检查周期(秒) 默认10 每隔多长时间进行一次健康检查
# health_check_interval_s = 10
# 健康检查的 HTTP 接口 如果 health_check_type 类型是 http,则需要配置此参数,指定发送 http 请求的 url,例如 “/health”
# health_check_url =
# [TCP] 当type为tcp协议时参数
# 服务端绑定的端口 用户访问此端口的请求会被转发到 local_ip:local_port
# remote_port = 8081
# [UDP] 当type为udp协议时参数
# 服务端绑定的端口 用户访问此端口的请求会被转发到 local_ip:local_port
# remote_port = 8081
# [HTTP] 当type为http协议时参数
# custom_domains 和 subdomain 必须要配置其中一个,两者可以同时生效。
# 服务器绑定自定义域名 和 subdomain 两者必须配置一个
# 用户通过 vhost_http_port 访问的 HTTP 请求如果 Host 在 custom_domains 配置的域名中,则会被路由到此代理配置的本地服务
# custom_domains = test.baidu.com
# 自定义子域名 和 custom_domains 两者必须配置一个
# 和 custom_domains 作用相同,但是只需要指定子域名前缀,会结合服务端的 subdomain_host 生成最终绑定的域名
# subdomain = test
# URL 路由配置 采用最大前缀匹配的规则,用户请求匹配响应的 location 配置,则会被路由到此代理
# locations =
# 用户名 如果配置此参数,暴露出去的 HTTP 服务需要采用 Basic Auth 的鉴权才能访问
# http_user = user
# 密码 结合 http_user 使用
# http_pwd = 123456
# 替换 Host header 替换发送到本地服务 HTTP 请求中的 Host 字段
# host_header_rewrite
# 替换 header 此处值是map中的 key 是要替换的 header 的 key,value 是替换后的内容
# headers
# [HTTPS] 当type为https协议时参数
# custom_domains 和 subdomain 必须要配置其中一个,两者可以同时生效。
# 服务器绑定自定义域名 和 subdomain 两者必须配置一个
# 用户通过 vhost_http_port 访问的 HTTP 请求如果 Host 在 custom_domains 配置的域名中,则会被路由到此代理配置的本地服务
# custom_domains = test.baidu.com
# 自定义子域名 和 custom_domains 两者必须配置一个
# 和 custom_domains 作用相同,但是只需要指定子域名前缀,会结合服务端的 subdomain_host 生成最终绑定的域名
# subdomain = test
# [STCP] 当type为STCP协议时参数
# 角色 可选值 server,visitor server 表示服务端,visitor 表示访问端
# role = sever
# 密钥 服务端和访问端的密钥需要一致,访问端才能访问到服务端
# sk =
# [SUDP] 当type为SUDP协议时参数
# 角色 可选值 server,visitor server 表示服务端,visitor 表示访问端
# role = sever
# 密钥 服务端和访问端的密钥需要一致,访问端才能访问到服务端
# sk =
# 远程桌面配置 如果需要可以打开
# 角色 可选值 server,visitor server 表示服务端,visitor 表示访问端
# role = sever
# 密钥 服务端和访问端的密钥需要一致,访问端才能访问到服务端
# sk =
# 下方配置示例
# 远程桌面配置
# [RDP]
# type = tcp
# local_ip = 0.0.0.0
# local_port = 3389
# remote_port = 4389
# 多个TCP代理配置 例如本地需要代理多个端口 此处需要配置 同理也需要在服务端进行配置
# [range:tcp_port]
# type = tcp
# local_ip = 127.0.0.1
# local_port = 6010-6020,6022,6024-6028
# remote_port = 6010-6020,6022,6024-6028
# use_encryption = false
# use_compression = false
# 转发dns请求
# [dns]
# type = udp
# local_ip = 114.114.114.114
# local_port = 53
# remote_port = 6002
# use_encryption = false
# use_compression = false
# 多个udp端口配置 先注释
# [range:udp_port]
# type = udp
# local_ip = 127.0.0.1
# local_port = 6010-6020
# remote_port = 6010-6020
# use_encryption = false
# use_compression = false
# 转发单个web配置 这里的web01是唯一的 需要增加可重新加
# [web01]
# type = http
# local_ip = 127.0.0.1
# local_port = 80
# use_encryption = false
# use_compression = true
# http_user = admin
# http_pwd = admin
# subdomain = web01
# custom_domains = web01.yourdomain.com
# locations = /,/pic
# host_header_rewrite = example.com
# header_X-From-Where = frp
# health_check_type = http
# health_check_url = /status
# health_check_interval_s = 10
# health_check_max_failed = 3
# health_check_timeout_s = 3
# 此处可以设置第二个 代理规则 不需要 先注释
# [web02]
# type = https
# local_ip = 127.0.0.1
# local_port = 8000
# use_encryption = false
# use_compression = false
# subdomain = web01
# custom_domains = web02.yourdomain.com
# proxy_protocol_version = v2
# 这个示例通过配置 Unix域套接字客户端插件来通过 TCP 端口访问内网的 Unix域套接字服务
# [plugin_unix_domain_socket]
# type = tcp
# remote_port = 6003
# plugin = unix_domain_socket
# plugin_unix_path = /var/run/docker.sock
# HTTP 代理插件,用于将内网机器作为 HTTP 代理暴露给其他服务,可以通过此代理访问到此内网机器能够访问到的其他服务。
# [plugin_http_proxy]
# type = tcp
# remote_port = 6004
# plugin = http_proxy
# plugin_http_user = abc
# plugin_http_passwd = abc
# socks5插件配置示例 SOCKS5 代理
# [plugin_socks5]
# type = tcp
# remote_port = 6005
# plugin = socks5
# plugin_user = abc
# plugin_passwd = abc
# 静态文件配置示例 静态文件浏览服务,通过暴露一个简单的 HTTP 服务查看指定的目录下的文件
# [plugin_static_file]
# type = tcp
# remote_port = 6006
# plugin = static_file
# 要对外暴露的文件目录
# plugin_local_path = /var/www/blog
# 用户请求的 URL 路径会被映射到本地文件,如果希望去除用户访问文件的前缀,需要配置此参数
# plugin_strip_prefix = static
# HTTP BasicAuth 用户名
# plugin_http_user = abc
# HTTP BasicAuth 密码
# plugin_http_passwd = abc
# 通过 https2http 插件可以让本地 HTTP 服务转换成 HTTPS 服务对外提供
# [plugin_https2http]
# type = https
# custom_domains = test.yourdomain.com
# plugin = https2http
# plugin_local_addr = 127.0.0.1:80
# plugin_crt_path = ./server.crt
# plugin_key_path = ./server.key
# plugin_host_header_rewrite = 127.0.0.1
# plugin_header_X-From-Where = frp
# 通过 https2https 插件可以让本地 HTTPS 服务转换成 HTTPS 服务对外提供
# [plugin_https2https]
# type = https
# custom_domains = test.yourdomain.com
# plugin = https2https
# plugin_local_addr = 127.0.0.1:443
# plugin_crt_path = ./server.crt
# plugin_key_path = ./server.key
# 如果配置,发送给本地服务的请求的 Host 字段会被修改
# plugin_host_header_rewrite = 127.0.0.1
# 发送给本地服务的请求会被加上指定的 header 字段 plugin_header_{header name}
# plugin_header_X-From-Where = frp
# 加密tcp代理 不需要 注释
# [secret_tcp]
# If the type is secret tcp, remote_port is useless
# Who want to connect local port should deploy another frpc with stcp proxy and role is visitor
# type = stcp
# sk used for authentication for visitors
# sk = abcdefg
# local_ip = 127.0.0.1
# local_port = 22
# use_encryption = false
# use_compression = false
# [secret_tcp_visitor]
# frpc role visitor -> frps -> frpc role server
# role = visitor
# type = stcp
# server_name = secret_tcp
# sk = abcdefg
# bind_addr = 127.0.0.1
# bind_port = 9000
# use_encryption = false
# use_compression = false
# [p2p_tcp]
# type = xtcp
# sk = abcdefg
# local_ip = 127.0.0.1
# local_port = 22
# use_encryption = false
# use_compression = false
# [p2p_tcp_visitor]
# role = visitor
# type = xtcp
# server_name = p2p_tcp
# sk = abcdefg
# bind_addr = 127.0.0.1
# bind_port = 9001
# use_encryption = false
# use_compression = false
# [tcpmuxhttpconnect]
# type = tcpmux
# multiplexer = httpconnect
# local_ip = 127.0.0.1
# local_port = 10701
# custom_domains = tunnel1
上面配置是官方提供的全部配置说明 需要修改地方修改完成之后 启动 访问你的服务端IP加端口可以正常访问服务 亲测可用
服务端主要修改内容参考
[common]
bind_addr = 0.0.0.0 //绑定可访问地址
bind_port = 7000 //TCP绑定端口
bind_udp_port = 7001 //UDP绑定端口
kcp_bind_port = 7000 //KCP绑定端口
vhost_http_port = 8090 //HTTP代理端口
vhost_https_port = 443 //HTTPS代理端口
dashboard_addr = 0.0.0.0 //仪表盘可访问地址
dashboard_port = 7500 //仪表盘端口
dashboard_user = admin //仪表盘用户名
dashboard_pwd = admin //仪表盘密码
token = 123456 //连接密码
subdomain_host = test.com //子域名使用的主机名
客户端主要修改内容参考
[common]
server_addr = 172.16.100.100 //服务器地址
server_port = 7000 //服务器绑定端口
token = 123456 //特权模式密码
tls_enable = true //加密传输
admin_addr = 127.0.0.1 //客户端Web地址
admin_port = 7400 //Web访问端口
admin_user = admin //Web访问账户
admin_pwd = admin //Web访问密码
user = your_name //用户名,设置后代理将显示为 <用户名.代理名>
[web] //服务名称(自定义)
local_ip = 127.0.0.1 //局域网IP地址
type = http //链接类型
local_port = 8080 //本机端口
subdomain = web //服务端为test.com,故此处子域名为web.test.com
custom_domains = demo.com //自定义访问域名,多个使用,分割
use_compression = true //使用压缩
use_encryption = true //使用加密
[ssh]
local_ip = 127.0.0.1
type = tcp
local_port = 22
remote_port = 9000
use_compression = true
use_encryption = true
根据上方参数可进行大部分配置
官方中文文档:https://gofrp.org/docs/
如果我们需要使用可根据自己需求在下方快速配置
配置文件中 1.2.3.4需要修改成你自己的服务器IP
1.远程办公配置
服务端配置
[common]
bind_addr = 0.0.0.0
bind_port = 7000
log_file = ./frps.log
token = 123456
客户端配置
[common]
server_addr = 1.2.3.4
server_port = 7000
token = 123456
[RDP]
type = tcp
local_ip = 0.0.0.0
local_port = 3389
remote_port = 6000
2.远程调用本地服务
服务端配置
[common]
bind_addr = 0.0.0.0
bind_port = 7000
log_file = ./frps.log
token = 123456
vhost_http_port = 8090
vhost_https_port = 443
客户端配置
[common]
server_addr = 1.2.3.4
server_port = 7000
token = 123456
[web]
type = http
#本地服务端口
local_port = 8080
custom_domains = 1.2.3.4
3.管理面板配置
服务端配置
[common]
bind_addr = 0.0.0.0
bind_port = 7000
log_file = ./frps.log
token = 123456
vhost_http_port = 8090
vhost_https_port = 443
dashboard_addr = 0.0.0.0
enable_prometheus = true
# 管理面板端口
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
访问地址 http://1.2.3.4:7500 账号密码 admin/admin
服务端管理界面截图
客户端配置
[common]
server_addr = 1.2.3.4
server_port = 7000
token = 123456
# 客户端管理地址和端口配置
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
[web]
type = http
#本地服务端口
local_port = 8080
custom_domains = 1.2.3.4
访问地址 http://127.0.0.1:7400 账号密码 admin/admin
截图
4.多端口代理本地多端口
服务端配置
[common]
bind_addr = 0.0.0.0
bind_port = 7000
log_file = ./frps.log
token = 123456
客户端配置
[common]
server_addr = 1.2.3.4
server_port = 7000
token = 123456
[range:tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = 8080-8090
remote_port = 8080-8090
服务端对应的 http://1.2.3.4:8080 对应本地 http://127.0.0.1:8080 8081->8081 以此类推
整合以上配置
服务端配置
[common]
bind_addr = 0.0.0.0
bind_port = 7000
log_file = ./frps.log
token = 123456
# 代理服务配置HTTP端口
vhost_http_port = 8090
vhost_https_port = 443
# 管理面板配置
dashboard_addr = 0.0.0.0
enable_prometheus = true
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
客户端配置
[common]
server_addr = 1.2.3.4
server_port = 7000
token = 123456
# 客户端管理地址和端口配置
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
[RDP]
type = tcp
local_ip = 0.0.0.0
local_port = 3389
remote_port = 6000
[web]
type = http
#本地服务端口
local_port = 8080
custom_domains = 1.2.3.4
[range:tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = 8080-8090,8092,8095-8099
remote_port = 8080-8090,8092,8095-8099
不需要功能对应注释即可
高级玩法
1.后台运行
服务端启动
nohup ./frps -c ./frps.ini &
客户端启动
创建 frps.vbs脚本
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c D:\Tools\Frp\frpc.exe -c D:\Tools\Frp\frpc.ini",vbhide
然后把vbs放到启动目录即可实现开机启动
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
这个缺点是电脑需要登录才能启动 所以一般不使用此方法自启动
2.写入服务
服务端
将frp设置成linux系统的服务,基于systemd方式管理 编写frps.service文件,
以centos7为例:
vim /lib/systemd/system/frp.service
内容如下:
[Unit]
Description=frpServer
After=network.target
[Service]
Type=simple
ExecStart=/www/server/frp/frps -c /www/server/frp/frps.ini
ExecReload=/www/server/frp/frps reload -c /www/server/frp/frps.ini
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
StandardOutput=syslog
StandardError=inherit
[Install]
WantedBy=multi-user.target
说明 ExecStart=/www/server/frp/frps
/www/server/frp/frps
是你的服务端所在的路径
客户端
使用https://github.com/winsw/winsw 写入服务
在 https://github.com/winsw/winsw/releases 下载对应版本
修改WinSW-x64.exe为你想要的名称 例如winSW.exe
创建同名.xml文件 例如 winSW.xml
<service>
<!-- 该服务的唯一标识 -->
<id>frp</id>
<!-- 该服务的名称 -->
<name>frp0.38.0-windows</name>
<!-- 该服务的描述 -->
<description>frpc客户端 这个服务用 frpc 实现内网穿透</description>
<!-- 要运行的程序路径 -->
<executable>D:\Tools\Frp\frpc.exe</executable>
<!-- 携带的参数 -->
<arguments>-c D:\Tools\Frp\frpc.ini</arguments>
<!-- 第一次启动失败 60秒重启 -->
<onfailure action="restart" delay="60 sec"/>
<!-- 第二次启动失败 120秒后重启 -->
<onfailure action="restart" delay="120 sec"/>
<!-- 日志模式 none是关闭日志 -->
<logmode>none</logmode>
<!-- 指定日志文件目录(相对于executable配置的路径) -->
<logpath>logs</logpath>
</service>
运行cmd
//注册服务
winSW.exe install
//卸载服务
winSW.exe uninstall
//启动服务
winSW.exe start
//停止服务
winSW.exe stop
//重启服务
winSW.exe restart
//查看状态
winSW.exe status
注册服务时如果被某60拦截了需要点允许
如果提示:FATAL - WMI Operation failure: AccessDenied 则需要以管理员方式运行CMD再试
3.开机自启
服务端
执行写入服务之后执行
systemctl daemon-reload
systemctl enable frp.service
systemctl start frp.service
客户端
上述生成的服务设置为自动启动即可