DanielLavrushin:b4 并发 A+AAAA 丢 AAAA 源于 DNS 入队晚于 conntrack,1.85.1 改到 raw 表
针对「iptables 队列 UDP 53 规则生效时并发 A+AAAA 查询丢 AAAA 应答」,DanielLavrushin 确认根因是 b4 在 conntrack 建好记录之后才把 DNS 请求入队:同一 socket 的第二个请求在前一个排队期间拿到自己的记录,4.18 之前的内核在确认时把它丢弃(insert_failed),路由器自身的上游请求也因此被延迟;内核 4.9 上复现时 30 个 AAAA 应答丢了 29–30 个。1.85.1 改为从 raw 表入队(早于 conntrack),作者请反馈方升级后关闭原脚本并删除其四条 RETURN 规则,确认系统信息里「DNS 请求入队早于 conntrack(raw)」为「可用」,再用 dnspair 复测无丢包、`nf_conntrack` 的 insert_failed 不再增长。
作者原文@DanielLavrushin@kolmakova привет
Спасибо за подробную issue, очень помогло.
Ага все верно в итоге. b4 ставил днс запросы в очередь уже после того, как conntrack создал для них запись. Второй запрос с того же сокета, пришедший, пока первый ждал в очереди, получал свою запись, и ядра до 4.18 отбрасывали его при подтверждении (
insert_failed). По той же причине задерживались и собственные запросы роутера к апстриму. На ядре 4.9 это воспроизвелось: без исправления терялись 29-30 ответов AAAA из 30, с ним - ни одного.В 1.85.1 запросы ставятся в очередь из таблицы
raw, раньше conntrack, и второй запрос застаёт запись первого уже подтверждённой.Проверь, пожалуйста:
- Обновите b4 до 1.85.1, отключить свой скрипт и удалить его четыре правила RETURN
- В настройках -> Информация о системе, в разделе Возможности ядра, у строки
DNS-запросы в очереди раньше conntrack (raw)должно стоятьдоступно.- можно проверить думаю через тот же
python3 dnspair.py 192.168.1.1 20 yandex.ru: потерь быть не должно, иinsert_failedв/proc/net/stat/nf_conntrackне должен расти.Если в строке «недоступно» (тогда в логе есть предупреждение, что DNS-запросы ставятся в очередь в таблице mangle), можно скинуть вывод
lsmod | grep rawиiptables -t raw -Sпо возможности