Блокировать входящий трафик с неразрешенного IP-адреса
Как я могу заблокировать весь входящий трафик с неразрешенных IP-адресов? Я использую CentOS с установленным WHM/cPanel. Я получаю огромный нежелательный трафик, и 95% от неразрешенных IP-адресов и только 5% от разрешенных IP-адресов. Есть ли простой способ заблокировать входящий трафик со всех неразрешенных IP-адресов?
Боюсь, у меня даже проблемы с DDOS-атаками, AWStats показывает, что у меня тысячи обращений каждую минуту, и ни один из них не полезен.
Любая помощь высоко ценится.
Спасибо
2 ответа
Если вы говорите о "неразрешенных IP", как это видно в AwStats, то нет. Нет способа сделать это с помощью брандмауэра.
"Неразрешенный" относится к тому факту, что для IP-адреса не настроен обратный DNS. Это становится нормой для "не серверов"! Это означает, что если бы вы могли блокировать на основе этого, вы бы заблокировали много линий DSL и других подключений домашнего пользователя.
Технически, блокировка IP на основе того, имеет ли он обратный DNS, потребует DNS-поиска для каждого нового IP-адреса. Поиск DNS может быть медленным, например, несколько секунд, и это просто замедлит все с удвоенной силой, что делает это встроенным в брандмауэр.
Сожалею.
Я согласен с @thelogix, что это, вероятно, очень плохая идея, поскольку она блокирует законных пользователей и - в зависимости от ее реализации - возможно, замедляет работу вашего сервиса.
Но если вы все еще хотите, вот два способа сделать это.
Во-первых, вы хотите настроить локальный кэш DNS для ускорения работы. Установите высокие TTL для отрицательного кэширования (в случае Bind ищите 'max-ncache-ttl'). И убедитесь, что ваша система на самом деле использует его.
Теперь у вас есть две возможные стратегии: когда приходит новый запрос клиента, хотите ли вы
Сначала выполните обратный поиск DNS и дождитесь его результата, прежде чем решить, принимать ли соединение? Veeerryy slowwww
Разрешить продолжение TCP-рукопожатия и задним числом заблокировать IP-адрес только после того, как вы узнали, что у него нет действительной записи PTR?
Для стратегии 1 (проверьте перед разрешением): многие веб-серверы могут выполнять аутентификацию клиента на основе обратного DNS. Возможно, вам придется немного поиграть с Regex или скомпилировать список всех TLD, чтобы настроить правило, соответствующее любому доменному имени, но без IP-адреса.
- Для Apache найдите Require host из модуля 'mod_authz_host', например
Требуется хост.com .net .org .edu .us .uk .jp # ... все TLD
- Для nginx найдите rdns_allow из стороннего модуля 'HttpRdnsModule'. Я не использовал это сам, но что-то вроде этого должно работать:
rdns_allow. * [a-zA-Z]; отрицать все;
Если ваш веб-сервис не поддерживает эту функцию, вы можете поместить nginx или apache в качестве обратного http-прокси.
Для стратегии 2 (блокировать лениво): Сделайте, чтобы веб-служба регистрировала обратное DNS-имя клиента (Apache: HostnameLookups; nginx: не уверен, возможно, снова над модулем rDNS снова). Затем установите fail2ban. Большинство дистрибутивов Linux поставляются с предварительно настроенным пакетом fail2ban. Настройте его для просмотра веб-журнала, сопоставления (неразрешенных) IP-адресов и блокировки этого самого IP-адреса.
Обратите внимание, что fail2ban по умолчанию блокирует в таблице фильтра iptables. В большинстве случаев это не будет блокировать TCP-соединения, которые уже установлены. Если вы хотите, чтобы fail2ban обрезал установленные соединения, настройте его на "DROP" в таблице "mangle" (например, цепочки mangle "PREROUTING" или "INPUT")