什么是内网穿透
内网,就是在公司或者家庭内部,建立的局域网络或者是办公网络,可以实现多台电脑之间的资源共享,包括设备、资料、数据等。而外网则是通过一个网关与其它的网络系统连接,相对于内网而言,这种网络系统称之为外部网络,常见的就是我们日常使用的互联网。
一般而言,在没有固定公网IP的情况下,外网设备无法直接访问内网设备。而内网穿透技术,顾名思义就是能让外网的设备找到处于内网的设备,从而实现数据通信。
方案对比
实现内网穿透技术的方案有多种,下面介绍我实践过的一些方案。我先直接将使用体验感排序(从上到下,体验感从高到低),可以根据自身情况选择:
- DDNS+公网IP:最佳选择,家庭网络必须有公网IP
- FRP:适用多种终端,必须有公网服务器
- 向日葵:免费、小白,国内访问个人体验觉得还可以
- Zerotier:免费,有些时候访问速度尚可
- TeamViewer:免费、小白,老牌正常可用,国内速度有时不佳
方案实施
DDNS+公网IP
如果确定家庭网络里有公网IP,可以使用DDNS的方式,这种方式速度最快、最稳定。
公网IP
家庭宽带里的公网IP,一般是指动态公网IP(并不是固定的哦,也会变的)。目前只有电信或联通的宽带用户可以打客服电话申请开通公网IP,移动宽带基本上申请不了。
DDNS
DDNS,是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。
DDNS服务商也有多家,有免费和少量付费的方法,我使用过两种:
- 花生壳:下载花生壳客户端,注册成功会赠送一个免费的二级域名 https://hsk.oray.com/。
另外,也能在他家购买一个域名(.top的几块钱一年),然后提供有DDNS功能。 - DNSPOD:在任意域名商处购买一个域名,然后解析到DNSPOD,他提供有DDNS服务。https://docs.dnspod.cn/dns/dnspod-synology-nas-ddns/
注意:在选择哪种DDNS服务商时,先看下自己的家庭设备支持哪种。比如我使用过的华为路由器,只支持花生壳的DDNS。如果家里有软路由或群晖NAS,基本上所有方式都支持。
FRP
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
简单来说,FRP就是通过公网一台服务器进行中转,外网先访问到这台服务器上,再转到内网设备。因此,公网服务器的带宽质量直接决定着使用体验。
准备工作
- 公网云服务器(VPS)一台
- 有简单的Linux命令
安装方法
可以参考官方提供的文档安装使用:
官方网址:https://gofrp.org/
GitHub仓库:https://github.com/fatedier/frp
Zerotier
使用zerotier工具可以组件虚拟局域网,实现内网穿透,而且是免费开源的。zerotier利用P2P技术让两个终端直接连接,因此连接速度比FRP更快。在两个终端首次连接时需要访问zerotier的根服务器,获取彼此的网络链路信息。
官方网址:https://www.zerotier.com/
简单安装使用
-
在zerotier官网注册一个账号,登录后创建一个Network;
-
点击创建好的network,可以对Name进行修改,其他设置默认即可;
-
下载客户端软件 https://www.zerotier.com/download/ ,根据自己的环境类型下载,比如下载Windows客户端,然后进行默认安装;
-
安装并打开软件后,点击 join network;
-
此处填写你在官网创建好的network ID,这样就把当前电脑注册到虚拟局域网了;
-
此时刷新官网管理界面,在 Members 里可以看到在线的终端,然后将终端的 Auth 勾选即可;
-
以上3-6步是将一台终端注册到虚拟局域网,其他终端需要完成同样的操作;
-
查看当前终端的虚拟局域网IP,打开show networks,查看Managed IPs即可当前局域网IP,如图中172.26.206.101。
-
如果虚拟局域网中两台Windows电脑相互访问,可以使用远程桌面的方式。此时受控电脑需要打开允许远程桌面连接,【设置】>>【系统】>>【远程桌面】开启;
-
使用远程桌面工具,输入对方的虚拟局域网IP连接即可。
moon节点安装及使用
由于zerotier建立连接时使用UDP打洞技术,连接时可能会过期重连。同时,zerotier的根服务器可能会距离终端比较远,访问有延迟,因此zerotier提供了moon节点服务器安装,重连时不需要访问根服务器,访问自己搭建的moon节点即可。
利用自己的云服务器搭建moon节点,可以使虚拟网络运行更加平稳快速。
-
在云服务器上安装 zerotier-one;
curl -s https://install.zerotier.com | sudo bash
-
云服务器加入虚拟网络
# 将命令中的 xxxxxxxx 替换成实际的network ID zerotier-cli join xxxxxxxx
-
配置 Moon
# 进入zerotier默认安装目录 cd /var/lib/zerotier-one
# 生成moon.json配置文件 zerotier-idtool initmoon identity.public >> moon.json
# 编辑 moon.json 配置文件 vim moon.json # 将配置文件中的 "stableEndpoints": [] 修改成 "stableEndpoints": ["ServerIP/9993"],将 ServerIP 替换成云服务器的公网IP。
# 生成 .moon 文件 zerotier-idtool genmoon moon.json
# 将生成的 000000xxxxxxxxxx.moon 移动到 moons.d 目录 mkdir moons.d mv 000000xxxxxxxxxx.moon moons.d # .moon 配置文件的名一般为若干个前导零+本机的节点ID
# 重启 zerotier-one 服务 systemctl restart zerotier-one
-
客户端使用moon;
# Linux 系统下使用 Moon # 将命令中的两组 xxxxxxxxxx 都替换成 moon 的节点ID zerotier-cli orbit xxxxxxxxxx xxxxxxxxxx # 检查是否添加成功 zerotier-cli listpeers
# Windows 系统下使用 Moon: # 以管理员身份打开 PowerShell,将命令中的两组 xxxxxxxxxx 都替换成 moon 的节点ID。 PS C:\Windows\system32> zerotier-cli.bat orbit xxxxxxxxxx xxxxxxxxxx # 检查是否添加成功 PS C:\Windows\system32> zerotier-cli.bat listpeers # 提示:Windows 系统的默认程序目录位于 C:\Program Files (x86)\ZeroTier\One。 # 建议重启电脑后,测试连接速度是否有提升。
向日葵/TeamViewer
这两种方案是最简单的方法,也是很多小白使用的方法。只需要到他们的官网下载对应客户端就行,常用在远程控制场景下。
- 向日葵官网:https://sunlogin.oray.com/
- TeamViewer官网:https://www.teamviewer.cn/cn/
现在又新增了一个wireguard组网的方法,只要公网开放一个udp端口,就可以完成虚拟组网,目前用起来感觉不错