内网穿透介绍

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

2.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,将此值设置为 -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/,出现如下说明配置成功

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 name@124.5.23.6

4.4.3、成功访问

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监听端口

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

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

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

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

1

声明:本站为非盈利性赞助网站,本站所有软件来自互联网,版权属原著所有,如有需要请购买正版。如有侵权,敬请来信联系我们,我们立即删除。