梦想博客

通过OpenWrt浅研网络相关姿势

calendar 2024/01/06
refresh-cw 2024/01/06
3647字,8分钟
tag Openwrt;

前言 🔗

最近买了一本“计算机网络自顶向下方法”的书,但是看起来实在是太枯燥了

正巧,偶尔间看到了软路由综合对比之下最终选择了友善的R5S其arm cpu+4g内存现阶段完全能满足我的要求(650元)

下图以展示小小的机器大大的能量


尴尬の瞬间 🔗

预装的系统插件太多,不太适合我这种小白,最终果不其然在我的一顿骚操作下玩崩了

问了客服刷机的教程,发现EMMC卡刷才是王道,sd卡刷每次开机还需要手动按mask按钮比较麻烦

但是我手头又没有usb对公数据线,问了一圈都没有从京东买的话还需要2天才能到货,最终联系到了修电脑买了一个二手的usb对公数据线,万事俱备只欠东风,先去看看系统的选择

系统选择 🔗

以上仅附比较常见的系统,至于各类魔改系统不在其列,至于github上的系统我刷完之后发热量狂增不推荐!

为了防止链接丢失,这里附上刷机工具及boot文件

以上系统我都刷完对比之后还是iStoreOS比较适合

网络布局 🔗

看了网络的一些布局

如果用做单臂路由则有点大刀小用了,毕竟其1个千兆网口2个2.5g网口,如果用于单臂路由则1个wan口1个lan口都浪费了

如果用作主路由则不是不可行,但是如果安装了openclash等相关功能后则使用主路由则会引起一些不必要的降速以及pt下载的时候会出现问题

如果用作旁路网关则是非常适合家庭使用的,不影响现有网络的情况下只对部分有需求的机器开启,且其lan口可以接Apple TV非常方便

目前个人居住采用的是主路由模式,如遇pt下载需求时则手动关闭adgurd home和openclash来规避流量问题

相关使用 🔗

由于目前网络环境使用的是中国移动,改完桥接之后通过pppoe拨号发现ipv4地址是100.x.x.x,ipv6地址是fexxx,大内网名副其实

遂没有折腾ddns和nas等相关内容,目前开启的功能仅限于openclash,adgurd home,docker等相关必要的内容

主路由通过pppoe拨号上网之后,将2个lan口全部利用起来 lan1:电脑直连 lan2: 华为ax2 pro路由器直连

将华为ax2 pro路由器的上网模式更改为ap模式,即不开启dhcp功能,仅主路由开启dhcp

目前网络大环境ipv6仍处于建设中,建议关闭ipv6双栈环境以规避某些软件的兼容性

上述设置仅代表本人网络环境下所匹配的设置,不能当作参考使用

电脑设置 🔗

在此之前我是用的是CFW,不过作者已经删库跑路了2333

git项目必须进行如下设置,否则受限于中国特殊的网络环境导致提交失败的问题

1[http]
2    proxy = socks5://127.0.0.1:1080
3[https]
4    proxy = socks5://127.0.0.1:1080

将所有git项目中的如上设置全部移除即可正常使用

如果设置为旁路网关或者单臂路由时,需要手动设置网络-ipv4-ip地址自填,网关更改为旁路网关的地址或单臂路由的地址

网络相关知识 🔗

根据和某大佬的交谈,附上大佬所言相关知识以补充

数据传输过程是一层层封装和解封的


上面是一个典型的以太网帧,它的数据payload是一个ip数据包,ip数据包的payload是一个udp封包 比如我要传输一个数据aaaaaaaaaaaa 我给这段aaaaaaaaaaaa打上udp包头后就成立udp封包,我再给这个udp封包打上ip数据包报头,就成了ip数据包,我再给这个ip数据包打上以太网帧头,就成了以太网帧 传输就是这样一层层加头,一层层去头

这只是一层的,如果我是多层nat那这个又得多?

这又是另一回事了,这是路由器在修改你ip数据包头的ip地址,和上面说的无关 你机器地址是192.168.0.1 路由器wan口地址是157.220.111.3 当经过路由器访问外部网络的时候,路由器会把ip包头的src address(源地址)改成它的wan口地址。 也就是把 192.168.0.1 改成 157.220.111.3。 道理很简单,外部主机收到ip包后要回复给你主机得知道你主机的地址,如果保留着原本的地址 192.168.0.1,服务器发出来的返程数据就会发送给它所在内网的地址为 192.168.0.1的那台主机 因为是从你主机上发过去的,从你主机出去的时候你系统的协议栈就给它打上网卡的ip了 然后到了路由器那必须要做下地址变换,从你主机的lan地址改成它可以被外部访问的ip(即它的wan口地址),然后做下记录,这样返程数据包回来的时候,路由器查表,就知道是回给谁的了

