TCP-сервер перегружен клиентами, которые только подключаются, не отправляя никаких данных

Я создал TCP-сервер с помощью .NET TcpListener.

У меня есть некоторые опасения по поводу того, как им можно злоупотреблять, рассылая множество фиктивных соединений, похожих на DoS-атаку.

Я создал небольшое консольное приложение, чтобы неоднократно инициировать подключение к серверу (только «подключение» без передачи других данных). «Максимально допустимый предел одновременных подключений», который является настройкой на сервере для предотвращения его перегрузки, был достигнут в одно мгновение. Это сделало мой сервер практически бесполезным, поскольку он не мог принимать новые соединения, если другие поддельные соединения не отключились. Это доказывает, что мои опасения небезосновательны.

Можем ли мы каким-либо образом предотвратить это на уровне приложения? Я думал потребовать, чтобы клиенты отправляли своего рода токен при подключении, и сервер отказывался бы от соединений, которые этого не делают, но я не думаю, что TCP работает таким образом.

Единственный способ полагаться на внешние решения? Например. VPN, брандмауэр, NAT и т. д.?


person Twisted Whisper    schedule 08.02.2017    source источник
comment
Пожалуйста, прочитайте Как спросить, поделитесь своим исследованием и задайте очень конкретный вопрос. Также предоставьте больше информации о характере услуги, чтобы сузить круг поиска. Насколько нам известно, у вас есть только один клиент, которому вы доверяете, и тогда вам поможет скрытие этого за VPN. Написание правильного, исчерпывающего ответа на вопрос как предотвратить злоупотребление услугами, подключенными к Интернету, было бы слишком долго.   -  person CodeCaster    schedule 08.02.2017
comment
На уровне приложения: если возможно, используйте безопасную и надежную библиотеку UDP, которая работает лучше, чем файлы cookie SYN. В противном случае, по крайней мере, реализуйте тайм-аут для уничтожения отдельных соединений, если данные не были получены в течение 5 секунд.   -  person o11c    schedule 08.02.2017
comment
Если вы хотите смягчить эту проблему, вы можете выбрать максимальное количество одновременных подключений; затем ведите счетчик того, сколько соединений у вас открыто в данный момент; когда счетчик достигает вашего порога и приходит другое TCP-соединение, выберите существующее TCP-соединение и закройте() его, тем самым не допуская превышения общего количества соединений вашего порога. (Постарайтесь выбрать самое старое существующее соединение, которое не отправляло никаких данных, чтобы плохие соединения не вытеснили хорошие)   -  person Jeremy Friesner    schedule 08.02.2017
comment
Спасибо за ваши комментарии. Я нахожу их очень проницательными. Хотя полностью устранить проблемы невозможно, по крайней мере, их смягчение на уровне приложений является хорошим началом.   -  person Twisted Whisper    schedule 08.02.2017


Ответы (1)


Установите тайм-аут чтения для каждого принятого сокета и закройте его, если он сработает.

person user207421    schedule 08.02.2017