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

Как удалить первый пакет udp из источника с помощью iptables?

В качестве защиты от распределенного udp-флуда мне нужно отбросить первый udp-пакет от источника и принять другой пакет, кроме первого. Есть ли у iptables возможность сделать это? Если да, то как?

Я не знаю, есть ли у iptables функция, подобная той, о которой вы просите, но я могу объяснить, почему такая функция вам не поможет.

Если вы получаете поток нежелательных UDP-пакетов, они могут быть нацелены на закрытый или открытый порт. Если они нацелены на закрытый порт, ядро ​​отправит правильный ответ об ошибке ICMP. Этот ответ на ошибку важен, потому что без него отладка сетевых проблем становится затруднительной, и в определенных сценариях этот ответ на ошибку также является единственным способом узнать о продолжающихся атаках и смягчить их.

Поток пакетов UDP, предназначенных для закрытого порта, может привести к потоку сообщений об ошибках ICMP. Но приличный стек автоматически ограничит количество сообщений об ошибках, так что это не должно вызывать беспокойства. Пропускная способность, потребляемая пакетами UDP, в первую очередь тратится впустую, и вы не собираетесь менять это, отбрасывая пакет после того, как он уже потратил впустую пропускную способность.

Если пакеты UDP предназначены для открытого порта, все становится немного сложнее. Из-за того, что UDP не имеет состояния, пакеты доставляются в приложение без каких-либо шансов, что ядро ​​или приложение узнают, является ли исходный IP-адрес реальным или поддельным. Протокол более высокого уровня несет ответственность за проверку IP-адреса источника, если это необходимо. DNS и NTP являются примерами протоколов, которые потерпели неудачу и могут быть использованы для атак отражения / усиления.

Многие службы на основе UDP могут обрабатывать большие потоки пакетов UDP из-за их природы без сохранения состояния. Если они не сохраняют состояние, это просто пакет вошел - пакет вышел и забыл. Службе на самом деле все равно, был ли исходный IP-адрес законным или нет, и из-за того, что служба не имеет состояния, поток пакетов с поддельным источником не может привести к потере памяти на состоянии.

Однако, если вы должны были развернуть брандмауэр, который отбрасывает первый пакет UDP от источника и пропускает последующие пакеты, то брандмауэр должен поддерживать состояние. Без состояния он не мог знать, был ли пакет первым или нет.

Итак, теперь вы поставили межсетевой экран с отслеживанием состояния перед службой без отслеживания состояния, взаимодействующей с протоколом без отслеживания состояния. На этом этапе поток пакетов с поддельным источником по-прежнему не приведет к отключению службы, однако приведет к отключению межсетевого экрана. Межсетевой экран должен помнить источник каждого полученного пакета. Таким образом, брандмауэру не хватит памяти, и ему придется забыть некоторые из ранее полученных пакетов. Это означает, что даже для законных источников 2-й, 3-й и т. Д. Пакеты будут отброшены, потому что межсетевой экран просто не может вспомнить, что он видел более ранние пакеты от этого источника.

Таким образом, запрашиваемая функция превратит относительно безобидную попытку DoS в гораздо более мощную атаку против вашего брандмауэра.

В подобном сценарии нет ничего нового. Десятилетия назад TCP-стеки были уязвимы для SYN-флуда, которые могли бы DoS-атаковать сервис по тем же причинам, о которых говорилось выше. Вот почему были изобретены файлы cookie SYN.

Если вы разрабатываете какой-либо новый протокол для работы поверх UDP (или поверх любого другого протокола без сохранения состояния), вы должны помнить об этом и применять надлежащие критерии проектирования, чтобы сделать протокол устойчивым к попыткам подделки. Если вы не разрабатываете протокол, все, что вы можете сделать, это попросить людей, которые разрабатывают протокол, сделать это правильно.