运维
代理后面的客户端IP
IP规则、限流、请求记录,以及CasWAF转发时带上的X-Real-Ip请求头,用的都是客户端地址。CasWAF直接面向互联网时,客户端地址就是连接的来源地址。前面有负载均衡、CDN或其他代理时,连接来自代理,真实地址在X-Forwarded-For里,而这个请求头任何人也都能手工设置。
CasWAF怎么判断
- 如果连接不是来自可信代理,客户端就是连接的地址。客户端发来的任何
X-Forwarded-For都被忽略,并在转发请求之前删除。 - 如果连接来自可信代理,CasWAF从右往左读
X-Forwarded-For,跳过可信代理,取第一个不是可信代理的地址。每个代理都会追加它收到连接时的来源地址,所以这个地址是进入你自己的基础设施之前的最后一跳,客户端伪造不了。 - 没有
X-Forwarded-For时,如果可信代理发了X-Real-IP就用它,否则用连接的地址。
可信代理
默认信任私有地址段和本地地址段:
127.0.0.0/8, ::1/128, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, fc00::/7这涵盖了你内网里的负载均衡,例如从内网地址转发的云负载均衡。如果CasWAF前面的代理从公网地址连过来,像CDN那样,就把它的地址段,连同你仍然需要的私有地址段,一起写进trustedProxies:
trustedProxies = 127.0.0.0/8, ::1/128, 10.0.0.0/8, 173.245.48.0/20, 103.21.244.0/22这个值会替换默认列表。也接受不带/的单个地址。和数据库设置一样,它也可以用同名环境变量设置。它只在启动时读取一次。
只信任属于你所用代理的地址段。列表里的每个地址都能声称自己在替任何人转发。
应用看到什么
CasWAF转发请求时带上:
X-Real-Ip:上面得出的客户端地址X-Forwarded-Proto:https或http,即客户端连接CasWAF时用的协议X-Forwarded-For:来自可信代理时原样保留,否则删除
CasWAF后面的应用应该读X-Real-Ip,并且只在请求来自CasWAF时才信任它。