В AWS мне нужна помощь, чтобы запретить URL-адрес по общедоступному IP-адресу или общедоступному DNS и разрешить доступ только по домену (CNAME)

У меня есть aws ec2 с эластичным ip и route53 с моим доменом и nginx на сервере, это работает нормально, но

Я видел, как работают другие сайты, amazon.com udemy.com. Если вы получаете доступ напрямую через общедоступный IP-адрес или общедоступный DNS, вы выдаете ошибку. Мой вопрос в том, как я могу настроить его так, чтобы он делал то же самое. пример: адрес браузера по домену: amazon.com = ok URL-адрес браузера по общедоступному IP-адресу: 52.222.137.64 = ошибка 400-403. URL-адрес браузера по общедоступному DNS: server-52-222-137-64.ams50.r.cloudfront.net = ошибка 400-403.

Адрес браузера по домену: example.com = ok URL-адрес браузера по общедоступному IP-адресу: 124.34.32.245 = ok. URL-адрес браузера по общедоступному DNS: ec2-124.34.32.245.eu-west-3.compute.amazonaws.com = ok.

Спасибо всем за вашу помощь. пример заменяет мой домен, это мой конфиг.

server {
    listen                  8089 ssl http2;
    listen                  [::]:8089 ssl http2;
    server_name             example.com;
    root                    /var/www/example.com/public;

    # SSL
    ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
    #ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    ssl_dhparam             /etc/letsencrypt/ssl-dhparams.pem;

    # security
    include                 nginxconfig.io/security.conf;

    location / {
       proxy_set_header Accept-Encoding "";
        try_files $uri $uri/ /index.html;
    }

    # additional config
    include                 nginxconfig.io/general.conf;


}

server {
    listen      8080;
    listen      [::]:8080;
    server_name example.com;
    include     nginxconfig.io/letsencrypt.conf;

    location / {
       return 301 https://example.com$request_uri;
    }
}

Я забыл упомянуть, что я также использую докер, я не знаю, будет ли это иметь какое-то отношение к этому.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
375
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Какое имя сервера настроено в вашей конфигурации nginx?

Http://nginx.org/en/docs/http/server_names.html

Если вы укажете фактическое имя, вы сможете отклонить запрос, если имя не используется.

Спасибо за ответ. Я добавил часть моей конфигурации nginx и возможное решение, о котором я подумал, прежде чем спрашивать.

Juan Manuel 23.12.2020 10:09

Я придумал это решение, прежде чем спрашивать, но, поскольку я совсем новичок, я не знаю, будет ли это хорошей практикой. Добавляю в свой конфиг:

server {
   listen       8089;
   listen       [::]:8089;
  server_name my_public_ip or my public_dns => x.x.x.x;    

   location / {
        return 403;
   }
error_page 403 /403.html;
    error_page   501 =500  /50x.html;
    error_page   500 502 503 504  /50x.html;

  location /403.html {
    root      /usr/share/nginx/html;
   # allow all;
  }

    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

И поэтому я могу обращаться с этим, как я хочу.

Попробуйте добавить это

if ($host !~* ^(www.example.com)) {
            return 444;

}

Это даст 444 в качестве ответа на все запросы без вашего доменного имени.

Ответ принят как подходящий

Правильный способ решить эту проблему в «мире AWS» — использовать балансировщик нагрузки приложений с правилами прослушивателя перед вашим экземпляром EC2 и поместить ваш фактический сервер в группу автоматического масштабирования.

Это дает массу других преимуществ:

  • AWS SLA не работает, если ваша рабочая нагрузка не может сбалансировать нагрузку как минимум между двумя зонами доступности.
  • легко добавить сертификат TLS генератора AWS (дополнительный бонус: он будет автоматически обновляться)
  • встроить определенную защиту от DDoS
  • автоматическое масштабирование
  • обновление экземпляра
  • отказоустойчивость

Обратите внимание, что для того, чтобы доменное имя вершины работало, было бы лучше перенести фактический домен на AWS Route53 или, по крайней мере, делегировать управление AWS.

Другие вопросы по теме