最近折腾MQTT,后端使用的是EMQX
,接入协议是ws://
,再搭配前置caddy
代理自动配置证书,最终是wss://
,但是为了方便全球接入避免单点网络故障问题,于是最外层再次套了一层cloudflare
的CDN,最后的架构如下:
EMQX <-----> Caddy <-----> Cloudflare <-----> Client
体验了一段时间下来没什么大问题,就是EMQX
后台获取的客户端IP不对,是Cloudfalre的转发IP。
其实原因也很简单,Caddy获取客户端IP策略不一致,详情参考 此篇文章
我嫌白名单配置麻烦,所以粗暴的采用以下配置解决,无条件信任来源于Cf的协议头X-Forwarded-For
"handle": [
{
"handler": "reverse_proxy",
"upstreams": [
{
"dial": "172.17.0.1:8083"
}
],
"headers": {
"request": {
"set": {
"X-Forwarded-For": [
"{http.request.header.X-Forwarded-For}"
]
}
}
}
}
]