frp 内网穿透工具

软件简介

内网穿透,也即 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 页面下载最新版本的程序。

将 frps 及 frps.ini 放到具有公网 IP 的机器上。

将 frpc 及 frpc.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.xserver_port = 1000[ssh]type = tcplocal_ip = 127.0.0.1local_port = 22remote_port = 6000
  1. 启动 frpc:

./frpc -c ./frpc.ini

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

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

 

# frps.ini[common]bind_port = 1000vhost_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.xserver_port = 1000[web]type = httplocal_port = 80custom_domains = www.yourdomain.com
  1. 启动 frpc:

./frpc -c ./frpc.ini

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

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

# frps.ini[common]server_addr = x.x.x.xserver_port = 7000[test_static_file]type = tcpremote_port = 6000plugin = static_file# 要对外暴露的文件目录plugin_local_path = /tmp/file# 访问 url 中会被去除的前缀,保留的内容即为要访问的文件路径plugin_strip_prefix = staticplugin_http_user = abcplugin_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.xserver_port = 6000[test_htts2http]type = httpscustom_domains = test.yourdomain.complugin = https2httpplugin_local_addr = 127.0.0.1:80# HTTPS 证书相关的配置plugin_crt_path = ./server.crtplugin_key_path = ./server.keyplugin_host_header_rewrite = 127.0.0.1
  1. 通过浏览器访问 https://test.yourdomain.com 即可。

 

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

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

ssh -oPort=6000 test@127.0.0.1

 

网络安全的屏障

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

 

强化网络安全策略

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

 

# frps.ini[common]server_addr = x.x.x.xserver_port = 6000[secret_ssh_visitor]type = stcp# stcp 的访问者role = visitor# 要访问的 stcp 代理的名字server_name = secret_sshsk = abcdefg# 绑定本地端口用于访问 ssh 服务bind_addr = 127.0.0.1bind_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.xserver_port = 7000[p2p_ssh]type = xtcp# 只有 sk 一致的用户才能访问到此服务sk = abcdefglocal_ip = 127.0.0.1local_port = 22
  1. 在要访问这个服务的机器上启动另外一个 frpc,配置如下:

1、记录计算机网络之中的数据信息

数据信息对于计算机网络建设工作有着积极的促进作用,同时其对于计算机网络安全也有着一定程度上的影响。通过防火墙技术能够收集计算机网络在运行的过程当中的数据传输、信息访问等多方面的内容,同时对收集的信息进行分类分组,借此找出其中存在安全隐患的数据信息,采取针对性的措施进行解决,有效防止这些数据信息影响到计算机网络的安全。除此之外,工作人员在对防火墙之中记录的数据信息进行总结之后,能够明确不同类型的异常数据信息的特点,借此能够有效提高计算机网络风险防控工作的效率和质量。 

2、防止工作人员访问存在安全隐患的网站

计算机网络安全问题之中有相当一部分是由工作人员进入了存在安全隐患的网站所导致的。通过应用防火墙技术能够对工作人员的操作进行实时监控,一旦发现工作人员即将进入存在安全隐患的网站,防火墙就会立刻发出警报,借此有效防止工作人员误入存在安全隐患的网站,有效提高访问工作的安全性。 [4] 

3、控制不安全服务

计算机网络在运行的过程当中会出现许多不安全服务,这些不安全服务会严重影响到计算机网络的安全。通过应用防火墙技术能够有效降低工作人员的实际操作风险,其能够将不安全服务有效拦截下来,有效防止非法攻击对计算机网络安全造成影响。此外,通过防火墙技术还能够实现对计算机网络之中的各项工作进行实施监控,借此使得计算机用户的各项工作能够在一个安全可靠的环境之下进行,有效防止因为计算机网络问题给用户带来经济损失。 

