frp 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
frp 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
frp 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 GPL
开发语言 JavaScript
操作系统 跨平台
软件类型 开源软件
所属分类 程序开发网络工具包
开源组织
地区 国产
投 递 者 FateDier
适用人群 未知
收录时间 2016-08-01

软件简介

内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与 NAT 设备的相对位置介绍内网穿透方法。目前较为成熟稳定的是花生壳和神卓互联,巴比达内网穿透、花生壳的技术是PHtunnel,神卓互联、巴比达的技术是WanGooe tunnel,和nginx架构一样都是采用C语言编写,性能上是比较优异的,适合很多嵌入式的设备搭载使用,而frp采用的是Go语言。

UDP 内网穿透的实质是利用路由器上的NAT 系统。NAT 是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。NAT可以完成重用地址,并且对于内部的网络结构可以实现对外隐蔽。

网络地址转换(Network Address Translation,NAT)机制的问题在于,NAT设备自动屏蔽了非内网主机主动发起的连接,也就是说,从外网发往内网的数据包将被NAT设备丢弃,这使得位于不同NAT设备之后的主机之间无法直接交换信息。这一方面保护了内网主机免于来自外部网络的攻击,另一方面也为P2P通信带来了一定困难。Internet上的NAT设备大多是地址限制圆锥形NAT或端口限制圆锥形 NAT,外部主机要与内网主机相互通信,必须由内网主机主动发起连接,使 NAT设备产生一个映射条目,这就有必要研究一下内网穿透技术。

使用示例

根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。

frpsfrps.ini 放到具有公网 IP 的机器上。

frpcfrpc.ini 放到处于内网环境的机器上。

通过访问公司内网机器

  1. 修改 frps.ini 文件,这里使用了最简化的配置:
# frps.ini
[common]
bind_port = 1000
  1. 启动 frps:

./frps -c ./frps.ini

  1. 修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x;
# frps.ini
[common]
server_addr = x.x.x.x
server_port = 2000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7000
  1. 启动 frpc:

./frpc -c ./frpc.ini

  1. 通过 ssh 访问内网机器,假设用户名为 test:

ssh -Port=6000 test@x.x.x.x

 

# frps.ini
[common]
bind_port = 1000
vhost_http_port = 8080
  1. 启动 frps;

./frps -c ./frps.ini

  1. 修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 web 服务对应的端口, 绑定自定义域名 www.yourdomain.com:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 1000

[web]
type = http
local_port = 80
custom_domains = www.*******.com
  1. 启动 frpc:

./frpc -c ./frpc.ini

  1. www.******.com 的域名 A 记录解析到 IP x.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。

  2. 通过浏览器访问 http://www.*******.com:8080 即可访问到处于内网机器上的 web 服务。

# frps.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[test_static_file]
type = tcp
remote_port = 6000
plugin = static_file
# 要对外暴露的文件目录
plugin_local_path = /tmp/file
# 访问 url 中会被去除的前缀,保留的内容即为要访问的文件路径
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc
  1. 通过浏览器访问 http://x.x.x.x:6000/static/ 来查看位于 /tmp/file 目录下的文件,会要求输入已设置好的用户名和密码。

为本地 HTTP 服务启用 HTTPS

通过 https2http 插件可以让本地 HTTP 服务转换成 HTTPS 服务对外提供。

# frps.ini
[common]
server_addr = x.x.x.x
server_port = 6000

[test_htts2http]
type = https
custom_domains = test.*******.com

plugin = https2http
plugin_local_addr = 127.0.0.1:80

# HTTPS 证书相关的配置
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1
  1. 通过浏览器访问 https://test.******.com 即可。

 

# frps.ini
[common]
server_addr = x.x.x.x
server_port = 6000

