- 网络相关

基于Frp搭建内网穿透服务

摘要

这篇文章将会介绍什么是内网穿透,以及如何基于Github上的开源项目Frp在Linux系统中搭建内网穿透服务。

什么是内网穿透?

内网穿透又被称作网络地址转换穿透,用于在内网与公网的设备之间建立连接。

为什么需要内网穿透?

为了访问互联网,每个设备需要一个IP地址,以建立与互联网或者其他设备之间的通讯。目前使用最广泛的IP地址是形如xxx.xxx.xxx.xxx的IPv4地址。通过这些地址,不同的互联网设备能够在互联网或其他设备之间建立连接。在下图中,设备1,2,3可以连接互联网,并且也可以互相访问及通讯。

然而随着互联网设备数量的增长,IPv4公网地址逐渐不足,难以支持越来越多的网络设备访问互联网。为了避免这个问题,网络运营商使用网络地址转换技术,建立了基于一个公网IPv4地址的内网,使连接到这个内网的设备可以共享同一个IP地址访问互联网。在下图中,NAT1网络中的1,2,3设备可以共享地址1联网,NAT2网络中的4,5,6设备可以共享地址2联网。然而,NAT1中的设备无法访问NAT2中的设备,因为每个内网设备在公网上没有独立的IP地址。

为了解决不同内网设备间无法访问的问题,内网穿透服务允许内网中的设备映射到公网中,并被任何能够访问公网的设备访问。

最著名的内网穿透服务是Ngrok,其第一代项目在Github上开源,而第二代是非开源的。因此,在这篇文章中,将使用另一种开源的内网穿透服务Frp作为示例。

什么是Frp?

Frp是一种快速的反向代理,可以将位于NAT或防火墙保护之下的本地服务器暴露在互联网上。到目前为止,它支持tcp, udp, http以及https等常见协议。在这些协议中,访问请求可以通过域名转发到内网服务。

Github项目地址:https://github.com/fatedier/frp

Frp可以做什么?

通过Frp,局域网内的本地服务可以被映射到公网访问。比如,一个网站部署在内网的一部树莓派上,我们可以通过Frp服务将其映射到一个具有公网IP地址的云服务器上,并且通过云服务器的公网IP访问这个网站。

部署Frp服务

需求环境

  1. 一个部署在具有内网IP地址 ip_internal 的设备位于 port_internal 端口的服务,以树莓派为例。
  2. 一个具有独立公网IP地址 ip_public 的服务器,并且服务映射到 port_public 端口,以CentOS 7系统为例。
  3. 从Github下载的Frp服务端及客户端。
  4. 假设 port_internal 为7001,ip_internal 为192.168.123.101,ip_public 为123.456.789.100,port_public 为7010。

步骤一:在内网中检查服务访问

检查服务在内网中能否通过内网IP访问成功:http://192.168.123.101:7001,确保该服务能够正常工作。

步骤二 :从Github下载Frp

下载Frp的最新版本或者需要的特定版本,注意选择对应操作系统版本下载。

步骤三:部署Frp服务端

在服务器的管理系统中,放行防火墙7000以及7010端口。将frp, frps.ini文件上传到服务器的~/frp_server目录下。

cd ~
mkdir frp_server
mv frps frp_server
mv frps.ini frp_server

编辑frps.ini文件:

# frps.ini
[common]
# frps服务端口
bind_port = 7000

启动frps服务:

./frps -c ./frps.ini

步骤四:部署Frp客户端

在树莓派防火墙中放行7001端口,使用ufw配置防火墙即可。关于ufw防火墙配置的具体细节,可以参考我的另一篇文章:

sudo ufw allow 7001
sudo ufw enable

启动frpc服务:

./frpc -c ./frpc.ini

步骤五:通过公网IP访问服务

现在,我们可以通过公网网址http://123.456.789.100:7010访问服务。

注意事项

  1. Frp的服务端和客户端需要匹配(在同一版本)。
  2. 如果服务可以在内网成功访问,但是无法通过公网访问,请确保服务器的防火墙放行了远程端口。

最后

以上是关于Frp内网穿透服务的基本应用,如需了解更多功能(如dashboard, udp, stcp, token),请阅读Frp项目的README文件:https://github.com/fatedier/frp.

About Ziqi.Yang394

Read All Posts By Ziqi.Yang394

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注