# frpc.ini[common]server_addr = x.x.x.xserver_port = 7000[p2p_ssh_visitor]type = xtcp# xtcp 的访问者role = visitor# 要访问的 xtcp 代理的名字server_name = p2p_sshsk = abcdefg# 绑定本地端口用于访问 ssh 服务bind_addr = 127.0.0.1bind_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 为前缀。

数据必经之地

内部网络和外部网络之间的所有网络数据流都必须经过防火墙。这是防火墙所处网络位置特性,同时也是一个前提。因为只有当防火墙是内、外部网络之间通信的通道,才可以全面、有效地保护企业网部网络不受侵害。根据美国国家安全局制定的《信息保障技术框架》,防火墙适用于用户网络系统的边界,属于用户网络边界的安全保护设备。所谓网络边界即是采用不同安全策略的两个网络连接处,比如用户网络和互联网之间连接、和其它业务往来单位的网络连接、用户内部网络不同部门之间的连接等。防火墙的目的就是在网络连接之间建立一个安全控制点,通过允许、拒绝或重新定向经过防火墙的数据流,实现对进、出内部网络的服务和访问的审计和控制。

典型的防火墙体系网络结构一端连接企事业单位内部的局域网,而另一端则连接着互联网。所有的内、外部网络之间的通信都要经过防火墙,只有符合安全策略的数据流才能通过防火墙。

 

网络流量的合法性

防火墙最基本的功能是确保网络流量的合法性,并在此前提下将网络的流量快速的从一条链路转发到另外的链路上去。从最早的防火墙模型开始谈起,原始的防火墙是一台 “双穴主机”,即具备两个网络接口,同时拥有两个网络层地址。防火墙将网络上的流量通过相应的网络接口接收上来,按照 OSI 协议栈的七层结构顺序上传,在适当的协议层进行访问规则和安全审查,然后将符合通过条件的报文从相应的网络接口送出,而对于那些不符合通过条件的报文则予以阻断。因此,从这个角度上来说,防火墙是一个类似于桥接路由器的、多端口的(网络接口 >=2)转发设备,它跨接于多个分离的物理网段之间,并在报文转发过程之中完成对报文的审查工作。

 

抗攻击免疫力

防火墙自身应具有非常强的抗攻击免疫力:这是防火墙之所以能担当企业内部网络安全防护重任的先决条件。防火墙处于网络边缘,它就像一个边界卫士一样,每时每刻都要面对黑客的入侵,这样就要求防火墙自身要具有非常强的抗击入侵本领。它之所以具有这么强的本领防火墙操作系统本身是关键,只有自身具有完整信任关系的操作系统才可以谈论系统的安全性。其次就是防火墙自身具有非常低的服务功能,除了专门的防火墙嵌入系统外,再没有其它应用程序在防火墙上运行。当然这些安全性也只能说是相对的。国内的防火墙几乎被国外的品牌占据了一半的市场,国外品牌的优势主要是在技术和知名度上比国内产品高。而国内防火墙厂商对国内用户了解更加透彻,价格上也更具有优势。防火墙产品中,国外主流厂商为思科(Cisco)、CheckPointNetScreen 等,国内主流厂商为东软天融信联想方正等,它们都提供不同级别的防火墙产品。

frp 支持根据请求的 URL 路径路由转发到不同的后端服务。

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

# frpc.ini[web01]type = httplocal_port = 80custom_domains = web.yourdomain.comlocations = /[web02]type = httplocal_port = 81custom_domains = web.yourdomain.comlocations = /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.xserver_port = 7000http_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

插件

默认情况下,frpc 只会转发请求到本地 tcp 或 udp 端口。

插件模式是为了在客户端提供更加丰富的功能,目前内置的插件有 unix_domain_sockethttp_proxysocks5static_file。具体使用方式请查看使用示例。

通过 plugin 指定需要使用的插件,插件的配置参数都以 plugin_ 开头。使用插件后 local_ip 和 local_port 不再需要配置。

<br/>


标签: none

添加新评论 »