Назад | Перейти на главную страницу

Запретить IP-адрес на AWS ELB

У меня более или менее следующая конфигурация на AWS:

Эластичный балансировщик нагрузки с 3 машинами или 3 различными зонами доступности. Моя группа безопасности разрешает 0.0.0.0/0:80, поскольку это мое приложение rails (nginx, unicorn).

Мне было интересно, есть ли способ запретить моему приложению доступ к определенному общедоступному IP-адресу? Я читал документацию AWS, но поскольку SG «отрицают все», отрицать невозможно. только один конкретный IP-адрес.

Любые идеи? iptables на 3 машинах за балансировщиком нагрузки?

Спасибо!

Простое решение - использовать правило для входящего сетевого ACL VPC. Это работает, только если ваш ELB находится в VPC, но если вы создавали его в последние несколько лет, он должен быть по умолчанию.

Например, чтобы забанить 1.2.3.4, сделайте следующее:

  1. Войдите в AWS.
  2. Перейдите к VPC.
  3. выберите Network ACLs из меню слева.
  4. Выберите ACL, связанный с VPC, в котором находится ваш ELB.
  5. Выбрать Inbound Rules таб.
  6. выберите Edit и добавьте новое правило со следующими атрибутами:
    • Правило №: 50 (любое число, если оно меньше, чем правило, РАЗРЕШАЮЩЕЕ от ВСЕХ)
    • Тип: ВСЕ трафик
    • Протокол: ВСЕ
    • Диапазон портов: ВСЕ
    • Источник: 1.2.3.4/32
    • Разрешить / Запретить: ОТКАЗАТЬ

Здесь есть много дополнительной информации о сетевых ACL: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html

Как вы сказали, лучшим решением для этого является использование IPtables на трех разных машинах.

На самом деле это не лучшее решение, поскольку удаленный ip ($remote_addr в Nginx) будет из балансировщика нагрузки Amazon. Блокировка, при которой весь перенаправляемый трафик будет заблокирован.

Вам нужно будет проверить пакеты и найти HTTP X-Forwarded-For заголовок, IPtables не поддерживает такой протокол.

Я остановился на следующем решении 2 непослушных IP-адресов в Nginx

set $client_ip $remote_addr;
if ($http_x_forwarded_for) {
  set $client_ip $http_x_forwarded_for;
}

if ($client_ip = "123.123.123.123") {
  return 403;
}

if ($client_ip = "123.123.123.234") {
  return 403;
}

Представляем переменную $client_ip, просто чтобы я мог протестировать это локально, где нет http_x_forwarded_for доступный..

Немного оффтоп, но для удобства, я также добавил этот клиентский ip в свои журналы доступа:

log_format main "\$client_ip - \$remote_user [\$time_local] \"\$request\" \$status \$body_bytes_sent \"\$http_referer\" \"\$http_user_agent\"";
access_log /var/log/nginx.access.log main;

Это некрасиво, но надеюсь, что это поможет

Если вам нужно внести в черный список только несколько IP-адресов, вы, вероятно, можете использовать nginx_http_access_module на вашем веб-сервере.

Нет, нет возможности заблокировать IP-адреса с группой безопасности.

Группа безопасности - это, по сути, белый список, а не черный список.

По умолчанию все запрещено, и вы можете выборочно открывать порты в соответствии с вашими потребностями, но вы не можете заблокировать каких-либо конкретных людей / IP.

Как вы сказали, лучшим решением для этого является использование IPtables на трех разных машинах.

Я уверен, что в будущем группы безопасности AWS тоже будут иметь эту функцию, но не сейчас.