前言

什么是内网穿透

百度搜索“内网穿透”你可以得到很多标准答案,但如果你初次接触的话,肯定会看的一头雾水。说白了,现在我国的IPV4公网地址资源池已经耗尽,你家里的联通/移动/电信等宽带基本都在一个比较大的局域网里面,公用一个公网IPV4地址。

那么你的电脑无论是连接WIFI上网还是用网线上网,都是属于这个大的局域网里边的,外网无法直接访问到你的电脑,内网穿透可以让你直接在外网访问你家里的电脑或其他设备。

如果你说你有公网IP的话,那你就不用看这篇文章了,以后我会出DDNS的教程;如果你说现在都普及了IPV6,并且你已经用上了的话,那也不用看这篇文章了,以后我也会出IPV6的教程。

内网穿透可以做什么

那我们在什么情形下要用到内网穿透呢,我来简单举几个内网穿透的应用场景:

  1. 在公司要用到家里电脑,或者在家里需要用到公司的电脑临时办公;
  2. 你在家里搭建了一个网站、一个应用或者游戏,需要对外发布,奈何高配置的服务器太贵。

如果你说仅仅想远程控制电脑,收费的就有TeamViewer、Splashtop、向日葵等。但我这里不建议,这些我都测试过,除了部署简单外,在网络速度、易用性等方面都不行,而且收费那么贵。

怎么实现内网穿透

目前来说比较流行的有Frp、Ngrok,以及最近刚出的Nps等,本文主要介绍Frp这种方式,也是最好用的方式。

Frp服务端搭建

服务器购置

建议你去阿里云选个香港轻量应用服务器,峰值带宽可以达到30,而且是CN2-GIA线路, 选个最低配的就行,毕竟我们内网穿透只在乎带宽不在乎配置,内网穿透的速度是取服务器带宽、你家宽带上行速度的最低值。

为什么不用淘宝或者其他品牌的云服务器?因为国内几个厂商,阿里云的服务器访问最快、最稳定,淘宝就不必说了。

环境搭建

服务器系统选择CentOS 7.X版本的就行,其他的没什么要求。

FRP服务端部署

SSH连到你的服务器

这个不用我说了吧,我平时比较喜欢用Xshell或者Putty连接,当然你用阿里云轻量应用服务器管理控制台的远程连接功能也可以。

安装FRP

命令窗口依次运行:

wget https://raw.githubusercontent.com/MvsCode/frp-onekey/master/install-frps.sh -O ./install-frps.sh
chmod 700 ./install-frps.sh
./install-frps.sh install

参数选择

安装过程中会让你手动选择一些参数

Please input frps bind_port [1-65535](Default Server Port: 5443):
#输入frp提供服务的端口,用于服务器端和客户端通信,按Enter键表示默认5443,否则手动输入新端口
Please input frps dashboard_port [1-65535](Default dashboard_port: 6443):
#输入frp的控制台服务端口,用于查看frp工作状态,按Enter键表示默认6443,否则手动输入新端口
Please input frps vhost_http_port [1-65535](Default vhost_http_port: 80):
#输入frp进行http穿透的http服务端口,按Enter键表示默认80,否则手动输入新端口,一般不建议默认80
Please input frps vhost_https_port [1-65535](Default vhost_https_port: 443):
#输入frp进行https穿透的https服务端口,按Enter键表示默认443,否则手动输入新端口
Please input privilege_token (Default: WEWLRgwRjIJVPx2kuqzkGnvuftPLQniq):
#输入frp服务器和客户端通信的密码,默认是随机生成的,按Enter键表示按默认来,否则手动输入。frpc客户端需要这个接头暗号
Please input frps max_pool_count [1-200](Default max_pool_count: 50):
#设置每个代理可以创建的连接池上限,默认50
Please select log_level #####
1: info
2: warn
3: error
4: debug
#####################################################
Enter your choice (1, 2, 3, 4 or exit. default [1]):
#设置日志等级,4个选项,默认是info
Please input frps log_max_days [1-30]
(Default log_max_days: 3 day):
#设置日志保留天数,范围是1到30天,默认保留3天。
##### Please select log_file ########################
1: enable
2: disable
#####################################################
Enter your choice (1, 2 or exit. default [1]):
设置是否开启日志记录,默认开启,开启后日志等级及保留天数生效,否则等级和保留天数无效

以上如果你不知道怎么设置,直接回车就行,但密码最好自己设置下。

安装完成

安装完成后会给出一些信息,建议保存在记事本上后面需要用到。

Congratulations, frps install completed!
==============================================
You Server IP : 192.2x.x.x
Bind port : 5443
KCP support : true
vhost http port : 80
vhost https port : 443
Dashboard port : 6443
token : FvHqtRfxxxxxxxxx
tcp_mux : true
Max Pool count : 180
Log level : info
Log max days : 30
Log file : enable
==============================================
frps Dashboard : http:// 192.2x.x.x:6443/
Dashboard user : zmrbk.com
Dashboard password : zmrbk.com
==============================================

frps status manage :frps {start|stop|restart|status|config|version}

到此frp的服务器配置就已经说完了,你可以打开http://192.2x.x.x:6443,来看看frp的网页监控面板。

