Диагностика проблем прохождения фрагментированных UDP-пакетов через Firewall
- Большие DNS-ответы с DNSSEC записями (EDNS0 > 512 байт) завершаются по таймауту, в то время как стандартные короткие A-записи резолвятся мгновенно.
- Потеря части сообщений Syslog или метрик SNMP при передаче больших пакетов через межсетевые экраны.
- Сетевая файловая система NFS по протоколу UDP зависает при операциях чтения/записи файлов большого размера.
- Межсетевой экран генерирует ошибки
Fragmented packet dropped: non-initial fragment without state.
1. Анатомия фрагментации UDP и проблема Stateful Firewalls
В отличие от TCP, протокол UDP не имеет встроенных механизмов согласования размера сегмента (MSS). Если UDP-датаграмма превышает MTU интерфейса (например, 1500 байт), она разбивается на 2 или более IP-фрагмента:
- Первый фрагмент (Initial Fragment / Offset = 0): содержит IP-заголовок и UDP-заголовок с номерами портов источника и назначения.
- Последующие фрагменты (Non-initial Fragments / Offset > 0): содержат только IP-заголовок и тело данных. В них ОТСУТСТВУЮТ UDP-порты!
Межсетевой экран с контролем состояния (Stateful Firewall) не может определить порт назначения для второго фрагмента и сбрасывает его, если отключен механизм виртуальной реассемблирования (Virtual IP Reassembly).
2. Настройка виртуальной сборки фрагментов на Firewall
# Разрешение сборки фрагментов на Cisco ASA
fragment chain 24 GigabitEthernet0/0
fragment timeout 5 GigabitEthernet0/0
# Настройка FortiGate (включение Virtual IP Reassembly)
config system global
set ip-reassembly enable
end
# Linux iptables: правильная обработка фрагментов в Connection Tracking
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -f -j ACCEPT # Разрешение фрагментов, прошедших conntrack3. Ограничение размера DNS-пакетов (EDNS0 Buffer Size)
Для предотвращения фрагментации ответов DNS настройте буфер EDNS0 на DNS-серверах (BIND9 / Unbound / PowerDNS) в безопасное значение 1220–1232 байта:
# /etc/bind/named.conf.options (BIND9)
options {
edns-udp-size 1232;
max-udp-size 1232;
};4. Захват фрагментированных UDP-пакетов в tcpdump
# Захват IP-пакетов с установленным флагом More Fragments (MF) или Offset > 0
tcpdump -nnvv -i eth0 'ip[6:2] & 0x3fff != 0' Частые вопросы (FAQ)
Почему фрагментация UDP пакетов считается уязвимостью безопасности?
Злоумышленники используют фрагментацию для атак обхода межсетевых экранов (Tiny Fragment Attack, Overlapping Fragments/Teardrop), подменяя смещения смежных фрагментов и скрывая вредоносный код от систем сигнатурного анализа (IPS).
Что делает DNS-сервер, если фрагментированный UDP-ответ от авторитативного сервера блокируется?
Если клиент или резолвер не получает ответ по UDP, он сбрасывает размер буфера и переходит в режим fallback, отправляя запрос по протоколу TCP через порт 53 (флаг TC=1 / Truncated).
Как тайм-аут сборки IP-фрагментов (ipfrag_time) влияет на производительность ядра Linux?
Если в сети теряются отдельные фрагменты, ядро Linux держит неполные пакеты в оперативной памяти в течение 'ipfrag_time' (по умолчанию 30 сек). При высокой нагрузке это может вызвать исчерпание лимита 'ipfrag_high_thresh' и сброс легитимного трафика.
Почему NFS v3/v4 рекомендуется использовать строго поверх TCP?
NFS генерирует блоки данных размером 32–64 КБ (rsize/wsize). Поверх UDP один такой блок разбивается на 20–40 фрагментов. Потеря ВСЕГО ОДНОГО фрагмента приводит к необходимости полной повторной передачи всех 64 КБ.