Безопасное программирование сокетов UDP
Каковы хорошие практики программирования в отношении блокировки DoS-атак на UDP-клиент / сервер? Единственное, что приходит на ум в данный момент, это игнорирование пакетов с неверными источниками, как таковыми (с использованием WinSock2):
if (oSourceAddr.sa_family == AF_INET) {
uSourceAddr = inet_addr(oSourceAddr.sa_data);
if (uSourceAddr == oCorrectDestAddr.sin_addr.S_un.S_addr) {
queueBuffer.push(std::string(aBuffer));
}
}
Достаточно быстрые атаки могут привести к блокировке цикла - особенно если размер пакета небольшой. Есть ли способ, которым я могу предотвратить поступление пакетов из определенного источника или любого другого источника, кроме правильного? Какие еще вещи я должен высматривать? Объяснение в форме кода будет особенно полезно, если решения уже встроены в API.
1 ответ
Есть ли способ, которым я могу предотвратить поступление пакетов из определенного источника или любого другого источника, кроме правильного?
Да. Просто connect()
сокет к этому правильному источнику. Затем UDP отфильтрует все дейтаграммы с других адресов. Смотрите man 2 connect, параграф о сокетах SOCK_DGRAM.