在 AWS 中,我需要帮助通过 public ip 或 public dns 拒绝 url 并仅允许按域访问 (CNAME)

In AWS I need help for deny url by public ip or public dns and to allow only access by domain (CNAME)

我有带弹性 ip 的 aws ec2 和带我域的 route53 并且在服务器中有 nginx,这工作正常但是,

我看过其他网站是如何工作的,amazon.com udemy.com。 如果直接通过 public ip 或 public dns 访问会抛出错误。 我的问题是如何配置它来做同样的事情。

示例:
浏览器 url 按域:amazon.com = ok
浏览器 url by public ip: 52.222.137.64 = 400-403 error.
浏览器 url by public dns: server-52-222-137-64.ams50.r.cloudfront.net = 400-403 error.

浏览器 url 按域:example.com = ok
浏览器 url by public ip: 124.34.32.245 = ok.
浏览器 url by public dns: ec2-124.34.32.245.eu-west-3.compute.amazonaws.com = ok.

感谢大家的帮助。

example 代替我的域,这是我的配置。

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;
    }
}

忘了说我也在用docker,不知道会不会有关系

在您的 nginx conf 中配置的服务器名称是什么?

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

如果你输入真实的名字,如果没有使用这个名字,你应该能够让它拒绝请求

我在提问之前想到了这个解决方案,但由于我是新手,我不知道这是否是一个好的做法。 添加到我的配置:

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 实例前面使用带有侦听器规则的应用程序负载均衡器,并将实际服务器放在 Auto Scaling 组中。

这提供了很多其他好处:

  • 如果您的工作负载无法在至少 2 个可用区之间实现负载平衡,AWS SLA 将不起作用
  • 添加 AWS 生成器 TLS 证书很简单(额外的好处:它会自动更新)
  • 内置一定数量的 DDoS 保护
  • 自动缩放
  • 实例刷新
  • 故障转移

请注意,为了让顶级域名正常工作,最好将实际域迁移到 AWS Route53,或者至少将控制权委托给 AWS。