远程访问内网的终极教程
需求
本教程可实现如下需求:
- 在家里临时访问办公室的电脑,或反之
- 在家里用自己的设备搭建一个小服务器
- 让自己或者别人能访问我们电脑的文件
如果不需要看前置的内容,只想看最佳方案,请拉至文章末尾的cloudflare部分
前置概念
[1]当我们在浏览器里面输入一个网址访问时都发生了什么?
域名解析
比如我的博客网址blog.infrost.site,在这里blog.infrost.site
是个称之为[域名]的东西,当在浏览器输入它的时候,浏览器会向根服务器发送这个网址的名称,获取这个网址指定的具体的服务器门牌号(IP地址)访问。具体的:
域名是互联网中用来标识一个特定网站或资源的地址,它是由一系列字符组成的,通常包括字母、数字和符号。域名的主要功能是将难以记忆的IP地址(例如:192.168.1.1)转换为易于理解和记忆的名称。
1 | 域名通常由几个部分组成,结构为: |
[2]有限的ip地址
一个邮局系统:网络地址转换(NAT)
域名是可以有无限个的,但服务器的门牌号(IP地址)只能有一个地址。如果所有的房子都要用这个地址,就会出现问题,因为地址不够用。IP地址也是一样,有一个有限的数量,不够每一台电脑都使用。
IPv4地址由四组数字组成,每组数字从0到255。例如,像这样的地址:192.168.1.1。每组数字能有256种可能(从0到255),所以总共有256的4次方(约42亿个)。但因为有些地址是特别的(比如用于广播或网络标识),所以可用的地址实际上少于42亿个。
于是,我们在网络上设立了很多个邮局。邮局也是一个服务器,拥有一个门牌号。邮差会给邮局管辖的区域编号a,b,c,d……(也就是分配了内网的ip地址)。这下就好办了,因为我们内网的编号是可以重复的。
为什么编号可以重复?
区域独立性:每个邮局只负责自己管辖的区域。就像每个邮局处理的信件只限于它所负责的家庭一样,邮局内的区域编号(例如a、b、c等)只在该邮局内部有效。这意味着,尽管在不同的邮局中可能有家庭使用相同的编号(比如两个邮局都有一个编号为“a”的家庭),但由于它们在不同的邮局内,这样的编号不会引起混淆。
封闭系统:每个邮局的运作是封闭的。内部的信件和编号在外部是不可见的,外界的邮差只知道如何将信件送到特定的邮局,而不需要关心邮局内部的具体编号。因此,即使多个邮局有相同的内部编号,它们之间不会发生冲突。
我们可以用一幅图来展示这个原理:
如何实现邮局之间的通信?
这涉及到“内网穿透”的概念,还是拿上面的图举例。
想象一下,邮局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组网
通常可以使用Tailscale
和Zerotier
方案进行。以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.