如何阻止AWS弹性IP及公共DNS直接解析HTTP请求?
哈哈,这个问题我碰到过好多次了!要阻止直接用弹性IP或AWS公共DNS访问你的网站,最优方案其实是在Web服务器层面做域名校验——既高效又不用额外花钱,当然如果你的场景更复杂,也可以搭配AWS的服务来实现。下面给你分场景具体说:
方法一:Web服务器层面配置(最优推荐)
这是最直接的方案,所有非指定域名的请求(包括弹性IP、公共DNS)都会被拦截,完全不需要依赖AWS额外服务。
针对Nginx的配置
修改你的Nginx站点配置文件(通常在/etc/nginx/sites-available/或/etc/nginx/conf.d/下),添加一个默认server块来拦截非法请求:
# 默认server:匹配所有未指定域名的请求(IP、公共DNS都算) server { listen 80 default_server; listen [::]:80 default_server; server_name _; # 通配符匹配所有未被其他server块捕获的请求 return 403; # 直接返回禁止访问,也可以改成跳转到你的域名:return 301 https://your-domain.com$request_uri; } # 你的正常域名处理server块 server { listen 80; listen [::]:80; server_name your-domain.com www.your-domain.com; # 替换成你的实际域名 # 下面是你原本的网站配置 root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } }
配置完后重启Nginx生效:sudo systemctl restart nginx
针对Apache的配置
修改Apache的虚拟主机配置(通常在/etc/apache2/sites-available/下),设置默认虚拟主机拦截非法请求:
# 默认虚拟主机:拦截所有非指定域名的请求 <VirtualHost *:80> ServerName _default_ Redirect 403 / ErrorDocument 403 "Forbidden: Access only allowed via your official domain" </VirtualHost> # 你的正常域名虚拟主机 <VirtualHost *:80> ServerName your-domain.com ServerAlias www.your-domain.com DocumentRoot /var/www/html # 原本的网站目录权限配置 <Directory /var/www/html> AllowOverride All Require all granted </Directory> </VirtualHost>
配置完后重启Apache生效:sudo systemctl restart apache2
方法二:AWS WAF(适合多实例/复杂场景)
如果你用了ALB(应用负载均衡)或者有多个EC2实例,不想在每个服务器上单独配置,可以用AWS WAF统一拦截:
- 创建一个WAF规则,匹配HTTP请求的
Host头不等于你的域名(比如your-domain.com、www.your-domain.com) - 将这个规则设置为“阻止”动作,关联到你的ALB或CloudFront(如果用了CDN)
这种方案适合企业级场景,但会产生额外的WAF使用成本。
额外注意事项
- 如果你后续配置了HTTPS(强烈建议),记得在443端口的配置里也加上同样的默认拦截规则,不然通过IP访问HTTPS仍能绕过限制
- 要是用了CloudFront等CDN,也要在CDN的行为设置里开启“限制查看器访问”,只允许指定域名的请求通过,彻底堵死绕开CDN直接访问IP的可能
内容的提问来源于stack exchange,提问作者CryptoTex




