随着 全球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服务。
配置要求
- 一台服务器,linux或windows皆可(或者网上免费的frp 服务)
- 一个可管理的域名(因为得做域名泛解析)
- 任意操作系统的一台客户机(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 主页。
转载请注明出处