Как отбросить первый udp пакет из источника с iptables?

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

0
задан 17 November 2014 в 11:17
1 ответ

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

1
ответ дан 4 December 2019 в 17:07

Теги

Похожие вопросы