如何限制ASP.NET MVC站点仅允许DNS访问,屏蔽IP直连?
当然可以实现这个需求!下面我给你几个不同层级的解决方案,从应用代码到AWS基础设施层面都有,你可以根据自己的情况选最合适的:
方案1:ASP.NET MVC 应用层直接拦截(无需修改EB配置)
这是最直接的方式,不用动AWS后台的配置,直接在应用里加请求检查逻辑,能拦截所有通过IP访问的请求——包括控制器接口、图片、脚本这些静态资源。
你可以在Global.asax里的Application_BeginRequest方法里加判断:
protected void Application_BeginRequest() { var requestHost = Request.Url.Host; // 检查请求的Host是否是IP地址(兼容IPv4和IPv6) if (IsIpAddress(requestHost)) { Response.StatusCode = 403; Response.ContentType = "text/plain"; Response.Write("Access denied: Please use our official domain."); Response.End(); // 也可以选择永久重定向到你的域名,比如: // Response.RedirectPermanent($"https://example.com{Request.Url.PathAndQuery}"); } } private bool IsIpAddress(string host) { // 用.NET内置方法判断是否为合法IP return System.Net.IPAddress.TryParse(host, out _); }
这个方法会在每个请求进来时先做检查,只要是IP访问就直接返回403,完全符合你的需求。
方案2:利用Elastic Beanstalk负载均衡器拦截(基础设施层)
如果你的EB环境用了Application Load Balancer(ALB),可以直接在负载均衡器层面拦截IP请求,不用让请求传到应用服务器,能节省资源。
操作步骤大概是:
- 登录AWS控制台,进入EC2服务,找到你的EB环境对应的负载均衡器
- 切换到「监听器」标签,编辑HTTPS/HTTP的监听器规则
- 新增一条规则,条件选「主机头」,匹配方式设为「不等于」,输入你的域名
example.com(多个域名可以加多个条件) - 动作选择「返回固定响应」,状态码设为403,还可以自定义提示内容
- 把这条规则移到所有规则的最前面,确保优先执行
这样所有通过负载均衡器IP的请求,都会被直接拦截返回403。
方案3:修改EB的Web服务器配置(Nginx/Apache)
如果你的EB环境用的是Nginx(.NET Core环境默认是Nginx,.NET Framework也可以配置)或者Apache,可以修改服务器配置文件来拦截IP访问。
比如对于Nginx,你可以在项目根目录的.ebextensions文件夹里创建nginx-block-ip.config:
files: "/etc/nginx/conf.d/block_ip_access.conf": mode: "000644" owner: root group: root content: | server { listen 80; listen 443 ssl; # 匹配所有IPv4和IPv6格式的Host头 server_name ~^\d+\.\d+\.\d+\.\d+$ ~^\[?[0-9a-fA-F:]+\]?$; return 403 "Access denied: Use official domain only"; }
部署后,Nginx会直接拦截所有IP访问的请求,返回403。如果是Apache环境,类似地可以通过配置Rewrite规则实现同样效果。
注意事项
- 如果你用了ALB,要注意ALB本身也有公网IP,所以不管用哪种方案,都要确保IP访问的路径被覆盖到
- 测试时记得验证静态资源的拦截情况,比如直接访问
https://1.2.3.4/scripts/app.js,应该返回403 - 如果有CDN等前端代理,要确保CDN请求时传递正确的Host头,避免误拦截
内容的提问来源于stack exchange,提问作者coach_rob
相关产品推荐
相关产品推荐

