Заблокировать прямой доступ к порту 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; }