В качестве защиты от распределенного 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 (или поверх любого другого протокола без сохранения состояния), вы должны помнить об этом и применять надлежащие критерии проектирования, чтобы сделать протокол устойчивым к попыткам подделки. Если вы не разрабатываете протокол, все, что вы можете сделать, это попросить людей, которые разрабатывают протокол, сделать это правильно.