五分钟技术趣谈 | MQTT设备接入时获取真实IP地址的解决方案
创始人
2025-06-27 22:01:14
0

Part 01

需求背景 

在OneNET平台某私有化项目中,项目方的需求是要获取设备真实IP地址,然后根据设备的IP来统计处于各个省内区域的设备数量展示到大屏上。

Part 02

查找解决方案 

以MQTT设备接入为例,由于项目方使用的外层负载是Nginx软负载,并且MQTT协议是基于TCP,只能走4层方式转发报文,Nginx转发报文的时候会将源TCP连接的IP地址改写为自己的内网IP地址,不能像F5这种硬负载可以直接将设备的源地址转发到后端服务上,因此就不能直接通过配置Nginx的方式来让MQTT接入服务获取到设备源IP地址,也就不能实现项目方的需求。

经过网上查询相关解决方案,发现一个Internet协议叫做proxy protocl(参考资料:https://www.jianshu.com/p/cc8d592582c9),该协议可以通过为TCP包添加一个很小的头信息,来传递客户端信息(协议栈、源IP、目的IP、源端口、目的端口等),在网络情况复杂又需要获取用户真实IP时非常有用。其本质是在三次握手结束后由代理在连接中插入了一个携带了原始连接四元组信息的数据包。

图片图片

proxy protocol协议流程

查阅到proxy protocol报文的格式如下图中所示,里面包含了客户端的源地址和端口等信息,能够满足我们的需求。

图片

proxy protocol报文格式

后端服务要获取这个特殊报文也需要在Nginx上配置开启proxy_protocol协议,如下图中所示。

图片

Nginx上配置开启proxy_protocol协议

通过wireshark工具抓包我们也发现包结构和查阅到的资料是一致的,接下来我们要做的就是在MQTT协议解析的时候把这个特殊的包也要解析处理并保存这个客户端的真实IP。

图片

Wireshark抓proxy_protocol协议包

Part 03

实践操作  

说干就干,我们修改MQTT接入服务的源代码是基于Netty框架实现的,于是我们在编解码的时候增加了真实IP解码器,如下图所示。

图片

真实IP解码器

随后我们在解码器的decode方法中,将原始报文解析出来,判断是否有proxy protocol报文,然后解析报文并提取里面的设备真实源IP地址和端口,并将之保持在Netty中的ChannelAttribute上下文中,方便后续获取。

注意,这里的proxy protocol报文和MQTT协议中的报文是粘包在一起的,所以我们需要提取源地址后将剩余的MQTT协议包分离处理交给后续的MQTT协议解码器进行处理,这就是整体处理流程。

图片

图片

真实IP解码器源码

Part 04

测试认证 

重新打包部署服务后,我们根据日志看到通过Nginx负载方式能够正常获取到测试设备的源IP信息,满足需求。

图片

对于4层的UDP协议获取设备源IP也可以参考本方案解决。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...