如何用.NET判断请求是否绕过CDN?
.NET 检测访客是否绕过CDN或直接访问服务器IP
核心思路与可行方案
1. 利用CDN专属请求头判断
绝大多数CDN服务商在转发请求时,会在HTTP头中添加专属标识字段传递真实访客IP,此时请求的RemoteIpAddress会是CDN节点IP而非访客IP。常见的头字段包括:
X-Forwarded-For:通用转发头,多数CDN会填充X-Real-IP:部分CDN使用的真实IP字段- 服务商专属头:比如Cloudflare的
CF-Connecting-IP、阿里云CDN的Ali-Cdn-Real-IP
在.NET中可通过以下逻辑判断:
- 如果请求存在上述CDN转发头,且
RemoteIpAddress属于你所用CDN的IP段(可从CDN官方获取),说明请求通过CDN正常访问 - 若没有这些转发头,或
RemoteIpAddress不在你的CDN IP段内,大概率是访客绕过了CDN,或直接用服务器IP访问
2. 检查Host头判断直接IP访问
这是最直接的方法:用户直接用服务器IP访问时,HTTP请求的Host头值就是服务器IP;通过CDN正常访问时,Host头是你的域名。
在.NET中可直接校验:
public bool IsDirectIpAccess(HttpRequest request, string yourServerIp) { return string.Equals(request.Host.Value, yourServerIp, StringComparison.OrdinalIgnoreCase); }
返回true即表示访客直接用服务器IP访问。
3. 基于自有CDN IP段的比对
你提到无法获取所有CDN的IP,但可以获取自己正在使用的CDN服务商公布的官方IP段(比如Cloudflare、阿里云等都会公开节点IP范围)。将这些IP段存入配置后,在.NET中判断当前请求的RemoteIpAddress是否属于这些段:
- 若属于,说明请求来自你的CDN节点,是正常访问
- 若不属于,说明请求绕过了你的CDN(可能是直接访问服务器IP,或通过其他未授权CDN)
代码示例:获取真实访客IP
public string GetRealVisitorIp(HttpRequest request) { // 优先读取CDN专属头,比如Cloudflare的CF-Connecting-IP var cfIp = request.Headers["CF-Connecting-IP"].FirstOrDefault(); if (!string.IsNullOrEmpty(cfIp)) { return cfIp.Trim(); } // 读取通用转发头X-Forwarded-For(注意可能包含多个IP,取第一个) var forwardedFor = request.Headers["X-Forwarded-For"].FirstOrDefault(); if (!string.IsNullOrEmpty(forwardedFor)) { return forwardedFor.Split(',')[0].Trim(); } // 读取X-Real-IP var realIp = request.Headers["X-Real-IP"].FirstOrDefault(); if (!string.IsNullOrEmpty(realIp)) { return realIp.Trim(); } // 以上都没有,返回直接连接的IP(可能是访客IP或未识别的CDN节点IP) return request.HttpContext.Connection.RemoteIpAddress?.ToString() ?? string.Empty; }
注意事项
- 务必在CDN后台开启真实IP转发,否则无法获取访客真实IP
- 对转发头要做信任校验:只信任来自你CDN IP段的请求中的转发头,防止恶意用户伪造
X-Forwarded-For等头绕过检测
内容的提问来源于stack exchange,提问作者MiscellaneousUser
相关产品推荐
相关产品推荐

