天天看点

怎么利用frp实现内网穿透

作者:彬哥149923279

内网穿透介绍

内网穿透是一种将内部网络中的应用程序通过公共网络访问的技术。它可以帮助用户轻松地在外部网络访问内部网络中运行的应用程序,而无需在路由器上进行端口转发或使用VPN。

内网穿透的实现方式有多种,其中较为常见的是基于反向代理服务器的方式。反向代理服务器可以将公共网络请求转发到内部网络中的应用程序,并将响应返回给客户端。这种方式需要在公共网络上配置反向代理服务器,并在内部网络中配置相应的应用程序和端口转发规则。

另一种实现方式是使用专门的内网穿透软件。这些软件通常需要在内部网络中安装代理客户端,并在公共网络上安装代理服务器。用户可以通过代理客户端连接到代理服务器,然后访问内部网络中运行的应用程序。这种方式相对比较简单,但需要额外安装和配置软件。

内网穿透的使用场景非常广泛,例如远程桌面、文件共享、监控系统等。特别是在疫情期间,远程办公成为了趋势,内网穿透技术也因此得到了更广泛的应用。

然而,内网穿透也存在一些安全风险。由于内网穿透技术可以将内部网络中的应用程序暴露在公共网络上,如果没有正确的安全措施,可能会导致网络攻击和数据泄露等问题。因此,在使用内网穿透技术时需要注意加强网络安全,例如限制访问IP地址、加密数据传输等。

frp介绍

frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。

frp 项目官网是 https://github.com/fatedier/frp,中文官方文档地址:https://gofrp.org/docs/。除了安装过程,中文文档对使用过程已经介绍的非常详细,如遇到问题,建议先查看官方文档。

frp工作原理为:

  1. 服务端运行,监听一个主端口,等待客户端的连接;
  2. 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
  3. 服务端fork新的进程监听客户端指定的端口;
  4. 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
  5. 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。

其他内网穿透工具

除了开源的frp,还有如下内网穿透/远控工具:

  • ngrok:ngrok 也是很知名的内网穿透工具,自从2.x版本不再开源,名气在下降。ngrok官网也提供免费穿透隧道,但国内连接速度较慢。NATAPP、Sunny-Ngrok等工具基于ngrok二次开发而来;
  • ZeroTier:号称零配置的内网穿透工具,提供与企业 SDN 交换机同等的高级网络虚拟化和管理功能,可以跨本地和广域网连接任何设备和程序。然而由于ZeroTier的服务器在国外,国内连接速度经常很感人,需要自行搭建Moon来解决;
  • V2ray:V2ray是一个功能强大的网络平台,提供代理、反向代理、内网穿透等功能。本站之前已有V2ray相关资源: V2ray教程、V2ray高级教程:流量伪装 和 V2ray客户端下载;
  • 花生壳/向日葵:相信大部分折腾过路由器的人都听说过花生壳DDNS,可能也知道向日葵远控软件。花生壳和向日葵是贝锐科技旗下的产品,注册账户后可免费体验内网穿透功能;
  • TeamViewer:TeamViewer是国内外知名的远程控制、远程会议软件,额外提供文件上传下载等实用功能,比QQ远程协助好用一万遍。虽然个人版免费,但是现在TeamViewer商业化道路一去不复往,用起来越来越恶心;
  • SAKURA FRP:基于frp的免费内网穿透工具,也有收费服务。对于这家的行为,网民褒贬不一。如果你没有自己的服务器,可以尝试一下这家。

frp内网穿透教程

1、部署前需准备

1.1、准备一台能被公网访问到的(通过ip能够直接访问得到服务器)服务器,一台内网的测试机(你自己电脑就行),本人用的服务器是华为云的linux服务器,ip为124.5.23.6,测试机为win10系统。

1.2、访问官方项目地址:Releases · fatedier/frp · GitHub 下载最新的包:

怎么利用frp实现内网穿透

根据系统类型下载对应的包

2、部署服务端

2.1、把 frp_0.48.0_linux_386.tar.gz(如果服务器为window,解压frp_0.48.0_windows_386.zip) 解压出来保留以下三个文件

怎么利用frp实现内网穿透

2.2、修改配置文件,用编辑器打开frps.ini文件,做如下修改

[common]
#服务器监听穿口
bind_port = 15000
#身份认证 后面客户端连接也需配置这个token  还有另一种oidc验证比较复杂,可以参考官方文档
token=332361857
#web界面端口
dashboard_port = 15001
# dashboard 用户名密码,可选,默认为空
dashboard_user = admin
dashboard_pwd = admin332361857
#设置每个代理可以创建的连接池上限,避免大量资源占用,客户端设置超过此配置后会被调整到当前值
max_pool_count = 5
#端口白名单
allow_ports = 15000,15001,15002-15009
#http监听的端口
vhost_http_port = 15003
#日志文件配置
log_file = ./frps.log
#日志级别配置
log_level = info

           

以上是本次测试需要用到的参数,详细参数如下:

参数 类型 说明 默认值 可选值 备注
bind_addr string 服务端监听地址 0.0.0.0
bind_port int 服务端监听端口 7000 接收 frpc 的连接
bind_udp_port int 服务端监听 UDP 端口 用于辅助创建 P2P 连接
kcp_bind_port int 服务端监听 KCP 协议端口 用于接收采用 KCP 连接的 frpc
quic_bind_port int 服务端监听 QUIC 协议端口 用于接收采用 QUIC 连接的 frpc
quic_keepalive_period int quic 协议 keepalive 间隔,单位: 秒 10
quic_max_idle_timeout int quic 协议的最大空闲超时时间,单位: 秒 30
quic_max_incoming_streams int quic 协议最大并发 stream 数 100000
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 证书路径

2.3、把三个文件上传至服务器指定目录,运行命令

./frps -c frps.ini           

输出如下命令说明服务端运行成功

2023/03/31 10:59:01 [I] [root.go:206] frps uses config file: /home/web/frp/frps.ini
2023/03/31 10:59:01 [I] [service.go:200] frps tcp listen on 0.0.0.0:15000
2023/03/31 10:59:01 [I] [service.go:261] http service listen on 0.0.0.0:15003
2023/03/31 10:59:01 [I] [service.go:317] Dashboard listen on 0.0.0.0:15001
2023/03/31 10:59:01 [I] [root.go:215] frps started successfully
           

2.4、访问web界面 124.5.23.6:15001,如下:

怎么利用frp实现内网穿透

2.5、至此服务端配置成功

3、客户端基础配置

3.1、把 frp_0.48.0_windows_386.zip(如果服务器为window,解压frp_0.48.0_linux_386.tar.gz) 解压出来保留以下三个文件

怎么利用frp实现内网穿透

3.2、修改配置文件,用编辑器打开frpc.ini文件,做如下修改

[common]
#外网-服务器端ip
server_addr = 124.5.23.6
#外网-服务器端监听的端口(必须与frps.ini中的配置一致)
server_port = 15000
#token验证需与服务端配置的一致
token=332361857
#日志文件配置
log_file = ./frps.log
#日志级别配置
log_level = info
#连接池大小
pool_count=5
#客户端的web界面
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin           

以上是本次测试需要用到的参数,详细参数如下:

参数 类型 说明 默认值 可选值 备注
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:[email protected]: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 连接池大小
user string 用户名 设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突
dns_server string 使用 DNS 服务器地址 默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址
login_fail_exit bool 第一次登陆失败后是否退出 true
protocol string 连接服务端的通信协议 tcp tcp, kcp, quic, websocket
quic_keepalive_period int quic 协议 keepalive 间隔,单位: 秒 10
quic_max_idle_timeout int quic 协议的最大空闲超时时间,单位: 秒 30
quic_max_incoming_streams int quic 协议最大并发 stream 数 100000
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 附加元数据 会传递给服务端插件,提供附加能力

3.3、用cmd运行

frpc -c frpc.ini           

3.4、访问管理端 http://127.0.0.1:7400/,出现如下说明配置成功

怎么利用frp实现内网穿透

4、代理配置

4.1、代理的基础配置如下:

参数 类型 说明 是否必须 默认值 可选值 备注
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
bandwidth_limit_mode string 限流类型,客户端限流或服务端限流 client client, server

4.2、代理的本地服务配置

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 需要的参数也不一样,具体见客户端插件参数中的内容

4.3、代理的负载均衡和健康检查

参数 类型 说明 是否必须 默认值 可选值 备注
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”

4.4、代理的TCP配置,在下面我们配置访问内网的SSH。

4.4.1、接上一节继续修改配置文件frpc.ini,在前面的基础上加入

#代理名称 注意代理名称不能重复,配置多个需要区分,如[ssh] [ssh1] [ssh2]
[ssh]
#配置类型为http协议
type = tcp
#内网机器的IP
local_ip = 127.0.0.1
#内网需要监听的端口(win10所启服务端口)
local_port = 22
remote_port = 15002
#是否开启加密
use_encryption = true
#是否开启压缩
use_compression = true           

4.4.2、运行客户端后

ssh -p 15002  [email protected]            

4.4.3、成功访问

怎么利用frp实现内网穿透

4.5、代理的Http配置,下面我们配置一个访问内网web的例子

4.5.1、接上一节继续修改配置文件frpc.ini,在前面的基础上加入

[web]
type = http
#本地端口
local_port = 8080
#服务器绑定自定义域名,需把域名解析到服务器ip
custom_domains = proxy.test.com            

4.5.2、运行客户端后,即可访问到本地的http服务了,15003是服务端配置的http监听端口

怎么利用frp实现内网穿透

4.6、frp还可以代理STCP\SUDP\XTCP\TCPMUX\UDP,由于本人暂时没用到,等用到时候再给大家分享,有问题可以评论区提出,谢谢!

最后分享下配置过程中会涉及到的一些技术:

1、如果需要frp开机自启动可以参考:frp开机自启动

2、配置中所有配置的端口服务端都需要开放防火墙,参考:linux防火墙配置

1