端口开放

网上有些教程并没有说到这一部分,很多人发现无法使用,以上面为例,实际上是需要你在服务器防火墙上放开5443、6443这两个端口。如果你是买的阿里云,只需要在轻量应用服务器上的防火墙设置功能中,设置放开即可,如果你不是,就需要在命令窗口中执行以下:

firewall-cmd --state
# 首先查看firewall服务状态,如果提示not runing,后面的就不用看了
firewall-cmd --permanent --add-port=5443/tcp
# 开放5443的tcp端口,6443同理,改下数字就行
firewall-cmd --permanent --add-port=5443/udp
# 开放5443的udp端口,6443同理,改下数字就行
firewall-cmd --reload
# 修改完端口后一定记得执行这个命令重启防火墙,不然不生效

更新及卸载

./install-frps.sh update
# 更新FRP服务端
./install-frps.sh uninstall
# 卸载FRP服务端

FRP客户端部署

域名购买

如果有域名的话,你每次直接输入www.xxxx.com:端口号(端口号3389的话就不用输)就可以远程控制电脑了,别人也可以直接通过域名访问你在家搭建的网站,而且现在的域名也花不了多少钱。

如果你只是有远程桌面的需求,并且记忆力好,能记得住服务器IP地址的话,就跳过这节吧。

买好域名后记得做域名解析,百度搜索下域名怎么解析,解析到你的服务器IP地址,建议做“www”、“@”和“*”三个。

frp客户端设置

如果你路由器支持frp客户端设置的话,就直接在路由器上做,毕竟路由器是家里一直在线的设备,如果你的路由器不支持,那就做到电脑上吧。

下载frp的客户端

https://file.kskxs.com/?dir=frp,找到对应版本的frp下载,解压到你盘里某个位置

修改配置文件

找到frpc.ini,用记事本或Notepad++打开:

[common]
server_addr = 服务端IP或者域名
server_port = 你刚才在服务端设置的端口(5443)
privilege_token = 你刚才在服务端设置的密码

上面是服务端连接信息,下面举例说明常用的tcp、http、https映射:

[Web]   # 中括号中内容为映射名称,用以快速寻找区分众多的映射服务,每一个映射都要取一个名字,只支持英文,推荐命名形式:姓名简称_设备_服务
type = tcp # 类型,因为你映射的是ssh端口,所以选择tcp,如果你要映射http服务或者http服务,那就填写对应的http或者https
local_ip = 127.0.0.1 # 为你映射局域网内设备的IP地址,假设127.0.0.1代表的是我电脑的内网ip地址
local_port = 8080 # 本地端口号,假设中8080端口为我电脑的远程控制端口(一般默认为3389,为了安全建议改一下);
remote_port = 8080 # 远端端口号,也就是映射成功之后你所用的端口号,可以自定义,端口号可选择0到65535;
custom_domains = XXX.XXX.XXX # 你的IP地址或者域名

以上代表我在公司电脑上打开远程桌面,输入XXX.XXX.XXX:8080后就可以远程控制我家电脑。再举个例子:

[Web]   # 中括号中内容为映射名称,用以快速寻找区分众多的映射服务,每一个映射都要取一个名字,只支持英文,推荐命名形式:姓名简称_设备_服务
type = http # 类型,因为你映射的是ssh端口,所以选择tcp,如果你要映射http服务或者http服务,那就填写对应的http或者https
local_ip = 127.0.0.1 # 为你映射局域网内设备的IP地址,假设127.0.0.1代表的是我电脑的内网ip地址
local_port = 8080 # 本地端口号,假设中8080端口为我电脑的远程控制端口;
remote_port = 80 # 远端端口号,也就是映射成功之后你所用的端口号,可以自定义,端口号可选择0到65535;
custom_domains = XXX.XXX.XXX # 你的IP地址或者域名

以上代表我在公司电脑上打开浏览器,输入XXX.XXX.XXX后就可以访问在我家电脑上搭建的端口为8080的网站。

就这样,把你想要的一条条往下加,保存即可。

启动

Windows cmd里边进入frp客户端相应目录,输入以下命令启动frps.exe即可

frpc.exe

成功则看到如下信息(类似即可):

D:\frp\frp_0.16.1_windows_amd64>frpc.exe
2018/04/25 14:31:00 [I] [proxy_manager.go:298] proxy removed: []
2018/04/25 14:31:00 [I] [proxy_manager.go:308] proxy added: [ssh]
2018/04/25 14:31:00 [I] [proxy_manager.go:331] visitor removed: []
2018/04/25 14:31:00 [I] [proxy_manager.go:340] visitor added: []
2018/04/25 14:31:01 [I] [control.go:240] [f30f90361df8ce96] login to server success, get run id [f30f90361df8ce96], server udp port [0]
2018/04/25 14:31:01 [I] [control.go:165] [f30f90361df8ce96] [ssh] start proxy success

访问frp监控面板

访问http://192.2x.x.x:6443,点Proxies,即可看到上述各个映射,然后就开始浪吧!

注意事项

如果失败,看看你路由器防火墙和服务器的防火墙相应端口有没有打开,你添加的相应映射的remote_port端口,也要在防火墙打开,一定注意!