我在 mikrotik rb951-2hnd 路由器上遇到一个奇怪的问题。我几年前使用构建图像修订版 39392 和补丁对其进行了固件处理,一切正常。就在几个月前,我决定更新固件。所以我这么做了并发现物理网络完全中断。我有丢包率90%以上不过,通过以太网端口无线网络工作完美。我以为我在构建时搞砸了。因此,我从 download.openwrt 中固件了 2 个不同的映像,以及我自己构建的另外几个映像,但症状总是相同的。我想尝试为我的 svn 版本工作,但不幸的是这个补丁不可用,所以我无法恢复图像。有趣的是通过 vmlinux-initramfs (bootp) 进行网络引导时,包括物理端口在内的所有内容都可以工作相同的构建修订版。由于 vmlinux 工作正常,我怀疑闪存已损坏,因此我确保 rootfs.tar.gz 中的文件和固件文件是相同的。在下一步中,我比较了 vmlinux-initramfs 和固件系统上加载的恶魔,固件系统具有以下额外列出:
nf_log_common.ko
nf_log_ipv4.ko
nf_log_ipv6.ko
nf_nat_masquerade_ipv4.ko
nf_reject_ipv4
nf_reject_ipv4.ko
nf_reject_ipv6
nf_reject_ipv6.ko
nls_base.ko
阻止它们加载并没有帮助。此外我得到dmesg 或 logread 没有错误。这是我的配置:
顶部
iptables-L-n
/etc/config/网络- 1 万。 2-5 个 LAN(STA 客户端模式下的 WiFi)
dhcp 的场景:
将笔记本电脑(dhcp 客户端)插入 LAN 端口 15 秒(之后拔出)后,我看到以下内容:
- 笔记本电脑发送:3 个 dhcp 请求和 9 个 icmpv6
- 笔记本电脑接收:0 个数据包
- 路由器发送:无? (ifconfig 显示 4 个数据包,但 tcpdump 没有捕获它们)
- 路由器收到:来自笔记本电脑发送列表的 2 个 icmp 数据包(如下所列)
我还检查了路由器上的 tcpdump,它没有显示丢失的数据包。看来问题出在驱动程序级别的某个地方。但是等等,vmlinux 的工作原理和驱动程序(内核模块)是相同的。
root@OpenWrt:/# tcpdump -vv -i eth0.3
tcpdump: WARNING: eth0.3: no IPv4 address assigned
tcpdump: listening on eth0.3, link-type EN10MB (Ethernet), capture size 65535 bytes
[ 1042.060000] Atheros AR8216/AR8236/AR8316 ag71xx-mdio.0:00: Port 2 is up
09:35:24.172637 IP6 (hlim 1, next-header Options (0) payload length: 36) :: > ff02::16: HBH (rtalert: 0x0000) (padn) [icmp6 sum ok] ICMP6, m]
09:35:25.872843 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::b2e3:928a:66b2:ff43 > ff02::2: [icmp6 sum ok] ICMP6, router6
source link-address option (1), length 8 (1): 5c:f9:dd:48:9e:89
0x0000: 5cf9 dd48 9e89
5c:f9:dd:48:9e:89 /fe80::b2e3:928a:66b2:ff43 - laptop, d4:ca:6d:92:a4:7e / fe80::d6ca:6dff:fe92:a47e: - router
静态ip场景:
openwrt (static 192.168.2.1)
root@OpenWrt:/# ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2): 56 data bytes
64 bytes from 192.168.2.2: seq=4 ttl=64 time=0.505 ms
64 bytes from 192.168.2.2: seq=21 ttl=64 time=0.489 ms
64 bytes from 192.168.2.2: seq=34 ttl=64 time=0.528 ms
64 bytes from 192.168.2.2: seq=39 ttl=64 time=0.512 ms
64 bytes from 192.168.2.2: seq=45 ttl=64 time=0.527 ms
64 bytes from 192.168.2.2: seq=48 ttl=64 time=0.549 ms
64 bytes from 192.168.2.2: seq=51 ttl=64 time=0.813 ms
^C
--- 192.168.2.2 ping statistics ---
56 packets transmitted, 7 packets received, 87% packet loss
round-trip min/avg/max = 0.489/0.560/0.813 ms
laptop (static 192.168.2.2)
14:50:08:andrew:/home/andrew:0
: ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
From 192.168.2.2 icmp_seq=13 Destination Host Unreachable
From 192.168.2.2 icmp_seq=14 Destination Host Unreachable
From 192.168.2.2 icmp_seq=15 Destination Host Unreachable
^C
--- 192.168.2.1 ping statistics ---
100 packets transmitted, 0 received, +3 errors, 100% packet loss, time 99022ms
pipe 3
14:51:53:andrew:/home/andrew:1
: ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
^C
--- 192.168.2.1 ping statistics ---
29 packets transmitted, 0 received, 100% packet loss, time 28080ms
所以这是我的问题:
我应该采取哪些步骤来更深入地了解问题所在?我想至少找到错误。我应该在某处设置调试级别吗?到底是什么原因导致如此巨大的丢包呢?
编辑
Netbooting vmlinux 产生相同的
Netbooting内核调试- 工作完美,不幸的是它的大小是 11mb,mtd1 太小,无法容纳它。
答案1
好吧我终于找到原因了。 Initramfs 并不是成功的关键。事实证明,如果按下重置按钮启动路由器,路由器就能正常工作。但看来闪光的驱动程序不能持续很长时间。使用几个小时后,路由器会重新启动,并出现内核恐慌,具体取决于加载率。