最近完美实现了从远程局域网连接家里电脑,进行远程控制,这里记录一下几种不同的方案。
首先要看看家里电脑是用的哪个运营商的宽带,如果是中国电信的宽带,那么实现起来是最容易方便的,那就是和中国电信申请分配一个公网的IP地址,但是如果是中国移动的宽带,那么就比较麻烦,移动那边是不会分配公网IPv4的地址的,但是不要担心,我们也是有方案来解决。下面就描述一下不同的场景下的解决方案。
第一步是要能实现远程控制家里的电脑的开关机,这里有两种方案
如果是中国电信的宽带并且分配了公网IPV4地址,可以采用wake on lan(WOL)这种方式来进行远程开关机,这种方式需要电脑通过有线网络连接家里的路由器,在电脑的BIOS设置里面打开WOL的选项,然后远程电脑运行WOL的命令,向家里的电脑发送WOL的magic packet即可实现开机。但是这个方式需要有线网络的连接,如果没有的话,也可采用新增一个无线路由器放在家里电脑旁边,通过桥接的方式连到主路由器,然后家里的电脑通过网线和这个无线路由器相连。另外,因为电信分配的公网IP地址会定期更改,最好是申请一个域名,在家里的无线路由器里面设置DDNS来和这个IP做绑定,可以选择花生壳的DDNS服务,申请一个域名也很便宜。
如果是其他运营商的宽带,无法获得公网IPV4地址,那么我们可以采用另外一种方式,就是购买一个智能插座,连接家里的无线路由之后,就可以远程遥控插座的通电,并且在家里电脑的BIOS选项中选择通电后自动开机的选项(我的电脑的BIOS选项里面是有一个Power restore的选项,选择Power ON)。
实现了远程控制电脑开机之后,我们就可以进行下一步操作了,这里面也是有几种不同的方案
1. 能拿到公网IPV4地址
这种方式是最简洁的,只要在家里的无线路由设置好端口转发,把外网的端口映射到内网电脑的端口即可。之后就可以远程连接这个公网IP地址加端口来访问家里的电脑。但是一般只有电信的宽带才会分配IPV4地址。
2. 无法拿到公网IPV4地址,但是能拿到公网IPV6地址
目前各大运营商都已经支持IPV6公网IP地址的分配了,只要家里的路由器能支持,就可获取公网IPV6地址。如果远端的电脑也支持IPV6,那么也可以通过IPV6来进行远程访问。具体是否支持可以在远端的电脑上访问ipv6-test.com网站来进行测试。如果远端的电脑不支持,那么可以尝试开启微软的Teredo隧道,来进行IPV6的封装。在Win10版本下,可以用管理员身份打开Powershell,然后运行netsh interface teredo set state enterpriseclient server=default来开启这个隧道,开启之后查看ipconfig,如果能分配2001开头的IPV6地址,那么一般来说就可以用IPV6服务了,可以再上ipv6-test.com来测试一下。不过我这里遇到一个奇怪的问题,就是开启隧道之后,虽然获取了2001的地址,但是仍然无法访问IPV6,可能是我远端电脑所处的网络设置的问题,例如路由器不支持这种隧道之类的。所以这种方案对我来说并不适用。
3. 内网穿透
我用的是移动的宽带,在没有公网IPV4,而且远端电脑也不支持IPV6的情况下,应该如何来实现这个远程访问呢?不用着急,还是有解决方案的。那就是可以采用内网穿透的方式,也就是虽然家里的电脑是处于内网,无法让外网的电脑直接连接,但是家里的电脑是可以连到外网的,因此我们可以通过反向端口映射的方式来建立一个SSH隧道。一种方式是可以采用一些服务提供商的内网穿透服务,例如花生壳,提供了内网穿透,可以设置家里的电脑绑定到一个外网的地址和端口,然后远端电脑可以访问这个外网的地址和端口,从而访问家里电脑的服务。不过这种方式有个缺陷,那就是免费版的服务能绑定的端口数量有限,而且限制带宽,例如花生壳限制是2个端口的绑定,以及带宽不能超过1Mbps(这个估计也是共享带宽的,如果这个免费内网穿透的服务同时很多人用,那么就很慢),有没有其他方式来突破这个限制呢?
经过我的研究,还真有一种完美的方式,那就是自己部署一台云主机,用来提供这个内网穿透服务。例如我们可以选用腾讯的轻量应用服务器,现在做活动是288元3年(平均每个月8元),服务器配置是1核CPU,2G内存,40G硬盘,5M带宽,这个就很适合用来做内网穿透(当然还可以挖掘一些其他的用途,例如用来做代理服务器,实现游戏加速等等)。部署了云主机之后,我们需要做以下的设置
a. 实现SSH免密码登录
在家里的电脑运行ssh keygen,然后点回车即可,为家里的电脑生成一个公钥和私钥,然后运行ssh-copy-id -i ~/.ssh/id_rsa [email protected], 把这个公钥拷贝到云主机上即可。[email protected]是云主机的用户名和IP地址,之后需要ssh连接一次云主机,测试一下是否不需要输入密码。
b. 在家里的电脑配置反向端口映射
运行SSH,进行反向端口映射,把云主机的端口映射到本地电脑的22端口。这里采用autossh来进行配置,因为需要解决SSH配置之后隧道容易失效的问题,autossh可以帮我们自动监控和重建这个隧道。在ubuntu系统下可以运行apt install autossh来安装。我家里电脑是ubuntu 18.04的操作系统,为了让autossh能开机自启动,需要在/etc/systemd/system目录下面新建一个service文件,例如命名为autossh-reverse-mapping.service,编辑内容如下:
[Unit]
Description=AutoSSH reverse proxy
After=network.target
[Service]
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 2" -o TCPKeepAlive=yes -NR 7777:localhost:22 [email protected]
[Install]
WantedBy=multi-user.target
然后运行sudo systemctl enable autossh-reverse-mapping, sudo systemctl start autossh-reverse-mapping,启动服务。
登录家里的无线路由器,配置端口转发,允许外网访问22端口映射到家里电脑的内网IP地址和22端口上
c. 在云主机上配置正向端口转发(可选)
这一步是可选的,因为在以上步骤做完之后,在远端电脑直接ssh -p7777 [email protected]即可实现访问家里的电脑。不过我们也可以在云主机上配置另外一个端口暴露给外网来访问(可能在安全性上更好),例如我可以暴露8888这个端口,外网访问8888,实际上会转发到7777这个端口,然后再转到家里电脑的22端口。
在云主机上运行以下设置
ssh -fCNL *:8888:localhost:7777 localhost
然后在远端电脑运行以下命令,即可实现远程登录家里的电脑
ssh -p8888 [email protected]
d. 配置VNC实现远程图形控制
如果要实现VNC远程连接,方式也是和上面的类似,也是建立一个反向端口,把云主机的端口绑定到家里电脑的5901端口上,然后在云主机上配置一个正向端口代理,把暴露给公网的端口转发到之前和5901绑定的那个端口上。
以上就是我当前采用的方案,可以完美解决外网访问内网的问题。