浅谈IPv4和IPv6在家庭服务的应用

本文算是我一直折腾家庭服务器的一个简单的总结,如果有不对的地方欢迎大家指正。

1.家庭网络环境

1.1家庭宽带情况

我家目前是三条宽带,分别是电信、联通、移动,均是1000M的下行,上行的话电信和联通差不多是50-60M,移动差不多有80M。然后其中电信和联通均有动态的公网IPv4、电信、联通和移动均有动态的公网IPv6.三台光猫均完整了改桥接操作。

1.2家庭组网情况

由于我属于比较喜欢折腾的人,所以经常瞎搞,当然一瞎搞就把全屋的网络整瘫了。为了解决这个问题,我在家里弄了两套局域网出来,其中一套局域网给家里其他人用,这里定义为网络A;另一套当然就是自己用,这里定义为网络B。

1.2.1 网络A组网情况

网络A网段:10.8.3.0/24
网络A是使用的联通线路,原因是我自己个人比较偏爱电信,然后移动又比较拉胯,所以就把联通给家里人用了。这里可能有人会问,联通有公网的IPv4为什么给家里人用呢,他们只是普通的上上网,公网IPv4完全浪费了。这里我先卖个关子,因为后续会讲到这个问题。
网络A由联通光猫和两台锐捷的x60Pro组成。其中,联通光猫桥接,由其中一台x60Pro进行拨号,另一台x60Pro才用无线中继方式实现全屋无线网络覆盖。网络拓扑如下所示:
|联通光猫|——|锐捷x60Pro(主路由,拨号)|——|锐捷x60Pro(子路由,有线中继)|

1.2.2 网络B组网情况

网络B网段:10.8.2.0/24
网络B的设备包括一台iStoreOS软路由4个2.5G网口+1个千兆网口、两台锐捷x60Pro、一台16口2.5G交换机、电信光猫和移动光猫。
iStoreOS的LAN1口连接电信光猫,进行拨号实现电信网络上网;
iStoreOS的LAN2口连接网络A主路由的LAN口,通过DHCP获取IP实现联通网络上网;
iStoreOS的LAN3口连接移动光猫,进行拨号实现移动网络上网。
从以上描述可以看出,B网络只有电信有公网的IPv4,然后电信、联通和移动均有公网的IPv6。由于LAN2口连接到了网络A的主路由上,使得网络B能够实现对网络A的管理。

2.最初选择和问题

实际上我最开始特别在意公网IPv4,原因也很简单就是要实现家庭访问有一个公网IPv4是很方便的。最早期我一直是只解析公网IPv4地址实现对家庭网络的访问,直到那一天。
那一天是在龙湖天街,小盆友想看看家里的奥特曼电影,结果不管是移动流量还是电信流量都最多能够刷出Emby的主页面,然后就没有然后了。
这事儿之后,我做了一下试验,仔细分析了一下原因,大致有如下因素:
(1)当时龙湖移动的网络质量比较好,但由于是跨网、晚高峰访问,由于层层NAT,导致最终无法看视频;
(2)电信的情况则不同,主要是电信本身的网络质量就差一点,然后加上晚高峰,同样是层层NAT,导致最终无法看视频。

3.第一次尝试

分析出原因之后(层层NAT那会还没分析出来),我认为电信本身的问题肯定是无法解决的,毕竟我不可能去建一个基站。那么就只能从移动入手了。当时觉得主要原因是跨网访问的原因,所以我决定弄一个一进二出的方案。具体就是电信请求,检查后从电信出去;移动请求,检查后从移动出去。我天真的认为这样就可以解决晚高峰跨网导致的访问速度慢的问题。

3.1 具体方案

电信 WAN:网关跃点 10
移动 WAN2(锐捷 DHCP 获取):网关跃点 20
两条都自动拿到网关,靠跃点控优先级,默认全网走电信。
第一步:新建自定义路由表
系统 → 路由 → 路由规则(有的版本叫「策略路由」)先编辑路由表文件:
登录 iStoreOS SSH:

运行  
uci set network.rtbl100=route_table  
uci set network.rtbl100.table='100'  
uci commit network  
/etc/init.d/network restart  

作用:新建路由表 100,专门给移动回包用。

第二步:给表 100 加移动 WAN2 的默认路由
把所有要走移动回包的流量,默认扔给移动网关。
先查你移动 WAN2 的网关是多少(必做):

运行
route -n | grep WAN2

