介绍
XFF 处理 X-Forwarded-For 头的中间件,可以在7层过滤出内网ip以外的相对来说真实的客户端ip。
基础背景知识
cidr的网络地址表示
192.168.0.0/16
网络地址中的 /16
表示网络掩码,说明192.168.0.0
前16位为网络位,后16位网络内的主机位,网络内可以容纳后16位共计 (2^16-2) ⚠️需要 去除 192.168.0.0
网络地址 与 192.168.255.255
广播地址
X-Forwarded-For说明
X-Forwarded-For 在 rfc 7329 Forwarded HTTP Extension
中有过说明
A/B/C/D/E 网络分类
默认局域网保留网络地址
局域网地址的分配说明可以参考rfc1918
快速图解
代码分析
创建XFF对象
根据选项参数,创建一个XFF
对象指针,选项参数是否开启debug模式(会增加一些打印),设置信任的 L7 EdgeProxy
的网段,支持多个网段设置,并提供了默认创建方法 Default
将客户端真实IP设置进RemoteAddress
解析X-Forwarded-For
对X-Forwarded-For
进行处理,按照,
进行切割,遍历次IP数组,当ip不为空,且IP为合法的公网IP,则将当前IP返回,并将此ip赋值``request.RemoteAddress`
在看下核心的IsPublicIp
的实现,IsGlobalUnicast
用于判断IP是否是一个单播地址,在配合privateMasks
是否为局域网保留地址,其实这里不用自己写这个判断,现在是有IsPrivate
的相同功能的函数
官方提供判断ipv4/ipv6
是否为局域网函数,xff
的issue中提到了一个更加全面的判断是否为局域网保留ip的判断https://github.com/letsencrypt/boulder/blob/30a516737c9daa4c88c8c47070c25a5e7033cdcf/bdns/dns.go#L31-L145,还有一篇关于``X-Forwarded-For``如何解析的好文章https://github.com/ajvondrak/remote_ip/issues/29
总结
- 在获取客户端ip前判断当前的
RemoteAddress
是否为我方的代理IP
- 不能直接拿X-Forwarded-For 的第一个IP地址作为客户端ip,需要判断IP是否为单播地址且不为局域网保留地址
如果你看不到评论,那么就真的看不到评论w(゜Д゜)w