远程办公以及实现内网穿透-FRP

发布时间:2021年11月22日 阅读:3367 次

利用云服务实现远程办公和内网穿透访问内网服务

应用场景

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/

把下载的对应的版本上传到服务端

image.png

之后解压

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

配置完服务端 客户端根据自己平台下载对应的产品

image.png

下方有配置文件说明

服务端启动命令

./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

服务端管理界面截图

image.png

客户端配置

[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

截图

image.png

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

客户端

image.png

上述生成的服务设置为自动启动即可

image.png







frp_0.38.0_linux_386.tar.gz

frp_0.38.0_windows_386.zip

WinSW.zip

简单配置.zip


Tag:
相关文章