在 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。
我有带弹性 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。