FRP内网穿透配置 —— 解决无公网IP访问

FRP是很好用的一款内网穿透软件,只需要简单的配置就可以让内网中的计算机暴露在公网中访问。FRP支持TCP/UDP/HTTP/HTTPS 的内网转发,使用起来非常给力。
frpimg.png
图片转自热闹网https://www.izcv.com/1692.html
上图是对 FRP 最好的诠释,身处NAT网络环境中的 Server1 & Server2 & Server3 并没有公网IP,所以客户端并不能直接访问,但是通过FRP服务器的转发就可以愉快的进行内网穿透,达到访问它们的目的。

首先讲讲网络部分的一些基础内容,这部分学起来其实很有意义,我们在生活中都在广泛的使用。
离我们最近的:IPV4地址正式耗尽
IPV4.png
耗尽了怎么办?有两个解决办法:部署IPV6、NAT
前者国内正在加紧建设,后者已经广泛使用
NAT地址转换
看看百度给出的定义:
nat地址转换.png
通俗的说,就是因为IPV4地址不够用了,一个IP必须给多个设备服务。最常见的NAT,就在每家每户都有的路由器里。将一个公网IP,分配给家里的多个设备,比如图中,我的公网IP是112.192.58.245,路由器会将这个地址分配给我的电脑、手机、iPad等等上网设备,其组成一个局域网,地址是192.168.1.XX,当然这个地址是可以在路由器中设置的。
而在绝大多数情况下,由于供给中国分配的IPV4地址非常紧缺,IPS将公网也进行了NAT。也就是说,大家家里的带宽很有可能拿不到公网IP,而是一个被运营商NAT后的内网地址。
如何判断我有没有公网?

1、进入路由器或者光猫后台,查看WAN口得到的IP,这个IP是ISP给你分配的。
roter.png
2、百度一下IP,得到的结果就是你访问互联网的公开IP
IP查询.png
若两个结果如果相同,那么恭喜你,拿到了宝贵的公网IP,全球唯一无人和你共享。
目前,国内联通默认分配公网IP(大部分地区),电信和移动都是NAT。其中电信部分地区可以联系营业厅改成公网IP。
内网穿透
内网穿透解决的就是无公网IP,外网计算机与找到内网计算机并与其通讯的问题。
为什么不能用端口转发?
在路由器中,可以通过配置端口转发,让内网计算机暴露在外网中,实现访问。所以,如果你能拿下ISP的服务器,在NAT中添加端口转发,理论上来说也是可以的……所以……
FRP
内网穿透工具有很多,其中 Frp (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用,它支持 TCP、UDP 协议, 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站,帮你实现 公网 ←→ FRP(服务器) ←→ 家庭内网 的连接,让内网里的设备也可以被公网访问到。
FRP的github地址:https://github.com/fatedier/frp
frp-architecture.png
从官方的架构图中可以看出,FRP的核心就是一台具有公网IP的服务器,我这里采用的是阿里云的云服务器,操作系统为centos。
想要把FRP跑起来是非常简单的。按照对应的服务器和客户端的平台,下载https://github.com/fatedier/frp/releases
微信截图_20200207232732.png
我的目的是将猫盘的地址,通过FRP暴露在公网下,只需要在猫盘,也就是客户端安装FRPC,配置frpc.ini文件;在公网服务器,也就是阿里云服务器端安装FRPS,配置frps.ini。

这里展示一下我的配置文件,配置好这几项,就能够顺利跑起FRP。
服务器端:
frps.png
1、bind_port
FRP的传输端口,用于服务器端和客户端通信。记得在阿里云服务器开启该端口,宝塔面板也要放行该端口。
2、token
tonken相当于连接的密码,很多FRP教程中没有设置这个密码,那这样所有人都能加入你的服务器中,非常不安全,强烈建议配置密码,在frpc中配置相同的密码即可连接成功。
3、vhost_http_port
FRP进行http穿透的http服务端口,在阿里云服务器没有跑网站的情况下,填默认80就行,填别的端口也行,那在访问http的时候就需要加上端口号了。注意,如果阿里云服务器上提前跑了nginx等服务,务必杀掉,它会占用80端口导致FRP无法开启。
4、vhost_https_port
FRP进行https穿透的https服务端口,同上,默认填443就行。
5、dashboard_port
FRP的控制台服务端口,是一个可访问的WEB界面,用于查看FRP工作状态。
6、dashboard_user dashboard_pwd
FRP控制台的登陆账号和密码。

客户端:
frpc.png
客户端的配置相比服务器要麻烦一些
1、server_addr server_port token
server_addr填写服务器的公网IP地址,server_port和token与服务器端的配置一致即可。
2、具体协议应用的配置
可以看到,只需要在配置文件中,加入协议的类型、内网中的本地IP地址,本地端口和准备穿透的公网端口,即可完成配置
SSH使用22端口,内网IP为192.168.1.101,也就是猫盘在路由器下的地址,准备穿透到阿里云服务器的222端口,因为阿里云服务器的22端口用于它本身的SSH连接,故使用222。
http协议同上,只需要填写内网的端口和穿透的公网端口即可。custom_domains填写的是域名

启动服务
完成配置后,将配置文件和frp文件放入服务器目录内,开启服务即可。
cd到frp的路径,输入以下命令:

./frps -c ./frps.ini

在客户端,命令则为:

./frpc -c ./frpc.ini

此时在服务端会看到"start proxy sucess"字样,即连接成功。启动成功后,就能够在SSH中看到每一个连接的日志信息。
本地访问 http://ip:6443 即可看到WEB控制台
201707312300.png

后台启动
虽然现在frp运作起来了,内网穿透也实现了,但这还是不够的。此时如果断开与服务端或者客户端的SSH连接(比如关掉了Xshell)也就中止了frp的运行。

保持frp运行是关键是让服务端的frp和客户端的frp在后台运行,这里提两个方法供参考,一个是使用screen指令,另一个是使用nohup指令。nohup相对简单很多,这里就只介绍nohup了。
服务器端:

nohup ./frps -c ./frps.ini &

客户端:

nohup ./frpc -c ./frpc.ini &

如何关闭后台内网穿透?
输入命令

ps -aux|grep frp| grep -v grep

得到frp服务的id,然后kill掉即可:

kill -9 3600

我来吐槽

*

*