内网穿透

本文介绍内网穿透的几种实践方法

背景

之前有一个需求是这样:一个网络,其不是能够使用vpn直连接的内网,也就是说那个网络只是一个路由器连着里面一堆的机器,即一个正常的办公用的网络。我需要操作这个路由器中的某一台电脑,在上面部署环境测试代码等等操作
开始的解决方法:teamviewer
不足:实在太慢,而且不定时断开连接,无法有效快速地进行操作

于是在网上搜索了有什么更好的方案,定位到两个东西:frp && 花生壳
若要再具体地说,两者在应用上有不同之处,比如:花生壳主要应用于个人小站能挂在自己的内网电脑上,对公网提供web访问服务;frp则更强大一点,能支持内网的web服务访问,以及ssh访问,其他功能

frp

什么是frp

frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。

准备原料

1
2
3
4
5
一个公网ip (可通过购买云服务器获得)
一台内网机器

#可有可无
一个域名 (当你想直接使用域名对外提供服务,则需要这一项,万网上可购)

部署frp

1
2
3
4
项目地址:https://github.com/fatedier/frp

#项目下载地址
release地址:https://github.com/fatedier/frp/releases

frp分成两个可执行文件:server端 和 client端,所以简单地来说:我们只需要分别在我们的机器上下载这两个东西,设定好相关配置,然后运行起来即可

1
2
3
将 frps 及 frps.ini 放到具有公网 IP 的机器上

将 frpc 及 frpc.ini 放到处于内网环境的机器上

注:mac版本的包是带有 darwin_amd64 字样的,其他根据你的系统版本来选择,推荐选择v0.20.0 版本

配置并启动frp

下载完frp包,解压完的文件如下:

1
2
3
frpc	frpc_full.ini	frpc.ini
frps frps_full.ini frps.ini
LICENSE

其中frpc_full.ini 和 frps_full.ini 是全量的配置,你可以根据你需要的功能配置,本文只讨论ssh和web服务的相关配置

在公网机器(frps服务端)的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[common]
bind_port = 7000
#提供服务的http端口
vhost_http_port = 8080

#web管理页面的port
dashboard_addr = 0.0.0.0
dashboard_port = 7500
#web管理页面登录的账号密码
dashboard_user = admin
dashboard_pwd = admin

#不认证时差,如果你在国外的机器,时间不同会导致连接失败,设定这项可以解决时差问题
authentication_timeout = 0

log_level = debug

执行如下命令

1
nohup ./frps -c frps.ini &

服务端设定好了并启动,那么客户端才是我们真正要部署业务的地方,随我们怎么折腾了

在内网机器(frpc 客户端)上配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[common]
#公网ip/port 确保没有被占用
server_addr = 45.32.28.112
server_port = 7000

#这是用于管理员可以使用客户端的一些命令如:./frpc status/reload/stop 的配置
admin_addr = 0.0.0.0
admin_port = 7400

log_level = debug

#ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

[web02]
type = http
local_ip = 127.0.0.1
#这是内网机器对外提供服务的端口
local_port = 5100
#若没有域名则此项省略
custom_domains = www.tingyun.ink

如果你配置了以上admin_addr / admin_port,可以使用以下查看客户端状态:

1
2
3
4
5
6
7
8
9
1./frpc status
Proxy Status...
TCP
Name Status LocalAddr Plugin RemoteAddr Error
ssh running 127.0.0.1:22 45.32.28.112:6000

HTTP
Name Status LocalAddr Plugin RemoteAddr Error
web02 running 127.0.0.1:5100 www.tingyun.ink:8080

测试使用
登录ssh

图一

提供web服务

图二

到此,frp服务已经正常使用

花生壳

客户端配置

由于花生壳是一个商业化的东西,其他东西不多作了解,单说说其中的:内网穿透 服务
登录花生壳官网,直接进入这个页面:https://www.oray.com/activity/140902/?icn=oray_140902&ici=hsk_home-grid
需要花6块钱购买体验版的内网穿透服务,之后你在可以在你的有公网ip的服务器上下载它的客户端

https://hsk.oray.com/download/ 中选择对应的版本下载

1
2
3
4
5
#ubuntu
dpkg -i phddns_3.0_x86_64.deb

#centos
rpm -ivh phddns-3.0.2.x86_64.rpm

安装完成后启动

1
phddns start

提示启动success即可,查看当前状态

1
phddns status

显示如下图即可
图二

花生壳页面管理

之后,我们拷贝上图中的SN码作为账号 , 进如这个网页:http://b.oray.com ,使用默认密码:admin 登录

点击左侧栏的内网穿透,然后再点击右边的 添加映射
花生壳给你自动分配了一个免费的域名,你只需要选择:

1
2
3
你客户端机器的公网ip(路由器ip)

机器提供服务的端口

原理:
  这貌似是公网版的内网穿透,其仅仅作了一层dns,因为我使用的那台服务器有一个公网地址,还有一个内网地址,这里我是直接使用 公网ip+port + 花生壳的域名 来访问到内部的服务

在网上貌似查到了内网版的使用教程,其原理大致如下:
  在内网中启动花生壳的客户端,配置好域名(花生壳分配给你的),本机的内网ip + port , 然后在外部就能通过域名访问了
  其实原理和frp类似,只不过花生壳自己作为了一个服务器端,我们的所有请求先通过花生壳的域名 –》 花生壳解析这个域名,找到客户端,且两者之间已经建立了一条通道 –》 对域名的请求会被转发到客户端上,客户端应答,返回消息给服务端,服务端最后再展现在这个域名上

End

在网上还看见很多其他的解决方案,如:ngrok , 直接配置路由器端口转发 , 等后续自己要建站的时候再去研究吧.
推荐使用frp,最好你在国内的云服务商购买了服务器,不推荐花生壳.