为什么需要内网穿透?
- 如果公司的内网不给提供外网访问,或者没有给分配外网可以访问的IP,我们又需要访问SSH登录内网的服务器,远程桌面、远程文件我们该怎么办?
- 远程桌面使用TeamViewer,但需要访问端也拥有TeamViewer软件,不方便。且TeamViewer不易实现远程文件访问。
- 使用蒲公英相关的拨号软件进行组网,可用,但免费版本网络速度极慢,体验不佳,几乎无法正常使用。
- 使用花生壳软件进行DNS解析,可用,但同第二点所述,免费版本有带宽限制,无法实际使用。
那么上述的场景怎么既简单又高效的实现内网穿透呢?高效的frp是一个不错的选择。
frp的作用
- 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
- 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
- 利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。
frp原理
需要的工具
- vps一台,当然也可以是具有公网IP的实体机。因为frp的原理是利用服务端(vps)进行转发,因而VPS的速度决定你的连接质量,所以可以根据自己的需要选择对应的主机配置。
- 内网服务器一台,或者自己的终端(win、mac)
- 简单的linux基础命令。
内网穿透实现SSH连接
服务端设置
当我们登陆上vps以后首先需要运行如下命令查看处理器的架构,根据架构下载不同版本的frp
arch
查看的结果显示
x86_64
那么我们选择对应的amd64版本下载即可。
- 运行如下命令,根据架构不同,选择相应版本并进行下载
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz
解压
tar -zxvf frp_0.22.0_linux_amd64.tar.gz
文件夹重命名一下,方便查看
cp -r frp_0.22.0_linux_amd64 frp
进入目录以后,查看文件
ls -a
服务端我们只需要关注这三个文件frps相关的文件,frpc相关的是客户端文件,在服务端可以选择删除。
- frps 服务端启动程序
- frps.ini 服务端配置文件
- frps_full.ini 服务端全量配置文件
vim frps.ini
添加如下配置:
[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
- bind_port表示客户端和服务端连接的端口,默认是7000,也可以修改,只要跟客户端的bind_port保持一致就可以。
- dashboard_port是服务端仪表盘的端口,如果使用7500端口,配置完成以后可以通过浏览器访问x.x.x.x:7500查看frp服务的运行信息。
- token是用于客户端跟服务端连接的口令,可以自己自由设置,同样要跟客户端的token保持一致就行。 -** dashboard_user和dashboard_pwd**表示打开仪表板页面登录的用户名和密码,自行设置即可。
编辑保存完成以后,此时我们可以运行一下,执行以下命令运行。
./frps -c frps.ini
看到输出如下表示服务端启动成功。
2020/07/18 16:41:47 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000
2020/07/18 16:41:47 [I] [service.go:172] http service listen on 0.0.0.0:10080
2020/07/18 16:41:47 [I] [service.go:193] https service listen on 0.0.0.0:10443
2020/07/18 16:41:47 [I] [service.go:216] Dashboard listen on 0.0.0.0:7500
2020/07/18 16:41:47 [I] [root.go:210] Start frps success
如果想后台启动的话,就是用nohup启动即可。
nohup ./frps -c frps.ini &
此时访问xx.xx.xx.xx:7500并使用刚才设置的用户名跟密码就可以看到仪表板截面。
客户端设置
内网的服务器上安装同样版本的frp,安装方法通服务端一样。
客户端我们只需要关注这三个文件frps相关的文件,frps相关的是服务端文件,在客户端可以选择删除。
- frpc 客户端启动程序
- frpc.ini 客户端配置文件
- frpc_full.ini 客户端全量配置文件
vim frpc.ini
添加如下配置:
[common]
server_addr = 49.233.169.171
server_port = 7000
token = 12345678
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 8001
- server_addr就是你公网服务器的IP。
- server_port服务端设置的端口。
- token跟服务端设置的token保持一致即可。
- type为代理的类型,SSH服务设置为tcp类型。
- local_ip为本地IP。
- local_port为内网客户端设置的SSH端口。
- remote_port为内网提供给外网访问的服务端口。
启动
nohup ./frpc -c frpc.ini &
看到输出如下表示服务端启动成功。
2020/07/18 21:59:55 [I] [service.go:205] login to server success, get run id [143bcc4bb2f3c383], server udp port [0]
2020/07/18 21:59:55 [I] [proxy_manager.go:136] [143bcc4bb2f3c383] proxy added: [ssh nginx-for-ali]
2020/07/18 21:59:55 [I] [control.go:143] [ssh] start proxy success
2020/07/18 21:59:55 [I] [control.go:143] [nginx-for-ali] start proxy success
这样我就可以通过服务器公网IP和8001端口来连接我的内网机器了(SSH)。
ssh -p remote_port username@server_addr
- remote_port使用的是内网机器设置的端口。
- username使用的是内网机器的用户名。
- server_addr使用的是外网机器IP。
登录成功之后我就可以正常使用SSH在外网的机器上愉快的操作内网机器的服务了。
内网穿透实现web服务
服务端设置
vim frps.ini
添加如下配置:
[common]
bind_port = 7000
token = 12345678
vhost_http_port = 10080
vhost_https_port = 10443
- bind_port表示客户端和服务端连接的端口,默认是7000,也可以修改,只要跟客户端的bind_port保持一致就可以。
- token跟服务端设置的token保持一致即可。 -** vhost_http_port和vhost_https_port**用于服务端主机访问的端口,需要再vps安全组里添加此端口才行。
客户端端设置
vim frpc.ini
添加如下配置:
[common]
server_addr = xx.xx.xx.xx
server_port = 7000
[web]
type = http
local_port = 9003
custom_domains = xx.xx.xx
- server_addr使用的是外网机器IP。
- server_port服务端设置的端口。
- local_port为本地客户端启动的web服务。
- type为代理的类型,web服务设置为http类型。
- custom_domains为外网VPS绑定的访问域名或者机器的IP。
启动方式跟穿透SSH服务一样,同样启动成功之后,使用外网IP或者域名:vhost_http_port,即custom_domains:10080,便可以愉快的访问自己内网启动的web服务了。
我内网启动的web服务是基于mac客户端的,windows也的配置跟操作大同小异,稍有区别,这里就不一一演示了。
小结
- 通过自建frp可以安全地完成内网穿透,配置简单且实用。
- 整体的速度与vps、内网机器相关。
- 流量都要经过vps转发,如果需要大型的传输计算结果的话,可以适当提升自己的vps性能跟内网服务器的性能。