<p>随着 全球IPV4 地址的枯竭,IPV6在中国又推广应用得很慢。现在的运营商都限制家庭用户通过PPPOE拨号获取公网IP了,我家的宽带也很杯具的给分配了内网的拨号IP</p> <p>但因为我家有NAS,上面有跑ARIA2与TRANSMISION 和监控的服务,以前一直用路由的端口转发来访问内网数据 ,自从被强奸成内网IP后不能实现了。无奈之下只能通过搭建内网穿透应用来实现访问内网主机的服务 。</p>
<h2 id="toc_0">内网穿透作用</h2>
<p>大家都知道如果家里有nas 或监控主机而且需要从外网访问到家里的各种服务的话,以前我们都是直接通过路由器的端口映射或dmz主机设置来实现应用。<br/>
但上面说的端口映射与dmz要求路由拨号时有公网ip,如果获取不到公网ip的话只能通过内网穿透来实现了。</p>
<p>内网穿透的原理其实就是 当用户要访问内网服务时 ,服务端与客户端间建立一条通讯隧道供客户访问</p>
<p>目前比较流行的内网穿透有:<br/>
- 商业化的 花生壳内网穿透<br/>
- 老外开源的 ngrok<br/>
- 新面世不久的 frp</p>
<p>这里我们只讲frp ,因为花生壳流量有限制要钱, 而ngrok 最后一个开源版本有内存泄露问题。新出的frp 功能比较单纯,内存也控制得很好,最主要是容易搭建配置,完全不用再次编译。</p>
<h2 id="toc_1">什么是FRP</h2>
<p>frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。</p>
<h3 id="toc_2">作用</h3>
- 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
- 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
- 利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。
<h3 id="toc_3">架构</h3>
<p></p>
<h2 id="toc_4">功能解读</h2>
<h3 id="toc_5">如何查看公网内网</h3>
<p>先登陆你自己的路由器,查看PPPOE 获取 的IP地址。然后再登陆任何一个可以查出口IP的网站,例如 ip138.com ,对比两个IP。如果对不上的话,恭喜你,也给强奸成内网IP了。</p>
<h3 id="toc_6">利用FRP 实现的功能</h3>
<p>假设我们要把家中内网的一个网站端口80
与ssh的端口22
暴露出去让外网可以访问。<br/> 这样我们就可以在外网用http://web.house.frp.com
的形式直接访问内网网站,而用web.house.frp.com:22
的形式用于访问内网的ssh服务。</p>
<h3 id="toc_7">配置要求</h3>
- 一台服务器,linux或windows皆可(或者网上免费的frp 服务)
- 一个可管理的域名(因为得做域名泛解析)
- 任意操作系统的一台客户机(frp 是一款跨平台的穿透服务)
<h2 id="toc_8">安装与配置</h2>
<p>frp程序下载网址:</p>
https://github.com/fatedier/frp/releases/
<p>官方文档</p>
https://github.com/fatedier/frp/
<h3 id="toc_9">域名配置</h3>
<p>假设我们的域名是frps.com ,我们需要做两条DNS 解析记录</p>
house.frp.com 解析到 Frp的服务端IP地址
*.house.frp.com 泛解析到Frp的服务端IP地址 #泛解析是为了后面客户端请求开启web服务穿透时用的三级域名
<h3 id="toc_10">Frp服务端安装</h3>
<p>我们以centos 为例来安装frp的服务端来演示一下如何安装</p>
<p>如果要复制本站的代码直接粘贴使用的话请记得去掉 #及后面的注释,不然有可能会发生错误</p>
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
<p>以下代码分别是下载FRP程序并解压后进入目录<br/>FRP程序包含以下几个文件
</p>
1. frpc 客户端程序
2. frpc.ini 客户端配置文件
3. frpc_full.ini 客户端所有配置示例
4. frps 服务端程序
5. frps.ini 服务端配置文件
6. frps_full.ini 服务端所有配置示例
<h4 id="toc_11">最简易功能服务端配置请编辑</h4>
<p>编辑frps.ini
</p>
vi frps.ini
<p>编辑内容如下</p>
[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
<p>保存配置后启动服务端</p>
chmod +x frps
./frps -c frps.ini
<p>启动显示以下服务信息就证明服务端成功运行了</p>
<p></p>
<h3 id="toc_12">Frp客户端安装</h3>
<p>客户端我们照旧用linux的系统来做示例,windows 系统的操作方法一样的配置文件,只不过下载windows专用的程序就行。<br/>
比方我想把frp的客户端安装在我的x64软路由器上,系统是openwrt的。(其它的操作系统请选择相应的程序包)</p>
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
<p>解压缩出来的文件与服务端的一样,只不过这里我们只需要配置客户端的配置文件</p>
vi frpc.ini
<p>输入以下内容</p>
[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 访问
<p>保存配置后运行客户端</p>
chmod +x frpc
./frpc -c frpc.ini
<p>客户端启动后会显示如下信息<br/>
<br/>
接收到客户端请求的服务端则显示<br/>
</p>
<h3 id="toc_13">使用内网服务</h3>
<p>现在开始就可以在外网使用 http://web.house.frp.com 访问内网的网站<br/>
连接frp服务端的2202 端口以访问内网的SSH服务了</p>
<h3 id="toc_14">查看FRP服务情况</h3>
<p>直接浏览器输入 http://你的frp服务端ip地址:7500/<br/>
输入验证的用户与密码后可查看frp客户端与服务端连接的类型与统计流量<br/>
</p>
<h3 id="toc_15">其他功能</h3>
<p>frp 做为一个新的内网穿透服务功能其实不止用来暴露网站或端口,它还可用做http代理,未来还可能会开发udp打洞功能。其它详细的功能配置请查看作者的github 主页。</p> <p>转载请注明出处</p>