Запретить IP-адрес на AWS ELB
У меня более или менее следующая конфигурация на AWS:
Эластичный балансировщик нагрузки с 3-мя машинами o 3 разных зоны доступности. Моя группа безопасности разрешает 0.0.0.0/0:80, так как это мое приложение rails (nginx, unicorn).
Мне было интересно, есть ли способ запретить доступ к моему приложению на определенный публичный IP-адрес? Я читал документацию по AWS, но поскольку SG "запрещают все", нет способа отказать только один конкретный IP-адрес.
Есть идеи? iptables на 3 машины за балансировщиком нагрузки?
Спасибо!
5 ответов
Прямое решение состоит в том, чтобы использовать входящее правило ACL сети VPC. Это работает, только если ваш ELB находится в VPC, но если вы создали его в последние несколько лет, он должен быть по умолчанию.
Например, чтобы запретить 1.2.3.4, сделайте следующее:
- Авторизуйтесь в AWS.
- Перейдите к
VPC
, - выберите
Network ACLs
из меню левой руки. - Выберите ACL, связанный с VPC, в котором находится ваш ELB.
- Выбрать
Inbound Rules
Вкладка. - выберите
Edit
и добавьте новое правило со следующими атрибутами:- Правило №: 50 (любое число, если оно меньше, чем правило, которое РАЗРЕШАЕТСЯ от ВСЕХ)
- Тип: ВСЕ Трафик
- Протокол: ВСЕ
- Диапазон портов: ВСЕ
- Источник: 1.2.3.4/32
- Разрешить / Запретить: DENY
Здесь есть много дополнительной информации о сетевых ACL: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html
С помощью балансировщика нагрузки приложения вы можете остановить трафик с помощью правила прослушивателя.
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-update-rules.html
Если вам нужно занести в черный список только несколько IP-адресов, вы можете использовать nginx_http_access_module на вашем веб-сервере.
Нет, нет возможности заблокировать IP с группой безопасности.
Группа безопасности - это, по сути, белый список, а не черный список.
Все по умолчанию запрещено, и вы можете выборочно открывать порты в соответствии с вашими потребностями, но вы не можете заблокировать никаких конкретных людей /ip.
Для этого лучшим решением, как вы сказали, являются IPtables на 3 разных компьютерах.
Я уверен, что в будущем группы безопасности AWS также будут иметь эту функциональность, но не сейчас.
Для этого лучшим решением, как вы сказали, являются IPtables на 3 разных компьютерах.
На самом деле, это не очень хорошее решение, как удаленный IP ($remote_addr
в Nginx) будет от loadbalancer 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;
Это не красиво, но надеюсь, что это помогает