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
$ 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
trb-main
(проверено с помощью tcpdump).ip6tables -Lv
по 6nfq-test
показать, что все 6 пакетов обработаны, полезная нагрузка изменена на ICMP Time Exceeded/proc/net/netfilter/nfnetlink_queue
показать, что пакеты правильно отправляются обратно в ядро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 ]
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
.