远程访问内网的终极教程

Kevin Tsang Lv2

需求

本教程可实现如下需求:

  • 在家里临时访问办公室的电脑,或反之
  • 在家里用自己的设备搭建一个小服务器
  • 让自己或者别人能访问我们电脑的文件

如果不需要看前置的内容,只想看最佳方案,请拉至文章末尾的cloudflare部分

前置概念

[1]当我们在浏览器里面输入一个网址访问时都发生了什么?

域名解析

比如我的博客网址blog.infrost.site,在这里blog.infrost.site是个称之为[域名]的东西,当在浏览器输入它的时候,浏览器会向根服务器发送这个网址的名称,获取这个网址指定的具体的服务器门牌号(IP地址)访问。具体的:

域名是互联网中用来标识一个特定网站或资源的地址,它是由一系列字符组成的,通常包括字母、数字和符号。域名的主要功能是将难以记忆的IP地址(例如:192.168.1.1)转换为易于理解和记忆的名称。

1
2
3
4
5
6
7
域名通常由几个部分组成,结构为:

1. 顶级域(TLD):这是域名的最后一部分,[最常见的是.com]、.org、.net、.site等。
2. 二级域:这是顶级域前面的部分,通常是组织或公司的名称,如infrost。
3. 子域:这是位于二级域前面的部分,通常用于区分不同的服务或部门,如例子中的blog。

域名的注册和管理是通过域名注册机构(如GoDaddy、Namecheap、国内有万网等)进行的。

[2]有限的ip地址

一个邮局系统:网络地址转换(NAT)

域名是可以有无限个的,但服务器的门牌号(IP地址)只能有一个地址。如果所有的房子都要用这个地址,就会出现问题,因为地址不够用。IP地址也是一样,有一个有限的数量,不够每一台电脑都使用。

IPv4地址由四组数字组成,每组数字从0到255。例如,像这样的地址:192.168.1.1。每组数字能有256种可能(从0到255),所以总共有256的4次方(约42亿个)。但因为有些地址是特别的(比如用于广播或网络标识),所以可用的地址实际上少于42亿个。

于是,我们在网络上设立了很多个邮局。邮局也是一个服务器,拥有一个门牌号。邮差会给邮局管辖的区域编号a,b,c,d……(也就是分配了内网的ip地址)。这下就好办了,因为我们内网的编号是可以重复的。

为什么编号可以重复?

  1. 区域独立性:每个邮局只负责自己管辖的区域。就像每个邮局处理的信件只限于它所负责的家庭一样,邮局内的区域编号(例如a、b、c等)只在该邮局内部有效。这意味着,尽管在不同的邮局中可能有家庭使用相同的编号(比如两个邮局都有一个编号为“a”的家庭),但由于它们在不同的邮局内,这样的编号不会引起混淆。

  2. 封闭系统:每个邮局的运作是封闭的。内部的信件和编号在外部是不可见的,外界的邮差只知道如何将信件送到特定的邮局,而不需要关心邮局内部的具体编号。因此,即使多个邮局有相同的内部编号,它们之间不会发生冲突。

我们可以用一幅图来展示这个原理:

互联网邮局图

如何实现邮局之间的通信?

这涉及到“内网穿透”的概念,还是拿上面的图举例。

想象一下,邮局1和邮局2之间有一个大型的邮递系统(即互联网)。每个邮局都有自己的管理流程,但两者之间的沟通需要一些特定的方式。假设设备5想和设备1进行交流,但是他们处在不同的邮局里,无法知道对方的情况。

于是,设备5会向上找小邮局2小邮局2向上找大邮局设备5会在这个过程中建立与大邮局的服务器连接,并声明:我要找设备1,并带上了这个连接路径。

同样的, 设备1会向上找小邮局1小邮局1向上找大邮局设备1会在这个过程中建立与大邮局的服务器连接,并声明:我要找设备5,并带上了这个连接路径。

这两个声明让大邮局知道了这两个人需要互相连接,并且大邮局同时管理了小邮局1小邮局2,于是大邮局让邮差通过上面的路径使得这两个设备能够交流,称为隧道。这个隧道实际上是一个通信路径,允许这两个设备通过大邮局进行数据交换。

内网穿透的技术实现

在实际网络中,内网穿透通常涉及一些技术手段,比如:

  • 端口转发:可以设置特定的端口,将请求定向到内部设备。例如邮局2的ip为192.168.123.2,他设立一个规则:凡是收到要访问192.168.123.2:8000的,一律转交给设备5,这里的8000就是端口,这个行为就叫做端口转发
  • VPN(虚拟专用网络):建立一种加密的连接,也就是把几个设备通过一定的方法放在同一个虚拟邮局下。允许设备通过虚拟邮局来互相访问资源。
  • 中继服务:使用一个中间服务(如云服务器)来转发请求和响应。

内网穿透的几种方案

对应的,有如下几种方案来实现

  • A. 家里网络支持公网ip+DDNS【端口转发】
  • B. zerotier等虚拟VPN组网
  • C. Frp,Cloudflared等方案内网穿透 【中继服务】

A方案:DDNS

