背景
之前因为家里是移动的宽带,不给你分配公网ip,所以你无法实现类似在逛街的时候远程连接家里的电脑之类的操作。
相比于移动,我哥家里的宽带是电信的,他一个电话过去,电信立马给了公网ip,所以他可以随时随地远程控制他的电脑,这令我很羡慕。
内网穿透之旅
当然了,在过去一个学期里,随着知识和经验的进步,我学会了内网穿透。简单的理解起来,它干的工作类似于端口转发,只不过我们把本地的服务转发到了一台有公网ip的云服务器上。
上个学期我购买了一台阿里云轻量级应用服务器,然后利用开源的内网穿透工具 fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. (github.com) ,我可以实现将局域网里的服务进行公网访问。
frp虽好,但是一个问题也一直困扰着我,这便是由于服务的传输完全经过云服务器,相当于云服务器担当了中间人,安全性我倒是不担心,因为是自己的,但是速度就非常慢了。众所周知,国内的云服务器带宽都十分感人,我的服务器**5Mb/s(0.625MB/s)**的带宽已经 鸡立鸡群了。
然后在这个寒假我又发现了一个基于Ngork的内网穿透软件 open-dingtalk/pierced: 钉钉内网穿透 (github.com)。它的服务端部署在钉钉的国内高速机房里,带宽实测在3MB/s左右,已经非常快了。
突然发现的IPV6
昨天我在瞎玩的时候,突然发现我家的移动宽带是有公网ipv6的。
现在我教大家如何快速判断你所在的网络有没有IPV6。直接在powershell中输入ipconfig。
如果有IPv6 Address,并且开头不是fe80的话,那就说明你很幸运的拥有了一个公网ipv6,这意味着你的电脑完全提供服务并在公网中访问。
还可以访问此网站 IPv6地址查询 | IP查询(ipw.cn) 如果出现以下类似画面,说明你确实拥有一个公网ipv6。
注意访问此网站请关闭代理工具,不然会得到代理服务器的ip,而一般的代理服务器都是不支持ipv6的。
IPV6的特点
也许大家会有个疑惑,按理说我的笔记本连在一个路由器下,得到的ip应该是一个内网ip,比如192.168.1.60
。而为什么我笔记本上的ipv6能够直接是公网ip呢?
这大概是由于ipv6的数量实在是太多了。我们来简单算一笔账,我们知道ipv4一共是32位。
所以总共ipv4的数量是43亿个,这对于这个信息化的世界来说,一个人可能有数台设备,一个公司里面可能有数百台设备,如果每台设备分配一个ip,这个ipv4是完全不够的,所以出现了NAT这种方式来缓解这种资源的紧张感,一台路由器下的所有设备都会被分到一个内网ip,这个内网ip是无法在公网中被访问的。
而ipv6是64位。
它的数量我大概数了一下,应该是1844亿亿个。按全球人口70亿人来算,每个人都能分到263亿个ip。
所以公网ip一下子从一个稀缺资源,变成了一个人唾手可得的资源。所以对于ipv6而言,NAT这种方式已经没有意义了,所以局域网下的所有设备都会被分到一个公网ipv6。
手机流量也有IPV6
昨天下午在发现家里宽带有公网ipv6后已经非常高兴了,晚上睡觉前又试了一下,发现我的移动卡也有IPV6!
可以看到因为我有两张移动卡,这里直接有两个ipv6。
没想到ipv6的推广如此迅速又如此悄无声息,大部分普通用户都没有意识到它手里掌握着许多公网ip。
IPV6 + WSL2
有了公网ip,实际上我们已经能实现一开始说的情景了,不用内网穿透,直接在任何地点远程连接我的笔记本。由于比较简单,这里就不放图了。
平常我都用WSL2来作为生产力环境。我们都知道,windows对wsl2做了很强的适配,wsl2按理说是一个虚拟机,如果我们需要访问wsl2中的8081端口上的服务,按理说得到windows主机的浏览器输入http://wsl2-ip:8081
的url才能访问到。
但是微软帮我们自动做了一层端口转发,wsl2内部的任意端口都会被转发到windows主机的对应端口上,所以,我们只需要在浏览器中输入http://127.0.0.1:8081
就能访问到wsl2 8081端口上的的服务。
我在8081端口开了一个nextcloud。
所以我们现在能否直接通过http://[ipv6]:8081
的方式来访问这个服务呢?
可以,但是需要以下两步设置。
在高级防火墙设置中添加8081端口的入站规则
在poweshell将ipv6的端口的请求转发到ipv4对应端口
这里有点绕,大概原因就是wsl2给我们的端口转发只是ipv4层面的,我们无法通过ipv6来访问对应服务,所以我们需要把ipv6对应端口的请求转发到ipv4对应的端口。 如果你的服务不是wsl2上的,而是直接在windows主机中开启的服务,按理说该服务会同时相应ipv4和ipv6的请求,你就不用干这一步了,只需要执行第一步的增加入栈规则。
在powershell中以管理员方式执行以下指令
netsh interface portproxy add v6tov4 listenport=8081 connectport=8081
然后你可以通过以下指令查看转发是否成功
netsh interface portproxy show all
可以看到,成功使用ipv6访问服务。
用手机尝试下载文件时,可以看到速度达到7MB/s
。这应该受限于我家的宽带的带宽,如果你家是千兆宽带,那就直接起飞了。
美中不足
受到国家政策的限制,运营商都对80/443端口进行了封锁,应对服务器满天飞而造成监管难度过大的困境。
所以我们暂时只能用其他的端口提供服务。
丑是丑了点,但是想到这美妙的带宽,一切都是值得的,而且,白嫖的公网ip嘛!要什么摩托车。
写在最后
后天就去学校了,我希望校园网也有ipv6,之前没有注意过,如果真的有,真的就可以告别内网穿透了。