内网穿透介绍
内网穿透是一种将内部网络中的应用程序通过公共网络访问的技术。它可以帮助用户轻松地在外部网络访问内部网络中运行的应用程序,而无需在路由器上进行端口转发或使用VPN。
内网穿透的实现方式有多种,其中较为常见的是基于反向代理服务器的方式。反向代理服务器可以将公共网络请求转发到内部网络中的应用程序,并将响应返回给客户端。这种方式需要在公共网络上配置反向代理服务器,并在内部网络中配置相应的应用程序和端口转发规则。
另一种实现方式是使用专门的内网穿透软件。这些软件通常需要在内部网络中安装代理客户端,并在公共网络上安装代理服务器。用户可以通过代理客户端连接到代理服务器,然后访问内部网络中运行的应用程序。这种方式相对比较简单,但需要额外安装和配置软件。
内网穿透的使用场景非常广泛,例如远程桌面、文件共享、监控系统等。特别是在疫情期间,远程办公成为了趋势,内网穿透技术也因此得到了更广泛的应用。
然而,内网穿透也存在一些安全风险。由于内网穿透技术可以将内部网络中的应用程序暴露在公共网络上,如果没有正确的安全措施,可能会导致网络攻击和数据泄露等问题。因此,在使用内网穿透技术时需要注意加强网络安全,例如限制访问IP地址、加密数据传输等。
frp介绍
frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。
frp 项目官网是
https://github.com/fatedier/frp,中文官方文档地址:https://gofrp.org/docs/。除了安装过程,中文文档对使用过程已经介绍的非常详细,如遇到问题,建议先查看官方文档。frp工作原理为:
服务端运行,监听一个主端口,等待客户端的连接;客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;服务端fork新的进程监听客户端指定的端口;外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。其他内网穿透工具
除了开源的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 下载最新的包:
根据系统类型下载对应的包
2、部署服务端
2.1、把
frp_0.48.0_linux_386.tar.gz(如果服务器为window,解压
frp_0.48.0_windows_386.zip) 解压出来保留以下三个文件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 端口
0
用于辅助创建 P2P 连接
kcp_bind_port
int
服务端监听 KCP 协议端口
0
用于接收采用 KCP 连接的 frpc
quic_bind_port
int
服务端监听 QUIC 协议端口
0
用于接收采用 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 successfully2.4、访问web界面 124.5.23.6:15001,如下:
2.5、至此服务端配置成功
3、客户端基础配置
3.1、把
frp_0.48.0_windows_386.zip(如果服务器为window,解压
frp_0.48.0_linux_386.tar.gz) 解压出来保留以下三个文件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: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, 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,将此值设置为 -1heartbeat_timeout
int
和服务端心跳的超时时间
90
udp_packet_size
int
代理 UDP 服务时支持的最大包长度
1500
服务端和客户端的值需要一致
start
string
指定启用部分代理
当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用
meta_xxx
map
附加元数据
会传递给服务端插件,提供附加能力
3.3、用cmd运行
frpc -c frpc.ini3.4、访问管理端 http://127.0.0.1:7400/,出现如下说明配置成功
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 = true4.4.2、运行客户端后
ssh -p 15002 name@124.5.23.64.4.3、成功访问
4.5、代理的Http配置,下面我们配置一个访问内网web的例子
4.5.1、接上一节继续修改配置文件frpc.ini,在前面的基础上加入
[web] type = http #本地端口 local_port = 8080 #服务器绑定自定义域名,需把域名解析到服务器ip custom_domains = proxy.test.com4.5.2、运行客户端后,即可访问到本地的http服务了,15003是服务端配置的http监听端口
4.6、frp还可以代理STCP\SUDP\XTCP\TCPMUX\UDP,由于本人暂时没用到,等用到时候再给大家分享,有问题可以评论区提出,谢谢!
最后分享下配置过程中会涉及到的一些技术:
1、如果需要frp开机自启动可以参考:frp开机自启动
2、配置中所有配置的端口服务端都需要开放防火墙,参考:linux防火墙配置
1