前情提要
最近换了个工作地,需要用自己的笔记本去远程另一台内网主机,因为我的笔记本和要远程的主机在不同的局域网内,无法直连,所以前一段时间一直用的向日葵远程桌面进行远程。用了一段时间实在受不了了,要强制登录,还到处弹广告,右下角浮窗也关不掉,加上最近连接也不是很稳定,加上工作的问题,搞得心情实在是很糟糕,一怒之下我决定自己搭建一个vpn连接,用Windows原生的远程桌面。顺便一提,之前写的这篇博客说的就是向*葵。使用Windows的远程桌面还有一个好处是它同时只允许一个账号使用,当我远程的时候,远程主机是锁屏界面,防止别人“监视”我工作。
搭建VPN需要一台公网电脑做为跳板,我没有可以公网访问的电脑。于是我找到了 easytier,它是用NAT打洞,通过P2P连接组网的,网络联通后,就不需要公网电脑了。而且官方提供了NAT打洞时的公网地址,所以我只需要在两个电脑上都装上 easytier 就可以了。
安装
easytier 官方下载页面如下:
也可以去 GitHub release 页面下载:
我是Windows电脑,所以下载的是 easytier-windows-x86_64-v2.2.2.zip。easytier 本身是一个命令行工具,但是官方也提供了 GUI 工具和 web 管理页面,我觉得挺麻烦,还不如直接用命令行工具来的方便快速。
解压上面下载的压缩包,会得到 3 个可执行程序和 2 个 dll。
我们主要用到的是 easytier-cli.exe
和 easytier-core.exe
。两台电脑都要下载这个软件。
连接
接下来我要在我的笔记本和远程主机上组网。首先在远程主机上以管理员身份运行命令行,执行以下命令:
easytier-core -i 10.144.144.1 --network-name my-test --network-secret my-secret -p tcp://public.easytier.cn:11010
这个命令一定要用管理员身份运行,否则会因为权限问题报错,因为会创建一个虚拟IP出来。参数中:
-i 10.144.144.1
:指定用来组网的虚拟网IP地址。--network-name my-test
和--network-secret my-secret
:指定网络名称和网络密钥,替换成你自己的,最好复杂一点,安全性更高。-p tcp://public.easytier.cn:11010
:用来辅助组网的共享节点,组网成功之前数据由它们转发,这里用的是 easytier 官方提供的免费共享节点。
除了官方的共享节点,easytier 社区也提供了许多免费共享节点,并且可以查看节点的网络状态:
执行完以后在另一个命令行运行 ipconfig
可以看到新创建的虚拟IP地址。
第二步是在我的笔记本上,用管理员身份运行下面的命令:
easytier-core -i 10.144.144.2 --network-name my-test --network-secret my-secret -p tcp://public.easytier.cn:11010
同样在另一个命令行运行下 ipconfig
,能看到新创建的虚拟IP:
然后运行一下 easytier-cli peer
查看一下连接状态:
可以看到我的两台电脑已经组网成功了,现在我可以在我的笔记本上面 ping 一下远程主机了。
如果无法 ping 通,可以去检查下防火墙的规则。现在我就可以通过 windows 的远程桌面用 10.144.144.1
这个IP地址来远程我的主机了。
访问内网
虽然现在我能远程到我的远程主机了,但是还是无法访问它所在的内网,一个很简单的例子,我只能通过 10.144.144.1
来远程,不能通过 192.168.2.100
来远程,因为它是内网地址。要解决这个问题,我们需要修改一下在远程主机上执行的命令:
easytier-core -i 10.144.144.1 -n 192.168.2.0/24 --network-name my-test --network-secret my-secret -p tcp://public.easytier.cn:11010
我们添加了 -n 192.168.2.0/24
这个参数,这样就可以通过远程主机将内网共享出来了。现在我可以 ping 通 192.168.2.100
了,并且可以直接用这个IP来远程我的主机。
自启动
前面我们都是通过在命令行手动执行命令来完成组网,但是我希望远程主机上的程序能自启动运行,这样即使重启电脑也不怕了。
接下来我们将远程主机上的程序做成 Windows 服务,不需要其他工具,用 Windows 的 sc
命令就可以了。
首先我们编写一个 bat 脚本来启动 easytier 命令,相比于直接在 sc
命令里写 easytier 的参数要灵活一些,如果我们要调整 easytier 的参数,只需要修改脚本然后重启服务就可以了,而不需要去修改Windows服务。脚本内容如下:
@echo off
set install_path=D:\program\easytier-windows-x86_64\
%install_path%easytier-core ^
-i 10.144.144.1 ^
-n 192.168.2.0/24 ^
--network-name zxkj-bj-test ^
--network-secret easy#12345 ^
-p tcp://public.easytier.cn:11010
将它保存为 easytier.bat
,然后以管理员身份打开命令行运行下面的命令:
sc create Easytier binPath="D:\program\bin\easytier.bat" DisplayName="Easytier" start=auto
create
后面紧跟的是服务名,用来唯一标识一个服务,sc
的许多命令都需要服务名做为参数。binPath
指定了程序路径,DisplayName
是显示用的名称,start
表示启动类型,这里选 auto
自启动。
我们还可以通过
sc
命令做更多事情:
- 设置服务描述
sc description Easytier "P2P组网"
或者sc config Easytier description="P2P组网"
- 查询服务状态
sc query Easytier
或者sc queryex Easytier
,后者返回的信息更多。- 启动服务
sc start Easytier
- 停止服务
sc stop Easytier
- 暂停服务
sc pause Easytier
- 继续运行服务
sc continue Easytier
- 删除服务
sc delete Easytier
也可以直接在命令行输入sc
来查看帮助文档。
当然我们可能更习惯通过 services.msc
来查看服务,按 Win+R
输入 services.msc
回车,打开 Windows 服务管理器。当然在这里基本只能查看服务状态,启停服务,能修改的地方非常有限。我们创建 Easytier
服务之后,它是没有运行的,需要手动启动一下。
这样远程主机上的自启动就做好了。而对于我的笔记本,我更倾向于能手动控制它,所以只是写了一个脚本方便启动 easytier 和查看状态,并没有做成服务。
@echo off
set install_path=D:\program\easytier-windows-x86_64\
if "%1" == "" goto start
if "%1" == "peer" goto peer
if "%1" == "route" goto route
if "%1" == "node" goto node
:start
%install_path%easytier-core ^
-i 10.144.144.2 ^
--network-name zxkj-bj-test ^
--network-secret easy#12345 ^
-p tcp://public.easytier.cn:11010
goto end
:peer
%install_path%easytier-cli peer
goto end
:route
%install_path%easytier-cli route
goto end
:node
%install_path%easytier-cli node
goto end
:end
文件共享
用 Windows 的远程桌面连接也能实现文件共享,就像使用本地磁盘一样,是非常方便的。它实际上是把本地磁盘做为网络磁盘共享给了远程主机,这样就能实现两边的双向文件共享互通了。
打开远程桌面连接,点击”显示选项“。
然后选择”本地资源“选项卡,点击“详细信息”按钮。
勾选要共享的磁盘,点击确定即可。
点击连接,在远程主机的文件管理器中就能看到共享的磁盘了。
下一步,卸载向*葵。