我正在创建一个使用 MQTT 协议发送实时消息的 Android 应用程序,但是本地防火墙非常严格,会阻止大多数端口,因此 Android 应用程序无法连接。(服务器在防火墙之外,但我所在位置的用户无法连接通过它 )
是否可以将非 HTTP 流量从端口 80 转发到 1883 或从 443 转发到 8883 服务器端,同时仍能正确处理 HTTP 流量?(我知道有些防火墙也会阻止通过 TCP 的非 HTTP,但至少这可以容纳更多的人)
我有一个 VPS Linode,在 CentOS 5 上为 Web 服务器运行 NGINX。
答案1
您可以编写一个代理来拦截 TCP 流,检查客户端发送的数据的前三个字节,如果它们不是所有字母 (AZ,az) 的相同大小写,则认为它是非 HTTP。将 HTTP 代理到 Web 服务器监听的端口。将非 HTTP 代理到您的 MQTT 服务器监听的端口。
这并不完全正确——这是一种 hack。但我已经成功地用它做了很多类似的事情。我浏览了MQTT 协议并且通过此测试,MQTT 消息看起来不太可能像 HTTP。如果确实如此,则必须进行更详细的检查。例如,检查已知的 HTTP 动词和/或动词后的空格。
我仍然认为最佳/正确的解决方案是在防火墙中打开一个端口。这是一个丑陋的黑客行为,使防火墙变得不那么有用。任何被授权部署服务器应用程序的人也应该有能力为该应用程序打开一个端口。