[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
  1. 在要访问这个服务的机器上启动另外一个 frpc,配置如下:
# frps.ini
[common]
server_addr = x.x.x.x
server_port = 6000

[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6000
  1. 通过 ssh 访问内网机器,假设用户名为 test:

ssh -oPort=6000 test@127.0.0.1

 

网络安全的屏障

一个防火墙(作为阻塞点、控制点)能极大地提高一个内部网络的安全性,并通过过滤不安全的服务而降低风险。由于只有经过精心选择的应用协议才能通过防火墙,所以网络环境变得更安全。如防火墙可以禁止诸如众所周知的不安全的NFS协议进出受保护网络,这样外部的攻击者就不可能利用这些脆弱的协议来攻击内部网络。防火墙同时可以保护网络免受基于路由的攻击,如IP选项中的源路由攻击和ICMP重定向中的重定向路径。防火墙应该可以拒绝所有以上类型攻击的报文并通知防火墙管理员

 

强化网络安全策略

通过以防火墙为中心的安全方案配置,能将所有安全软件(如口令加密身份认证、审计等)配置在防火墙上。与将网络安全问题分散到各个主机上相比,防火墙的集中安全管理更经济。例如在网络访问时,一次一密口令系统和其它的身份认证系统完全可以不必分散在各个主机上,而集中在防火墙一身上。
 
# frps.ini
[common]
server_addr = x.x.x.x
server_port = 6000

[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6000

 

监控审计

如果所有的访问都经过防火墙,那么,防火墙就能记录下这些访问并作出日志记录,同时也能提供网络使用情况的统计数据。当发生可疑动作时,防火墙能进行适当的报警,并提供网络是否受到监测和攻击的详细信息。另外,收集一个网络的使用和误用情况也是非常重要的。首先的理由是可以清楚防火墙是否能够抵挡攻击者的探测和攻击,并且清楚防火墙的控制是否充足。而网络使用统计对网络需求分析和威胁分析等而言也是非常重要的。
 

防止内部信息的外泄

通过利用防火墙对内部网络的划分,可实现内部网重点网段的隔离,从而限制了局部重点或敏感网络安全问题对全局网络造成的影响。再者,隐私是内部网络非常关心的问题,一个内部网络中不引人注意的细节可能包含了有关安全的线索而引起外部攻击者的兴趣,甚至因此而暴漏了内部网络的某些安全漏洞。使用防火墙就可以隐蔽那些透漏内部细节如Finger,DNS等服务。Finger显示了主机的所有用户的注册名、真名,最后登录时间和使用shell类型等。但是Finger显示的信息非常容易被攻击者所获悉。攻击者可以知道一个系统使用的频繁程度,这个系统是否有用户正在连线上网,这个系统是否在被攻击时引起注意等等。防火墙可以同样阻塞有关内部网络中的DNS信息,这样一台主机域名和IP地址就不会被外界所了解。除了安全作用,防火墙还支持具有Internet服务性的企业内部网络技术体系VPN(虚拟专用网)。

点对点内网穿透

frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。

使用方式同 stcp 类似,需要在两边都部署上 frpc 用于建立直接的连接。

目前处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 stcp 的方式。

  1. frps 除正常配置外需要额外配置一个 udp 端口用于支持该类型的客户端:
bind_udp_port = 7001
  1. 启动 frpc,转发内网的 ssh 服务,配置如下,不需要指定远程端口:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[p2p_ssh]
type = xtcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
  1. 在要访问这个服务的机器上启动另外一个 frpc,配置如下:
1、记录计算机网络之中的数据信息
数据信息对于计算机网络建设工作有着积极的促进作用,同时其对于计算机网络安全也有着一定程度上的影响。通过防火墙技术能够收集计算机网络在运行的过程当中的数据传输、信息访问等多方面的内容,同时对收集的信息进行分类分组,借此找出其中存在安全隐患的数据信息,采取针对性的措施进行解决,有效防止这些数据信息影响到计算机网络的安全。除此之外,工作人员在对防火墙之中记录的数据信息进行总结之后,能够明确不同类型的异常数据信息的特点,借此能够有效提高计算机网络风险防控工作的效率和质量。 
2、防止工作人员访问存在安全隐患的网站
计算机网络安全问题之中有相当一部分是由工作人员进入了存在安全隐患的网站所导致的。通过应用防火墙技术能够对工作人员的操作进行实时监控,一旦发现工作人员即将进入存在安全隐患的网站,防火墙就会立刻发出警报,借此有效防止工作人员误入存在安全隐患的网站,有效提高访问工作的安全性。 [4] 
3、控制不安全服务
计算机网络在运行的过程当中会出现许多不安全服务,这些不安全服务会严重影响到计算机网络的安全。通过应用防火墙技术能够有效降低工作人员的实际操作风险,其能够将不安全服务有效拦截下来,有效防止非法攻击对计算机网络安全造成影响。此外,通过防火墙技术还能够实现对计算机网络之中的各项工作进行实施监控,借此使得计算机用户的各项工作能够在一个安全可靠的环境之下进行,有效防止因为计算机网络问题给用户带来经济损失。 
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[p2p_ssh_visitor]
type = xtcp
# xtcp 的访问者
role = visitor
# 要访问的 xtcp 代理的名字
server_name = p2p_ssh
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6000
  1. 通过 ssh 访问内网机器,假设用户名为 test:

ssh -oPort=6000 test@127.0.0.1

功能说明

配置文件

由于 frp 目前支持的功能和配置项较多,未在文档中列出的功能可以从完整的示例配置文件中发现。

frps 完整配置文件

frpc 完整配置文件

 

export FRP_SERVER_ADDR="x.x.x.x"
export FRP_SSH_REMOTE_PORT="6000"
./frpc -c ./frpc.ini

frpc 会自动使用环境变量渲染配置文件模版,所有环境变量需要以 .Envs 为前缀。

 

通过配置文件中的 locations 字段指定一个或多个 proxy 能够匹配的 URL 前缀(目前仅支持最大前缀匹配,之后会考虑正则匹配)。例如指定 locations = /news,则所有 URL 以 /news 开头的请求都会被转发到这个服务。

# frpc.ini
[web01]
type = http
local_port = 80
custom_domains = web.yourdomain.com
locations = /

[web02]
type = http
local_port = 81
custom_domains = web.yourdomain.com
locations = /news,/about

按照上述的示例配置后,web.yourdomain.com 这个域名下所有以 /news 以及 /about 作为前缀的 URL 请求都会被转发到 web02,其余的请求会被转发到 web01。

通过代理连接 frp

在只能通过代理访问外网的环境内,frpc 支持通过 HTTP PROXY 和 frps 进行通信。

可以通过设置 HTTP_PROXY 系统环境变量或者通过在 frpc 的配置文件中设置 http_proxy 参数来使用此功能。

仅在 protocol = tcp 时生效。

# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
http_proxy = http://user:pwd@192.168.1.128:8080

端口映射

在 frpc 的配置文件中可以指定映射多个端口,目前只支持 tcp 和 udp 的类型。

这一功能通过 range: 段落标记来实现,客户端会解析这个标记中的配置,将其拆分成多个 proxy,每一个 proxy 以数字为后缀命名。

例如要映射本地 6000-6005, 6007 这6个端口,主要配置如下:

# frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007

实际连接成功后会创建 8 个 proxy,命名为 test_tcp_0, test_tcp_1 ... test_tcp_7

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击加入讨论🔥(81) 发布并加入讨论🔥
发表了资讯
2018/08/13 07:12

frp 0.21.0 发布,用于内网穿透的高性能反向代理工具

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。 frp 0.21.0 已发布,更新内容如下: New Websocket is a optional protocol for frpc to connect frps. Support configuring timeout duration for vhost http server. Fix Fix config parsing error for stcp and xtcp. 更多细节和下载地址可查阅发行列表。...

2
30
发表了资讯
2017/07/17 02:43

frp 0.13.0 发布,内网穿透工具

内网穿透工具 frp 0.13.0 发布了。 新增: 新增 stcp(secret tcp) 类型,避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc。 frpc 支持动态加载配置文件。 对于 http 类型的代理,每个连接的第一个请求附加上 X-Forwarded-For 和 X-Real-IP 的 header,用于传递用户真实 IP。 新增 socks5 plugin。 frps 新增参数 proxy_bind_addr,指定代理在服务端绑定的 ip 地址。 优化: 优化使用 kcp 时退出程序时延...

5
48
发表了资讯
2017/06/20 12:43

frp 0.12.0 发布,内网穿透工具

内网穿透工具 frp 0.12.0 发布了。 新增: 底层通信协议可选 kcp,在弱网环境下优化明显。 #99 优化: 对于访问 domain 不存在的情况返回 404 Not Found 页面。 #175 修复: 修复启用加密压缩后,连接不能正常断开的问题。 #322 修复启用加密压缩后,内存占用异常的问题。#345 修复 http_proxy plugin 无法使用加密和压缩的问题。

13
50
发表了资讯
2017/06/02 10:50

frp 0.11.0 发布,内网穿透工具

内网穿透工具 frp 0.11.0 发布了。 新增: 增加支持 unix域套接字 的 Plugin。 增加 http proxy 的 Plugin。 frpc 新增 login_fail_exit 配置项,如果为 false,则启动时连接服务器失败将不会退出,而是定期重连。 frpc 新增 start 配置项,可以选择启用指定的 proxy,默认为空,表示全部。 优化: dashboard 自动清除 7天内没有使用的 proxy 的统计信息。 dashboard 增加 frps 版本信息以及 proxy 最近一次启动和退出的时间信息...

11
54
发表了资讯
2017/05/22 10:12

frp 0.10.0 发布,内网穿透工具

内网穿透工具 frp 0.10.0 发布了。 新增: 重新设计的 Dashboard。 支持 TCP 多路复用,默认启用。 优化: 代码重构,协议变更,提高稳定性和性能。 服务端内存占用优化。 变更: 压缩算法替换为 snappy。 配置文件部分参数命名变更,具体见使用文档或参考配置文件。 注意:此版本和之前版本不兼容,需要同时升级客户端和服务器端。

17
76
发表了资讯
2016/12/21 15:27

frp 0.9.0 发布,内网穿透工具

内网穿透工具 frp 0.9.0 发布了。 新增: 支持穿透 UDP 服务。 Dashboard 增加身份验证机制,提高安全性。 http 服务支持在 frpc 配置文件中设置身份验证,访问需输入用户名密码,保护内网服务安全性。 frpc 支持通过 HTTP PROXY 连接 frps。 http 及 https 服务支持绑定泛域名。 http 及 https 服务支持 subdomain 设置。 增加 Dockerfile. 优化: 支持通过 authentication_timeout 设置 frpc 连接 frps 时身份验证的超时时间。...

10
111
发表了资讯
2016/08/23 00:00

frp v0.8.1 版本发布,内网穿透利器

内网穿透工具 frp 发布 0.8.1 版本,修复若干 bug: 修复 某些情况下 dashboard 状态显示不更新。 修复 authtoken 大于等于16字节会导致服务器端 panic 的异常。 修复无法正常删除旧日志文件的问题。 关于 frp frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。 frp 的作用 利用处于内网或防火墙后的机器,对外网环境...

20
93
发表了资讯
2016/08/12 00:00

frp 发布 0.8.0 版本,新增 dashboard 界面

内网穿透工具 frp 发布 0.8.0 版本,更新如下: 新增 Dashboard 页面,方便查看代理运行状态。 Server 端流量统计。 针对大量短连接支持配置连接池。 特权模式支持指定端口白名单。 动态修改 http 请求中的 host 字段。 优化 优化 GC,减少内存分配。 支持 ipv6. 修复 修复一个连接刚建立时可能产生丢包的问题。 详情:https://github.com/fatedier/frp/releases...

10
38
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
81 评论
1.3K 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部