天降公网ip - wuuconix's blog

背景

之前因为家里是移动的宽带,不给你分配公网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

ipconfig

如果有IPv6 Address,并且开头不是fe80的话,那就说明你很幸运的拥有了一个公网ipv6,这意味着你的电脑完全提供服务并在公网中访问。

还可以访问此网站 IPv6地址查询 | IP查询(ipw.cn) 如果出现以下类似画面,说明你确实拥有一个公网ipv6。

注意访问此网站请关闭代理工具,不然会得到代理服务器的ip,而一般的代理服务器都是不支持ipv6的。

ipv6地址查询工具

IPV6的特点

也许大家会有个疑惑,按理说我的笔记本连在一个路由器下,得到的ip应该是一个内网ip,比如192.168.1.60。而为什么我笔记本上的ipv6能够直接是公网ip呢?

这大概是由于ipv6的数量实在是太多了。我们来简单算一笔账,我们知道ipv4一共是32位。

ipv4的数量

所以总共ipv4的数量是43亿个,这对于这个信息化的世界来说,一个人可能有数台设备,一个公司里面可能有数百台设备,如果每台设备分配一个ip,这个ipv4是完全不够的,所以出现了NAT这种方式来缓解这种资源的紧张感,一台路由器下的所有设备都会被分到一个内网ip,这个内网ip是无法在公网中被访问的。

而ipv6是64位。

ipv6的数量

它的数量我大概数了一下,应该是1844亿亿个。按全球人口70亿人来算,每个人都能分到263亿个ip。

每个人能分到的ipv6个数

所以公网ip一下子从一个稀缺资源,变成了一个人唾手可得的资源。所以对于ipv6而言,NAT这种方式已经没有意义了,所以局域网下的所有设备都会被分到一个公网ipv6。

手机流量也有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

我在8081端口开了一个nextcloud。

所以我们现在能否直接通过http://[ipv6]:8081的方式来访问这个服务呢?

可以,但是需要以下两步设置。

在高级防火墙设置中添加8081端口的入站规则

入站规则

在poweshell将ipv6的端口的请求转发到ipv4对应端口

这里有点绕,大概原因就是wsl2给我们的端口转发只是ipv4层面的,我们无法通过ipv6来访问对应服务,所以我们需要把ipv6对应端口的请求转发到ipv4对应的端口。 如果你的服务不是wsl2上的,而是直接在windows主机中开启的服务,按理说该服务会同时相应ipv4和ipv6的请求,你就不用干这一步了,只需要执行第一步的增加入栈规则。

在powershell中以管理员方式执行以下指令

代码语言:javascript
复制
netsh interface portproxy add v6tov4 listenport=8081 connectport=8081

然后你可以通过以下指令查看转发是否成功

代码语言:javascript
复制
netsh interface portproxy show all
show all
ipv6访问

可以看到,成功使用ipv6访问服务。

用手机尝试下载文件时,可以看到速度达到7MB/s。这应该受限于我家的宽带的带宽,如果你家是千兆宽带,那就直接起飞了。

速度

美中不足

受到国家政策的限制,运营商都对80/443端口进行了封锁,应对服务器满天飞而造成监管难度过大的困境。

所以我们暂时只能用其他的端口提供服务。

丑是丑了点,但是想到这美妙的带宽,一切都是值得的,而且,白嫖的公网ip嘛!要什么摩托车。

写在最后

后天就去学校了,我希望校园网也有ipv6,之前没有注意过,如果真的有,真的就可以告别内网穿透了。