搭建FRP内网穿透服务

随着 全球IPV4 地址的枯竭,IPV6在中国又推广应用得很慢。现在的运营商都限制家庭用户通过PPPOE拨号获取公网IP了,我家的宽带也很杯具的给分配了内网的拨号IP

但因为我家有NAS,上面有跑ARIA2与TRANSMISION 和监控的服务,以前一直用路由的端口转发来访问内网数据 ,自从被强奸成内网IP后不能实现了。无奈之下只能通过搭建内网穿透应用来实现访问内网主机的服务 。

内网穿透作用

大家都知道如果家里有nas 或监控主机而且需要从外网访问到家里的各种服务的话,以前我们都是直接通过路由器的端口映射或dmz主机设置来实现应用。
但上面说的端口映射与dmz要求路由拨号时有公网ip,如果获取不到公网ip的话只能通过内网穿透来实现了。

内网穿透的原理其实就是 当用户要访问内网服务时 ,服务端与客户端间建立一条通讯隧道供客户访问

目前比较流行的内网穿透有:
1. 商业化的 花生壳内网穿透
2. 老外开源的 ngrok
3. 新面世不久的 frp

这里我们只讲frp ,因为花生壳流量有限制要钱, 而ngrok 最后一个开源版本有内存泄露问题。新出的frp 功能比较单纯,内存也控制得很好,最主要是容易搭建配置,完全不用再次编译。

什么是FRP

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

作用

  • 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
  • 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
  • 利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

架构

功能解读

如何查看公网内网

先登陆你自己的路由器,查看PPPOE 获取 的IP地址。然后再登陆任何一个可以查出口IP的网站,例如 ip138.com ,对比两个IP。如果对不上的话,恭喜你,也给强奸成内网IP了。

利用FRP 实现的功能

假设我们要把家中内网的一个网站端口80与ssh的端口22暴露出去让外网可以访问。
这样我们就可以在外网用 http://web.house.frp.com的形式直接访问内网网站,而用 web.house.frp.com:22 的形式用于访问内网的ssh服务。

配置要求

  1. 一台服务器,linux或windows皆可(或者网上免费的frp 服务)
  2. 一个可管理的域名(因为得做域名泛解析)
  3. 任意操作系统的一台客户机(frp 是一款跨平台的穿透服务)

安装与配置

frp程序下载网址:

https://github.com/fatedier/frp/releases/

官方文档

https://github.com/fatedier/frp/

域名配置

假设我们的域名是frps.com ,我们需要做两条DNS 解析记录

house.frp.com 解析到 Frp的服务端IP地址
*.house.frp.com 泛解析到Frp的服务端IP地址 #泛解析是为了后面客户端请求开启web服务穿透时用的三级域名

Frp服务端安装

我们以centos 为例来安装frp的服务端来演示一下如何安装

如果要复制本站的代码直接粘贴使用的话请记得去掉 #及后面的注释,不然有可能会发生错误

wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz
tar zxvf frp_0.12.0_linux_amd64.tar.gz
cd frp_0.12.0_linux_amd64

以下代码分别是下载FRP程序并解压后进入目录
FRP程序包含以下几个文件

1. frpc 客户端程序
2. frpc.ini 客户端配置文件
3. frpc_full.ini 客户端所有配置示例
4. frps 服务端程序
5. frps.ini 服务端配置文件
6. frps_full.ini 服务端所有配置示例

最简易功能服务端配置请编辑

编辑frps.ini

vi frps.ini

编辑内容如下

[common]
bind_addr = 0.0.0.0 #绑定地址
bind_port = 7000 #设置frp服务端的通讯端口
# 内网http服务穿透端口
vhost_http_port = 80
# frp服务的网页监控面板端口,设置后可通过 http://ip地址:7500 查看相应客户端frp服务的连接状态与流量统计
dashboard_port = 7500
# 网页监控面板的用户名与密码,默认都为admin
dashboard_user = admin
dashboard_pwd = admin
# 特权模式的密码:用以客户端与服务端连接时的验证密码
privilege_token = 12345678
# 如果没有配置子域名的话,则可以在客户端配置里面指定泛解析的域名
# 设置用于解析的子域名
subdomain_host = house.frp.com

保存配置后启动服务端

chmod +x frps 
./frps -c frps.ini

启动显示以下服务信息就证明服务端成功运行了

Frp客户端安装

客户端我们照旧用linux的系统来做示例,windows 系统的操作方法一样的配置文件,只不过下载windows专用的程序就行。
比方我想把frp的客户端安装在我的x64软路由器上,系统是openwrt的。(其它的操作系统请选择相应的程序包)

wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz
tar zxvf frp_0.12.0_linux_amd64.tar.gz
cd frp_0.12.0_linux_amd64

解压缩出来的文件与服务端的一样,只不过这里我们只需要配置客户端的配置文件

vi frpc.ini

输入以下内容

[common]
server_addr = frp服务端ip地址
server_port = 7000
#连接服务端的验证密码,必须与服务端配置的一样
privilege_token = 12345678
# ssh  的端口穿透配置
[ssh]
# 可选 tcp | udp | http | https, 默认是tcp 
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 2202 # 服务端用来中转的端口
# 内网网站暴露配置
[web01]
type = http
local_ip = 192.168.1.22 #要穿透的主机ip
local_port = 80 #暴露的端口
subdomain = web #配置三级域名, 后面可以通过web.house.frp.com 访问

保存配置后运行客户端

chmod +x frpc
./frpc -c frpc.ini

客户端启动后会显示如下信息

接收到客户端请求的服务端则显示

使用内网服务

现在开始就可以在外网使用 http://web.house.frp.com 访问内网的网站
连接frp服务端的2202 端口以访问内网的SSH服务了

查看FRP服务情况

直接浏览器输入 http://你的frp服务端ip地址:7500/
输入验证的用户与密码后可查看frp客户端与服务端连接的类型与统计流量

其他功能

frp 做为一个新的内网穿透服务功能其实不止用来暴露网站或端口,它还可用做http代理,未来还可能会开发udp打洞功能。其它详细的功能配置请查看作者的github 主页。

转载请注明出处

发表评论

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