Допустим, у моего приложения есть прослушивающий сокет UDP, и оно знает, с каких IP-адресов оно может получать дейтаграммы UDP. Все, что приходит с других IP-адресов, будет считаться вредоносной дейтаграммой и должно быть удалено как можно раньше, чтобы предотвратить DoS-атаки. Сложность заключается в том, что набор этих законных IP-адресов может динамически изменяться в течение времени жизни приложения (т. е. путем их динамического получения по каналу управления).
Как бы вы реализовали фильтрацию на основе исходного IP-адреса в приведенном выше случае?
Я вижу два решения, куда поместить эту логику фильтрации исходного IP-адреса:
- Реализуйте его в самом приложении после вызова recvfrom().
- Установите политику удаления по умолчанию в брандмауэре, а затем позвольте приложению установить правила брандмауэра, которые будут динамически добавлять в белый список законные IP-адреса.
Есть плюсы и минусы для каждого решения. Некоторые, которые приходят мне на ум:
- iptables может оказаться со сложностью фильтрации O(n) (против для iptables)
- iptables отбрасывает пакеты еще до того, как они попадут в буфер сокета (за iptables)
- iptables может быть не очень переносимым (против для iptables)
- iptables из моего приложения может мешать другим приложениям, которые также могут устанавливать правила iptables (против для iptables)
- если мое приложение устанавливает правила iptables, то оно потенциально может стать вектором атаки (против для iptables)
Где бы вы реализовали фильтрацию исходного IP-адреса и почему?
Можете ли вы назвать какие-либо приложения, которые соответствуют соглашению № 2 (администратор, устанавливающий вручную статические правила брандмауэра, не учитывается)?