Go Echo 学习笔记(十)IP地址


IP地址

Echo 使用 Context#RealIP()方法来查看当前请求的ip地址,但是对于一些使用了代理的请求来说该方法并不能很好的获取到真实的ip地址。

Echo 中可以使用 Echo#IPExtractor 来解决这个问题,该方法也是推荐在应用中进行设置,并且针对不同的情况进行相应的设置:

未使用代理

可以将其设置为:echo.ExtractIPDirect(),直接提取对应的原始 ip 地址

e.IPExtractor = echo.ExtractIPDirect()

使用X-Forwarded-For header的代理

X-Forwared-For(XFF)是用于中继客户端 IP 地址的 HTTP 标头,其在代理的每个节点上将请求 IP 地址附加在标头的末尾,过程如下:

            ┌──────────┐            ┌──────────┐            ┌──────────┐
───────────> Proxy 1  │───────────> Proxy 2  │───────────> Your app 
             (IP: a)               (IP: b)                        
            └──────────┘            └──────────┘            └──────────┘

Case 1.
XFF:  ""                    "a"                     "a, b"
                                                    ~~~~~~
Case 2.
XFF:  "x"                   "x, a"                  "x, a, b"
                                                    ~~~~~~~~~
                                                     What your app will see

这种情况下使用 ExtractIPFromXFFHeader(...TrustOption) 进行设置:

e.IPExtractor = echo.ExtractIPFromXFFHeader()

默认情况下,该方法默认信任内部IP地址(oopback, link-local unicast, private-use and unique local address from RFC6890, RFC4291 and RFC4193)为了控制着些行为可以使用 TrustOption 选项:

e.IPExtractor = echo.ExtractIPFromXFFHeader(
	TrustLinkLocal(false),
	TrustIPRanges(lbIPRange),
)

使用X-Real-IP header的代理

X-Real-IP是中继客户端IP地址的另一个HTTP header,但与XFF不同,它仅携带一个地址。

这种情况下使用 ExtractIPFromRealIPHeader(...TrustOption) 进行设置:

e.IPExtractor = echo.ExtractIPFromRealIPHeader()

对于这种情况也是可以根据 TrustOption 来进行设置是否信任指定的ip地址。