你会看到类似:192.168.3.1 就是移动网关。
然后执行(把下面网关换成你实际的,比如 192.168.3.1):

运行
# 清空旧规则
uci delete network.rule100 2>/dev/null
uci delete network.route100 2>/dev/null

# 给表100加默认路由 走移动WAN2网关
uci set network.route100=route
uci set network.route100.interface='WAN2'
uci set network.route100.target='0.0.0.0/0'
uci set network.route100.gateway='192.168.3.1'
uci set network.route100.table='100'

uci commit network
/etc/init.d/network restart

第三步:加策略规则 —— 移动 IP 来访 查表 100 回包
原理:只要外网客户端是移动 IP 段,回程强制走表 100(移动 WAN2)
全国移动公网大段,直接逐条添加
继续 SSH 执行,批量导入移动网段规则:

运行
# 移动核心公网段,匹配绝大多数移动用户
ips=(
"112.0.0.0/10"
"117.128.0.0/10"
"120.192.0.0/10"
"183.128.0.0/10"
"211.136.0.0/15"
"218.200.0.0/13"
)
id=100
for ip in "${ips[@]}"; do
  uci set network.rule$id=rule
  uci set network.rule$id.src="$ip"
  uci set network.rule$id.lookup='100'
  uci set network.rule$id.priority="$id"
  id=$((id+1))
done

uci commit network
/etc/init.d/network restart

这里添加的时候for是没办法用的,比较简单的方案就是nano之后去下载IP段,然后直接张贴进去。
这样之后所有外网请求 只从电信 WAN 公网进来
系统看来访者源 IP:
命中上面移动网段 → 查表 100 → 走移动 WAN2 回包
没命中 → 走系统默认路由(跃点 10 电信 WAN)

3.2实际测试

完成上述修改后,我在下午3点左右测试,通过抓包发现移动手机访问的时候只有移动有上行流量,成功。然后我信心满满的等待夜幕的降临。
左灯右等,在龙湖里,总算熬到了8点,手机打开移动上网流量,打开Emby客户端,页面出现了,点击一个视频,那个该死的圈又转了起来,不用说,失败了。
这次失败后,我赶紧回家想说是不是龙湖的信号没那么好。结果兴冲冲的赶回家。8点30分再次测试,依然是不停的圈圈转啊转。
这次测试失败后,我又再分析了一下,发现了最后一个问题,也是最大的问题就是层层NAT。稍微懂网络的人肯定知道层层NAT是造成晚高峰网速慢的主要原因。但是不管怎么说,这个方案是破产了。
接下来,我还不甘心,又买了一个腾讯迅驰型的轻量应用服务器,然后通过他来中转。结果,结果,我又被现实很很打脸了。因为使用中转后,原本小区邻居原本可以在晚高峰访问我家的。结果现在也无法访问了。
钱花出去了,问题没有解决,肯定要再分析,为了验证到底是移动端到中转服务器的问题还是中转服务器到我家这段的问题。为了验证,我在服务器上弄了一个网站,放了一个视频。结果发现移动端访问还是蛮快的,可以流畅的看720P,没有问题。那么这回问题就回到了中转服务器到我家这段了。哎,该死的层层NAT,即使有公网IPv4也没有用。
山穷水尽疑无路,柳暗花明又一村!
在已经要绝望的时候,感谢AI提醒我可以试试IPv6,当然反正也折腾了这么久,死马当活马医。

4.IPv6方案

首先我不是要说IPv6是完美的,他有一个明显的短板,但是瑕不掩瑜,接下来就来分享IPv6方案。

4.1天生优势

首先要说的就是在多线路环境下,IPv6自带的优势,自带源进源出。也就是说只要从移动的IPv6进来,那么就会自动走移动的上行出去。然后iStoreOS不需要做任何的配置。

4.2域名解析

