导言

在开始之前,想象一下,你现在有这样的几个问题: 假如,

  • 你有一台性能不错的服务器,磁盘空间很充足, 想做一个web服务,但是申请不到公网IP。
  • 远程通过SSH连接、管理处于路由器之后的服务器,
  • 远程上传文件、从服务器下载文件,实现文件的共享。

众所周知,要想让互联网的各个角落都能访问你的服务,你得先有一个公网IP,但是公网IP近年来也算是比较紧缺的资源了。有时候申请公网IP也并不是容易的事,尤其当你的网络管理中心隶属于学校、机构等的时候。这便是我最近遇到的一个问题。

俗话说,逢山开路,遇水架桥,是问题总会有办法解决的。而解决上述问题的一个不错方法就是使用frp(Fast everse proxy)进行内网穿透

正文

文章约定

进行frp内网穿透,你首先需要具有以下硬件支持

  • 处于内网/防火墙之后,需要提供服务的服务器
  • 一台具有公网IP的服务器

公网IP服务器,需要你在网上进行购买,可以选择华为云、阿里云、腾讯云等的轻量服务器,也可以选择一些价格便宜的VPS。

在这里,我们约定,提供web服务的服务器为client, 具有公网IP的服务器为service。client和service端的操作系统可以是Linux、Windows等。这里我们选择client为Ubuntu, service为Windows进行讲解。

原理分析

在正式开始之前,我们简单了解一下内网穿透的原理。请看以下这张来自百度百科的原理图。

Intranet penetration

简单来说,帮助我们进行内网穿透的service端就像一个中转站, 负责转发我们请求以及web服务器返回的数据。因而,当我们访问我们的web服务时,其实最先访问的是提供穿透服务的service。

你可能注意到了一个问题,那就是流量的限制。因为所有的请求都会流经service端,因而,service端服务器的带宽影响着访问client端服务器网页、数据的速度。client与service服务器的带宽共同决定了web服务传输质量。

穿透过程

frp下载

frp官方下载地址: Github项目直达

你一共需要下载两个文件,一个用于service端,另一个用于client端,若service与client操作系统相通,下载一个即可。

需要注意的是你需要根据的你的服务器操作系统以及架构选择正确的版本。

若你是Linux系统,你可以通过一下命令查看架构

sudo arch

若显示x86_64, 选择linux_arm64版本即可。

下载完成以后将文件解压,client端删除含有frps关键字的文件,service端删除含有frpc关键字的文件。

service端配置

打开frps.ini文件,清空原有的配置信息,输入一下信息

[common]
bind_port = 7000  
vhost_http_port = 80

dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password    

需要简单的解释一下

  • bind_port为与service端frp进行通信的端口
  • vhost_http_port用于开放web服务80端口
  • dashboard_port监控面板的端口号
  • dashboard_user登录监控面板的账号
  • dashboard_pwd登录监控面板的密码

监控面板是frp提供的一个额外的功能,像以上配置以后,你可以通过公网IP+监控端口号进行访问,查看基础的数据,例如访问次数,数据流量等。如果你不需要,删除最后三个配置即可。

配置完成以后,打开命令行,切换到frp所在目录,并执行以下命令运行frp服务

./frps.exe -c frps.ini 

client端配置

同service端一样,首先清空原配置信息,输入一下信息

[common]
server_addr = 119.1.1.1
server_port = 7000

[ssh]
type = tcp
local = 127.0.0.1
local_port = 22
remote_port = 6000

[web]
type = http
local_port = 80
custom_domains = 119.1.1.1, www.example.com
  • server_addr为公网服务器ip地址
  • server_port保持与service端的bind_port一致即可
  • remote_port为自定义的访问内网ssh的端口号,如上,可通过119.1.1.1:6000发起与client的ssh连接
  • custom_domains 为所绑定公网服务器的IP/域名, 只有配置了的IP/域名才可以访问client端的web服务。多个域名/IP用英文都好隔开。

配置完成以后,确保你目前的目录在frp内,执行以下命令移动frp目录,启动frp服务

mkdir /srv/frp
mv . /srv/frp

touch frp.log

nohup ./frpc -c frpc.ini > frp.log &

这里,以后台运行的方式启动了frp client端服务,确保等你关掉命令行终端以后,你的frp服务进程不会随之被终结。

现在,在service与client端frp服务都正常运行以后,你还需要做一项工作: 配置服务器安全组,开放对应的端口。

以上述为例,cilent端你需要开放22, 80端口,service端需要开放6000, 7000端口

现在你即可通过以下域名访问你的web服务

  • 119.1.1.1
  • www.example.com

你也可以通过119.1.1.1:6000端口与你的服务器建立ssh连接。

最后提示一下,以上配置代码中的相关端口都是采用的frp文档推荐使用的。 建议修改为自己的,尤其是ssh服务的端口号,这样可以减少ssh端口暴露,降低ssh爆破的风险。

结束语

内网穿透存在一下几个问题,或者说缺点:

  • client所有的流量都是经过frp进行转发接收过来的,因而所有的访问IP源都将会是127.0.0.1,无论是Apache的web服务,还是ssh服务。Apache这一问题,可以通过相关的服务设置进行解决。ssh可以通过frp的stcp模式解决。
  • 如前面所说的,service端流量限制。frp支持多种模式/协议,例如tcp,tcp,udp,xtcp等。xtcp可以进行点对点转发,也就是service与client建立连接之后,网页请求的数据可以不经过service服务器,client直接与目标客户端通信。但遗憾的是,xtcp似乎不能用到web服务上面去。

对于如何解决Apache端,访问记录中ip都是127.0.0.1,我目前只知道大致的方向,还尚未完全解决,有会的朋友可以交流一下。

Last modification:December 22, 2021
如果觉得我的文章对你有用,请随意赞赏