内网穿透,使用frp就够了

9,111 阅读6分钟

为什么需要内网穿透?

  • 如果公司的内网不给提供外网访问,或者没有给分配外网可以访问的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版本下载即可。

  1. 运行如下命令,根据架构不同,选择相应版本并进行下载
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_userdashboard_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_portvhost_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性能跟内网服务器的性能。

images.jpeg