网络还能怎么玩(四):内网穿透

我们将通过接下来的两个章节实现外网访问我们的内网服务。

内网穿透

一种可以让互联网设备访问到我们局域网设备的方式。

为什么需要内网穿透?

由于我们国内的运营商在为我们安装宽带之后,并没有为我们分配公网ip(指ipv4),因此我们局域网内的设备是无法直接在互联网上被找到的,也就是说我们部署的服务在我们家以外的地方是无法访问的。
当然这不是运营商的问题,ipv4的数量本身就不足以分配给每一个人。虽然现在ipv6在逐渐普及,但ipv4仍然作为主流的网络地址。

VPS与frp

虽然外界找不到我们的局域网设备,但我们的局域网设备是可以主动与有公网ip地址的设备建立连接的。
那么,只要我们把请求发送给有公网ip的设备,让它转发给已经与之相连的局域网设备,我们就可以间接访问到我们的局域网设备。
33746eb0e9a043415e9a734a729b28f7.png

所以,我们现在还需要两样东西:

  1. 一台拥有公网ip的主机(VPS)。
  2. 局域网设备与该主机相连的方式。

VPS

由于我们只要求公网主机进行转发,不需要它做其他事情。因此公网主机不需要具有很强的性能,但需要有足够的带宽

多少算足够呢?
在Nas服务器的应用场景中,4K视频播放应该是最需要大带宽支持的一个场景。

[!文心一言] 4K视频需要多大的带宽?
如果4K视频没有经过压缩,完全无压缩一秒钟需要3840×2160×10×3×60约为1.74GB的数据,即传输一秒钟无压缩4K视频需要约14Gbps的带宽。但实际上一部电影等视频产生的数据量非常巨大,完全无压缩难以实现。

而在线播放4K视频时,其下载速度约为1.5M/s ~ 5M/s,对应的带宽约为12 ~ 40Mbps。这是因为4K内容在传输过程中通常会经过压缩,H.265标准的压缩比为350~1000。

就是说我们至少需要12Mbps的带宽,才能满足我们大部分的服务的外网访问需求。

这里我选用的是阿里云香港服务器,三大运营商均可直连,最低配置2核1G版本即可。
也许不是能找到的最便宜的VPS,但一定是最稳定的(阿里云打钱!)。
68f5b302ab9f3051feb1541acbaa46c8.png
选用香港的服务器有几个好处:

  1. 不用备案。备案过程非常繁琐且用途受限制。
  2. 香港服务器普遍带宽很大,以我们的用途来说性价比很高。
  3. 便宜,便宜,还是便宜。

延迟方面,杭州移动直接ping本站平均延迟38ms,在公司用电信ping在28ms左右。
3800.png

frp

frp中文文档

公网主机配置

以linux服务器实例为例:

1
2
3
4
5
6
7
8
sudo mkdir app // 创建一个工作区,保证服务器干净
cd app

sudo wget https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz // 下载frp文件包,最新:https://github.com/fatedier/frp/releases
sudo tar -zxvf frp_0.53.2_linux_amd64.tar.gz // 解压

cd frp_0.53.2_linux_amd64 // 进入解压出的文件夹
vi frps.toml // 编辑服务端文件,旧版本文件为frps.ini,配置一样。

文件内容如下:

1
2
3
4
5
// 键入i进行编辑
[common]
bind_port = 8080 // 自己定义一个被局域网主机连接的端口
token = XXXXXXXX // 连接密码
// 键入:wq写入并退出

接下来运行如下代码就可启动服务端了:

1
./frps -c ./frps.toml

但此时,我们如果关闭终端窗口的话,frp服务也会停止,因此,我们需要做一个服务持久化,让服务器每次开机的时候都自动运行frp服务。

服务持久化

常用的systemctl已经有很多教程了,我当初参考的是这一篇还有另外一篇
而今天,我要介绍一个更加简单无脑的程序:screen

首先安装它:

1
2
3
4
5
// CentOs
sudo yum install screen

// Ubuntu
sudo apt install screen

然后打开一个窗口,运行我们刚才启动frp服务的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
screen // 会跳进一个新窗口

cd /app/frp_0.53.2_linux_amd64 // 进入我们的frp工作区

./frps -c ./frps.toml // 启动服务

按下 Ctrl+a d键离开这个窗口

screen -ls //显示已创建的screen终端
There is a screen on:
11057.pts-0.iZj6cc10c1dnguk5hnd5loZ (Detached)
1 Socket in /var/run/screen/S-admin.

screen -r 11057 //连接 screen_id 为 11057 的 screen终端

到这里,公网主机的配置就完成了。

局域网主机配置

与公网主机的流程一样,下载同样的包,解压,只是这次配置和运行的是frpc.toml文件。

但我们并不需要这样的流程,因为我们在上一届已经创建了一个软路由虚拟机,可以很简单的完成局域网配置。
访问我们的软路由后台,直接下载一个frp客户端:
openwrtFrp.png
先配置与服务器的连接:
frp.png
然后配置我们想要访问的内网服务,暂时我们只有Nas面板一个服务,那就来为他配置一个外网访问方式。
比如说,我们Nas面板的内网地址为100.100.1.1:80,那么我们就可以这样配置:
frpUnraid.png
添加后保存并应用,我们就将内网的地址映射到了主机的8080端口,访问 主机ip:8080 就可以见到Nas的面板了。