这个方案本身就需要一个公网ip,也就是说,本身你就应该有个在公网上的大邮局的门牌号。(对于公网ip
,部分地区可以打电话给运营商要求给公网IP,并把家庭光猫改成桥接到路由器后用PPOE拨号上网,再配置DDNS服务,由于篇幅有限,且该方法并不是一个通用的可行方案,且较为麻烦,故只简要介绍

通常家庭网络给你的邮局门牌号是会变动的(因为资源有限,当你不用的时候,他们会回收这个门牌号)。

因此,你需要一个域名,并且通过一系列手段实时更新你的ip地址,称之为DDNS(Dynamic DNS, 动态域名解析)从而让别人可以通过固定的域名正确地,动态地找到你变动的门牌号。

找到门牌号之后,设立端口转发,让你的邮局(也就是路由器)将特定的请求直接发送给需要接受请求的设备即可。

B方案:虚拟VPN组网

通常可以使用TailscaleZerotier方案进行。以Zerotier为例,只需要在A,B两个机器上分别安装Zerotier的程序即可建立一个虚拟局域网使用。

ZeroTier的设备互联在同一个大邮局之下的实现效果较好,但是如果双方网络甚至不在同一大邮局(即对应公网ip不一样)的情况下,Zerotier可能只能使用中继服务进行设备通信,由于默认的免费的ZeroTier中继服务在国外,这种情况下访问速度极慢,几乎不可用。

由于ZeroTier是开源的,确实可以按照他们的方法来自建Moon服务器甚至Plantet服务器在国内建设一个完全脱离Zerotier官方服务的方案,速度和可控性方面都是很棒的,但是该方案仍然需要一个拥有公网ip的服务器,成本较高。

而且虚拟VPN组网的另一个缺点是客户端和服务端双方都要安装软件,在某些情况下不够优雅

C方案:中继服务方案

Frp内网穿透
自建FRP(Fast Reverse Proxy)的话,也需要至少一个公网 IP 地址,该方案客户端不需要安装软件,但是配置起来也是很麻烦的,本文不做过多介绍。

第三方的免费Frp服务有Sakura Frp(需要1元的实名认证费用,且需要备案的域名)等。有的不支持自定义域名,付费的网上和闲鱼上一抓一大把。

cloudflared

Cloudflare Tunnel穿透方案
这个方案的使用体验绝对是最好的,免费,而且速度快。但是有几个别的网上没讲到的点需要注意,由于篇幅有限,具体到每一步内容的操作网上都很详细了:

  • cloudflare需要一个域名,可以在万网上购买了并交由cloudflare进行dns解析
  • 拥有域名后,进入Zero Trust 进行开通免费的服务
    • 现在不需要支持外币的信用卡了,比较推荐注册一个国内的Paypal,并绑定国内的银联储蓄卡,支付页面使用Paypal进行验证即可,不扣钱。
  • 验证后访问Zero Trust - Networks - Tunnels页面,按照配置页面指引,在你需要提供服务的机器上安装Cloudflared的服务端程序,创建Tunnel即可
    • 注:不推荐使用Docker安装,可能会出现问题,如Windows平台下载msi安装程序安装即可。
  • 最简单的玩法,下载一个Cute HTTP File Sever (GUI),就可以通过域名访问笔记本上的文件了。

其他的注意事项:
- Cloudflare的免费服务在中国大陆默认会选择美国西部的服务器,如果需要实时操作的(如远程桌面)这一类服务建议给电脑增加一个前置代理,来实现Cloudflare Tunnel加速。
- 最简单的方式是使用clash verge这类的应用,然后开启TUN模式接管系统流量,一般来说规则会自动将cloudflare.exe下的两个连接(region1.v2.argotunnel.com:7844, region2.v2.argotunnel.com:7844)经过代理(建议选择香港的服务器)。
- 【非常重要,不然会出bug】注意TUN模式下基于NAT的网络共享仍然可用,但如果需要开热点(windows自带的ics服务),电脑需要进入设置-网络和Internet-移动热点开启热点,然后进入控制面板\网络和 Internet\网络连接,这时候会看到一个以Local Area Connection开头的新网卡,记住这个名字。然后进入tun模式添加的网卡,右键属性,进入共享选项卡,开启共享,同时指定网卡为上面新添加的网卡即可。
- Cloudflare的自带的RDP服务仍然需要在客户端机器上安装cloudflared这个软件,然后远程的时候先要执行

1
cloudflared.exe access rdp --hostname your.domain.com --url localhost:3000

该操作会监听系统的RDP端口,然后直接在mstsc里输入locahost:3000即可访问
- 因此,这个方案仍然不够优雅,可以考虑安装docker desktop然后使用next terminal这个项目,这样客户端机器就可以直接浏览器使用web界面远程目标机器了,而不需要客户端也安装cloudflare

  • Title: 远程访问内网的终极教程
  • Author: Kevin Tsang
  • Created at : 2024-08-12 00:00:00
  • Updated at : 2024-10-07 10:24:01
  • Link: https://blog.infrost.site/2024/08/12/remote_access_final_tutorial/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
远程访问内网的终极教程