У меня более или менее следующая конфигурация на 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, сделайте следующее:
VPC
.Network ACLs
из меню слева.Inbound Rules
таб.Edit
и добавьте новое правило со следующими атрибутами: Здесь есть много дополнительной информации о сетевых 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 тоже будут иметь эту функцию, но не сейчас.