简单方案
既然可以源进源出,那么我们要做的就是将不同线路的IPv6解析到公网上。当然这里最简单的方案就是不同的线路对应不同的域名。比如你的主域名叫test.xyz,那么就可以做如下解析关系:
电信线路:telecon.test.xyz,指定中国电信线路;
联通线路:unicom.test.xyz,指定中国联通线路;
移动线路:mobile.test.xyz,指定中国移动线路。
这样的好处就是域名解析和DDNS比较好配置,没那么多事儿,麻烦的就是你得自己去记住域名。
优选方案
优选方案就是一个域名根据源解析出三个不同的IP,具体操作步骤如下:
第一步在阿里云或者腾讯云进行域名解析
这里进行域名解析的时候一定要给IP指定线路,即做一一对应。
第二步是通过API接口获取RecordID
以阿里云为例,先安装阿里CLI
下载工具:点击这个链接直接下载:aliyun-cli-windows-latest-amd64.zip 。
解压文件:下载的是一个压缩包,把它解压到一个你找得到的文件夹里,例如 C:\aliyun。
添加到 Path (重点):为了让电脑在任何地方都能识别 aliyun 命令,需要把这个路径添加到系统环境变量 Path 中 。
按下 Win + R 键,输入 SystemPropertiesAdvanced 并回车。
点击 “环境变量”。
在 “系统变量” 列表中找到 Path,双击打开。
点击 “新建”,输入你解压的文件夹路径(例如 C:\aliyun)。
一路点击 “确定” 保存。

配置凭证(让命令行认识你)
打开 命令提示符 (cmd) 或 PowerShell。
输入以下命令并按回车,开始配置阿里云访问权限:

aliyun configure

根据提示依次输入以下信息 :

Access Key Id: 输入你的 AccessKey ID。

Access Key Secret: 输入你的 AccessKey Secret。

Default Region Id: 输入 cn-hangzhou (或其他地域)。

Default Output Format: 输入 json (保持默认)。

Default Language: 输入 en。

小提示:如果还没有 AccessKey,可以去阿里云控制台右上角的 AccessKey 管理里创建一个。

获取 RecordId
配置成功后,直接在刚才的命令行窗口里输入下面的命令:

aliyun alidns DescribeDomainRecords --DomainName "你的主域名"   

执行后,屏幕上会显示一串 JSON 格式的文本。仔细找找 “RR” 字段为 “home” 和 “*.home” 的记录,它们旁边的 “RecordId” 后面跟着的那串数字,就是你需要的 。
把这两串数字记下来,后面需要填到DDNS-GO的配置里。

4.3DDNS-GO配置

这里不得不说就是我自己踩过的坑。最开始我的填写方式如下:

telecom.test.xyz?RecordId=1234567890123456789
mobile.test.xyz?RecordId=0987654321098765432
unicom.test.xyz?RecordId=1357913579135791357

这样填写后,就可以对应解析出来了。但是这里有一个天坑:一旦IP变化了,你会发现阿里云解析那边的线路就又乱了,怎么办呢?需要加上线路,正确的写法如下:

telecom.test.xyz?RecordId=1234567890123456789&Line=telecom
mobile.test.xyz?RecordId=0987654321098765432&Line=mobile
unicom.test.xyz?RecordId=1357913579135791357&Line=unicom

加上线路标识之后,IP发生变化也不会再导致线路号乱了。

4.4实际测试

呃,结果不要太惊喜。跑到龙湖天街,晚上8点高峰时段,不管是移动还是电信(联通手机还没办法用)看1080P的电影可以随便拖拉,一点都不卡,就和本地播放一个感觉,丝滑的我都有点懵了。
为什么IPv6那么丝滑呢?原因主要有以下两点:
(1)IPv6没有IPv4那么多NAT,因为每一个设备都有公网地址,不存在需要层层转发的必要条件;
(2)IPv6在Qos上估计没有被运营商怎么限制;
但是实际测试中也发现,就是即使是IPv6跨网访问还是会比网内访问要慢不少。所以,对于移动手机用户来讲,移动网络其实也蛮有用的。

5.最终方案

看了上面内容,小伙伴是不是发现IPv4环境就会挂。是的,比如酒店,公司这种基本上纯IPv4的环境,上面的IPv6方案就抓瞎了。所以还是需要保留IPv4的域名解析。
这里我实在是不想搞了,因为IPv4的的线路和IPv6差异太多了。比如240e开头就是电信、2408是联通、2409是移动,只要记得这个谁都能一下识别出来。但是对于IPv4就不是了。对于同一个IP,今天是移动,可能过几天就是联通了。所以就会出现误解析的问题,而一旦出现错误解析就会直接超时。
当然最大的问题还是IPv4有跳跃点,所以实际只能有一个入口。所以也没有必要解析两个IP,也就是说做单进多出就是最简单也是最有效的。这个方案上面我已经叙述过怎么实现。
最终我自己是选择了只解析电信,别说我只有电信了,最开始我还是有联通的,只是发现不靠谱之后就把联通拿走了。然后我也没做单进多出,因为IPv4纯粹就是后备方案,不值当了。

类似文章