Назад | Перейти на главную страницу

Потеря пакетов между ip6tables mangle: POSTROUTING и tcpdump

ICMPv6 Time Exceeded Сетевые пакеты исчезают после изменения NFQUEUE. Я запускаю двоичный файл Rust на виртуальной машине Ubuntu 19.10, которая перехватывает и изменяет пакеты, чтобы возвращать настраиваемый ответ Time Exceeded.

-A TRB -d 2001:470:798e:dee::/64 -m hl --hl-lt 7 -j NFQUEUE --queue-num 1
-A PREROUTING -d 2001:470:798e:dee::/64 -m hl --hl-lt 7 -j TRACE
  1. Traceroute создает сетевые пакеты с увеличивающимся лимитом переходов (HL):
$ sudo traceroute -I --back -f 6 -m 12 -w 1 -N 20 -q 1 2001:470:798e:dee::febe
traceroute to 2001:470:798e:dee::febe (2001:470:798e:dee::febe), 12 hops max, 80 byte packets
 6  tserv1.ams1.he.net (2001:470:0:7d::2)  7.654 ms
 7  2001:19f0:5001:22a0::1 (2001:19f0:5001:22a0::1) '-11'  11.267 ms
 8  *
 9  *
10  2001:19f0:5001:22a0::4 (2001:19f0:5001:22a0::4) '-11'  20.963 ms
11  2001:19f0:5001:22a0::5 (2001:19f0:5001:22a0::5)  23.219 ms
12  2001:19f0:5001:22a0::6 (2001:19f0:5001:22a0::6) '-11'  25.214 ms
  1. Все 6 пакетов прибывают в маршрутизатор trb-main (проверено с помощью tcpdump).
  2. Счетчики увеличения правила NFQUEUE ip6tables -Lv по 6
  3. Журналы nfq-test показать, что все 6 пакетов обработаны, полезная нагрузка изменена на ICMP Time Exceeded
  4. Strace подтверждает, что системные вызовы сделаны правильно.
  5. Счетчики в /proc/net/netfilter/nfnetlink_queue показать, что пакеты правильно отправляются обратно в ядро
  6. Журналы ядра из правила TRACE показывают, что 6 пакетов проходят через таблицы / цепочки. mangle:FORWARD, filter:FORWARD и mangle:POSTROUTING
$ cat /var/log/kern.log | grep 'TRACE: mangle:POSTROUTING:policy'
Jun 18 08:10:19 trb kernel: [42921.807986] TRACE: mangle:POSTROUTING:policy:2 IN= OUT=ens3 SRC=2001:19f0:5001:22a0:0000:0000:0000:0001 DST=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e LEN=160 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6 TYPE=3 CODE=0 [SRC=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e DST=2001:0470:798e:0dee:0000:0000:0000:febe LEN=80 TC=0 HOPLIMIT=1 FLOWLBL=744166 PROTO=ICMPv6 TYPE=128 CODE=0 ID=15705 SEQ=2 ]
Jun 18 08:10:19 trb kernel: [42921.808287] TRACE: mangle:POSTROUTING:policy:2 IN= OUT=ens3 SRC=2001:19f0:5001:22a0:0000:0000:0000:0002 DST=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e LEN=160 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6 TYPE=3 CODE=0 [SRC=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e DST=2001:0470:798e:0dee:0000:0000:0000:febe LEN=80 TC=0 HOPLIMIT=2 FLOWLBL=744166 PROTO=ICMPv6 TYPE=128 CODE=0 ID=15705 SEQ=3 ]
Jun 18 08:10:19 trb kernel: [42921.808526] TRACE: mangle:POSTROUTING:policy:2 IN= OUT=ens3 SRC=2001:19f0:5001:22a0:0000:0000:0000:0003 DST=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e LEN=160 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6 TYPE=3 CODE=0 [SRC=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e DST=2001:0470:798e:0dee:0000:0000:0000:febe LEN=80 TC=0 HOPLIMIT=3 FLOWLBL=744166 PROTO=ICMPv6 TYPE=128 CODE=0 ID=15705 SEQ=4 ]
Jun 18 08:10:19 trb kernel: [42921.813225] TRACE: mangle:POSTROUTING:policy:2 IN= OUT=ens3 SRC=2001:19f0:5001:22a0:0000:0000:0000:0004 DST=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e LEN=160 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6 TYPE=3 CODE=0 [SRC=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e DST=2001:0470:798e:0dee:0000:0000:0000:febe LEN=80 TC=0 HOPLIMIT=4 FLOWLBL=744166 PROTO=ICMPv6 TYPE=128 CODE=0 ID=15705 SEQ=5 ]
Jun 18 08:10:19 trb kernel: [42921.814186] TRACE: mangle:POSTROUTING:policy:2 IN= OUT=ens3 SRC=2001:19f0:5001:22a0:0000:0000:0000:0005 DST=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e LEN=160 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6 TYPE=3 CODE=0 [SRC=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e DST=2001:0470:798e:0dee:0000:0000:0000:febe LEN=80 TC=0 HOPLIMIT=5 FLOWLBL=744166 PROTO=ICMPv6 TYPE=128 CODE=0 ID=15705 SEQ=6 ]
Jun 18 08:10:19 trb kernel: [42921.814979] TRACE: mangle:POSTROUTING:policy:2 IN= OUT=ens3 SRC=2001:19f0:5001:22a0:0000:0000:0000:0006 DST=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e LEN=160 TC=0 HOPLIMIT=63 FLOWLBL=0 PROTO=ICMPv6 TYPE=3 CODE=0 [SRC=2a02:a441:60e8:0000:ca9c:dcff:fe6a:ae6e DST=2001:0470:798e:0dee:0000:0000:0000:febe LEN=80 TC=0 HOPLIMIT=6 FLOWLBL=744166 PROTO=ICMPv6 TYPE=128 CODE=0 ID=15705 SEQ=7 ]
  1. Судя по всему, два пакета куда-то упали. У меня вопрос, как это может случиться.
  2. tcpdump -i ens3 'icmp6' показывает, что только пакеты 1, 4, 5 и 6 выходят из интерфейса

При повторении этого эксперимента 100 раз количество отброшенных пакетов меняется.

| Packet | Change of dropping |
| ------ | ------------------ |
|      1 |  0%                |
|      2 | 94%                |
|      3 | 85%                |
|      4 | 83%                |
|      5 | 72%                |
|      6 | 64%                |

Эта проблема возникает гораздо реже, когда traceroute работает медленнее (например, с флагом -z 200 для задержки 200 миллисекунд). Первый пакет почти никогда не сбрасывается. Таким образом, кажется, что проблема возникает только тогда, когда несколько пакетов должны быть обработаны за короткий промежуток времени.

Итак, что мешает ядру между ip6tables: POSTROUTING и tcpdump, что может привести к падению пакетов?

Изменить 2020-06-22: При отключенном UFW пакеты не отбрасываются. Когда я добавляю правило iptables с conntrack (хотя цепочка не используется), пакеты снова отбрасываются. Похоже, что netfilter_conntrack случайно игнорирует пакеты (например, https://www.linuxquestions.org/questions/linux-networking-3/why-is-ufw-iptables-blocking-packets-it-shouldn%27t-be-4175500239/). Настройка notrack заставляет пакеты обходить conntrack, так что это мой текущий обходной путь: ip6tables -t raw -I PREROUTING -d 2001:470:798e:dee::/64 -m comment -m hl --hl-lt 7 -j CT --notrack.