那多层nat有什么坏处吗?我还以为是一直加包头原来他是改包头的

这种叫做隧道,用一种协议流量去承载同级或者更低级的另一种协议流量,nat太多影响吞吐

对了,上面说的nat现在都是结合端口做的,严格来说都是napt,不是单一的nat,写过linux下的路由规则就知道(iptables或者netfilter) 单纯的nat会出现问题,思考下局域网内有两台主机,这两台主机同一时间发起了访问,并且访问的是同一个外部服务器。这时候单纯的NAT网址变换就好用了,因为NAT只会根据源地址和目标地址做改写,发出去的时候没问题,回来的时候就有问题了。 比如192.168.0.1和192.168.0.2,访问1.2.3.4,路由器wan口是5.6.7.8,出去的时候,数据包的源地址被路由改成5.6.7.8,并且需要备份原始的地址做记录,问题来了,两台同时访问,会有两个这样的记录 192.168.0.1:1.2.3.4,192.168.0.2:1.2.3.4。面对回来的数据包,如果只有一条记录192.168.0.1:1.2.3.4的话,路由一看源地址是1.2.3.4(因为是从服务器返回的回程数据,所以这时候源地址是服务器ip),把它转发给对应的内网主机192.168.0.1就行。有多条就不行了,打破了唯一性,这时候没办法决定选哪个了。 所以这时候就需要结合端口,形成地址和端口的组合,来确定这种对应关系,也就是NATP。 比如192.168.0.1,用自己的2222端口和外部服务器的80端口通信。 就会出现这样一条TCP连接 【192.168.0.1:2222 | 1.2.3.4:80】 路由器接到后,会选择一个自身当前没被使用端口比如说555,把这条连接的IP包头的源地址改成自己的wan口地址,把tcp报头的源端口改成555 这样就增加了一种新的映射 【192.168.0.1:2222 | 5.6.7.8:555】 也就是路由器自身和内网主机的映射 而经过NAPT改写后的数据包成了 【5.6.7.8:555 | 1.2.3.4:80】 这样服务器返回来的回程数据包,目标地址和端口就是路由器的地址和端口,路由器又可以从新增的映射【192.168.0.1:2222 | 5.6.7.8:555】中,知道发给 5.6.7.8:555这个组合的数据包是应该被转发给 192.168.0.1:2222的,然后进行从外到内的NAPT,并转发给对应的内网主机 这就解决了多主机同时访问外部网络的冲突 比如上面的两台主机,都访问1.2.3.4:80 第一台主机 192.168.0.1:222 ,经过路由器NAPT后,源地址端口组合变成了 5.6.7.8:555 第二台主机 192.168.0.1:333 ,经过路由器NAPT后,源地址端口组合变成了 5.6.7.8:666 这样当路由器面对回程数据包 路由器一看目标地址端口组合是 5.6.7.8:555,就知道是要转发给 192.168.0.1:222的,如果是 5.6.7.8:666,就知道是要转发给 192.168.0.1:333的

那为啥端口只有65535个呢?能开到int32吗

因为TCP报头里端口字段只有两字节的长度,这是协议规定好的,规定了它的偏移(起始位置)和长度(占用的字节数)

那协议后续会改成4字节的吗?ipv6也是和ipv4一样的帧吗

不可能,这不是软件里动动手指改个数字那么简单,多少现存的设备得更换,框架得重写 v6和v4完全不一样,差异很大。端口是tcp协议的事情(4层),ip协议是3层,它包头里的是ip地址

等ipv6全球起飞的时候,gfw还能拦得住吗?

没啥想法,至少十几年后的事情

其实也快吧,现在家用宽带基本都配了v6了,手机也是

标配不一定能支持,通信是跨节点的,一条链路能支持v6,得保证链路上每个节点都支持v6,不是你端对端两点做好就能成立的,你是不是对这个事情需要多大成本是个多大规模毫无概念。换成v6动动嘴皮说的轻巧,主干网上多少设备要换,链路上每个环节都要打通,涉及到多少部门、单位、人员、行业,运营商,程序员,网络设备制造商,各行各业用户… 都不说墙不墙,你不用行政手段强制推动光靠市场自然升级,你觉得我们国家的规模要多久能完成,而靠行政手段这么大的规模需要多大的成本cover,简直没点b数了

那看来指望ipv6破墙得在等十几年了

等普及了自然会有新的审查手段就是了。而且想着新技术破墙和当今世界发展潮流是相悖的,未来建墙的国家只会越来越多了,欧盟都提上议程了,未来还可能出现小国想建墙却负担不了成本建不起的情况

在此感谢大佬的解惑,让本无聊的学习多了几分乐趣


分类