Заблокировать прямой доступ к порту 80 на IP-адресе по умолчанию с помощью iptables?

Я использую nginx с cloudflare перед моими сайтами, чтобы защитить их от атак уровня 7, но теперь некоторые злоумышленники нашли этот новый способ, и они ежедневно атакуют мой IP-адрес по умолчанию непосредственно атакой уровня 7 вместо того, чтобы атаковать сайты. Я возвращаю 444 ответ на них, когда они открывают страницу по умолчанию на прямом IP-адресе, но атаки все еще слишком велики, поэтому они делают весь сайт / сервер недоступным в течение нескольких минут, а иногда и в течение более длительного периода, в зависимости от того, как Nginx занята.

Поэтому я хотел спросить, можно ли отключить доступ к порту 80 на ip по умолчанию, не затрагивая другие мои сайты и службы? Эти атаки слишком велики, так что мой файл журнала для vhost по умолчанию становится менее 1 ГБ менее чем за 1 час, так что даже возвращение 444 не работает, поэтому я думаю, что блокировка на уровне брандмауэра будет лучше?

Любое предложение, как добиться этого с iptables?

Я использую CentOS 6.9 с Ngiinx 1.13.

Есть еще идеи? Все еще жду!

1 ответ

Вы можете настроить правила iptables, чтобы только IP-адреса CloudFlare могли подключаться к вашему экземпляру Nginx через порт 80 и т. Д. Это можно сделать, сначала создав ipset со списком диапазонов IPv4 CloudFlare (доступно по адресу https://www.cloudflare.com/ips-v4), затем примените соответствующие правила iptables для использования этого набора.

Должно работать что-то вроде ниже:

ipset -N cloudflare nethash

ipset -q -A cloudflare A.B.C.D/M
... [ repeat above for each entry in CF ips-v4 file ]

iptables -A INPUT -p tcp --dport 80 -m set --match-set cloudflare src -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP

Дальнейший трюк Nginx с использованием заголовка CloudFlare Ray-ID

Для каждого сайта, у которого есть CloudFlare перед этим, вы также можете применить этот трюк в Nginx. Эффективно проверяет существование CloudFlare CF-Ray заголовок, в ожидаемом формате. Если это НЕ существует, возвращается 444 (немедленное отбрасывание запроса).

server {
    listen A.B.C.D:80;
    server_name _;
    if ($http_cf_ray !~ '^[0-9a-f]{16}-[A-Z]{3}$') { return 444; }
...

Я полагаю, что вы могли бы также отключить ведение журнала на этом этапе, чтобы дополнительно уменьшить любой чрезмерный шум журнала (непроверенный):

    if ($http_cf_ray !~ '^[0-9a-f]{16}-[A-Z]{3}$') { access_log off; error_log off; return 444; }
Другие вопросы по тегам