ophub / amlogic-s9xxx-armbian

Support for Armbian in Amlogic, Rockchip and Allwinner boxes. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk3568, rk3399, rk3328, h6, etc.
GNU General Public License v2.0
6.18k stars 1.98k forks source link

系统会丢弃特定条件下收到的连续两个UDP包,导致盒子上的DNS服务收不到连续的IPv4和IPv6解析请求 #2497

Open ccyybn opened 2 months ago

ccyybn commented 2 months ago

Device Information | 设备信息

Armbian Version | 系统版本

Bookworm 和 Noble 上测试过,均存在问题

Describe the bug | 问题描述

问题背景:

最近在N1盒子上启动了个DNS解析服务,用来给局域网提供域名解析,在开启了IPv6的情况下发现了这个问题

在IPv6开启的情况下,某些操作系统在解析域名的时候,会同时发送两个UDP解析请求,分别解析IPv4和IPv6

这时该UDP请求包会被盒子系统Drop掉,导致DNS服务收不到请求,盒子上执行 sudo tcpdump -n udp port 53

只显示出了A请求,AAAA请求直接没显示(实际上A请求也被丢掉了,DNS服务也收不到),有四行输出是发送端在不断重试

image

这时执行 netstat -s,会发现 UDP 的 packet receive errors 变大了,新增大小刚好是发送端重试次数x2,说明A和AAAA都被丢弃了

image

期望行为:

在安装了官方Ubuntu系统的x86服务器上启动DNS解析服务,该问题不存在,如下图 sudo tcpdump -n udp port 53的输出

前两行分别为A和AAAA连续两个解析请求,发送源端口均为45400,后两行是解析响应

image

复现问题:

为了简化问题,写了个python脚本发送UDP数据给盒子

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送第一个数据包
s.sendto(bytes.fromhex('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), ('192.168.31.10', 53))
# 连续发送第二个数据包
s.sendto(bytes.fromhex('bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'), ('192.168.31.10', 53))

在盒子上同样启动一个python脚本,用来观察数据包是否收到

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('0.0.0.0', 53))
while True:
    message, address = s.recvfrom(1024)
    print(message)

可以修改发送脚本,观察盒子上数据是否收到,实测当下面条件成立时,盒子上的程序无法收到UDP包

ccyybn commented 2 months ago

有些域名解析客户端,虽然会连续发送A和AAAA解析请求,但是是在不同的socket内发送的,可以规避掉这个问题

下面发送源端口分别为3486245519,则一切正常

image

ccyybn commented 2 months ago

刚试了一下,用这里的 5.15.164-ophub 内核没有这个问题,不知道是Linux官方的问题,还是这里适配出来的问题

ophub commented 2 months ago

我只是改了启动让系统能在更多设备上启动起来,系统服务都是原版的。

ccyybn commented 2 months ago

我只是改了启动让系统能在更多设备上启动起来,系统服务都是原版的。

确实,测试了6.1系的内核6.1.106.tar.gz也是好的,似乎只是6.6.y的有问题,不知道 @unifreq 他们有没有动这部分,还是官方内核就这样,ubuntu官方现在是6.8也是好的

ccyybn commented 2 months ago

@ophub 我编译了官方Linux 6.6.47 内核跑在盒子上,确认没有问题,但是 unifreq和 codesnas的适配 6.6.47 内核都有这个问题,我不懂内核代码,也不知道有什么区别,但是用官方内核的话似乎会有一些其他小的兼容性报错

ophub commented 2 months ago

从5.4到6.6有5个内核可以使用,不要用6.6。

fbt9910 commented 2 months ago

6.6有5个内核可以使用,不要用6.6。

6.46 6.47都出现上面问题导致Python3 跑脚本DNS报错 6.6内核 现在那个版本比较好用

ophub commented 2 months ago

最新版本里调整了这个UDP的补丁,你测试正常了吧。

ccyybn commented 2 months ago

最新版本里调整了这个UDP的补丁,你测试正常了吧。

那我试试

ccyybn commented 2 months ago

最新版本里调整了这个UDP的补丁,你测试正常了吧。

是编译 6.6.48 这个吗

ophub commented 2 months ago

ccyybn commented 2 months ago

@ophub 新内核没问题了

goldsoft8888 commented 5 days ago

6.6.48-6.6.52 没有问题,6.6.53到最近的6.6.60,是否又有这方面的问题了?我跑WIREGUARD, 很不正常 6.6.48之前的版本也是同样的问题。 我用armbian-update -k 6.6.52 VPN网络正常,同样方法试了之后其它几个版本,都不正常,这是个严重的问题。

ccyybn commented 3 days ago

6.6.48-6.6.52 没有问题,6.6.53到最近的6.6.60,是否又有这方面的问题了?我跑WIREGUARD, 很不正常 6.6.48之前的版本也是同样的问题。 我用armbian-update -k 6.6.52 VPN网络正常,同样方法试了之后其它几个版本,都不正常,这是个严重的问题。

你可以用我上面贴的python脚本试一下,修改里面的ip地址和包大小,确定是不是这个问题,'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' 刚好为18字节,每两个字母一个字节

ccyybn commented 3 days ago

@ophub @goldsoft8888 我测试了一下,版本 6.6.58-ophub,这个问题又出现了

goldsoft8888 commented 3 days ago

这个只能等版主升级了,我暂时用老版本的,等6.6.66版出来时,搞稳定点,就不准备换了,这个数吉利 x86 版我用的armbian官方6.6.51版的,正常

ccyybn commented 3 days ago

@goldsoft8888 @ophub 似乎内核不是ophub维护的,但是他可以联系到内核大佬修复,就像上次一样?

goldsoft8888 commented 3 days ago

最新版本里调整了这个UDP的补丁,你测试正常了吧。

等老大修改,已经实锤了。 6.1.116 基本正常 image