问题:服务不能暴露公网
- 客户的主机不能连外网,服务MQTT服务部署在内网。记做:p1 (computer 1)
- 堡垒机(跳板机)可以连外网,内网IP 和 MQTT服务在同一个网段。记做:p2 (computer 2)
- 对他人而言,直接连 公网的 服务和端口,即可 和 p1 通信。
1. 跳板机 安装Nginx
- 去官网下载Nginx
- 配置 监听的端口,可参考如下文档,不看也行
- 就是简单的改下配置文件,如下
include tcp.conf;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#这个配置无用吧,这是http的
server_tokens off;
}
- 当前目录下 新建 tcp.conf
- server 192.168.30.192:7788;
- 配置:p1(有mqtt服务的主机) 的 IP 和 端口
- 因为 访问到这台主机(p2)的 都要转发给 它
- 注意 p1 要开通端口(我本地测试,直接关闭防火墙即可)
- listen 7777;
- 本机对外暴露的端口,7777。
- 就是 别人访问 7777 端口,即可跳转到 192.168.30.192:7788
- 启动Nginx 即可。
stream {
upstream mqtttest {
# 目标 redis server ip和host
server 192.168.30.192:7788;
}
server {
# 要监听的外部端口,比如你的域名是www.baidu.com,那么你本地连接redis的时候,host就填www.baidu.com,端口8899
listen 7777;
proxy_pass mqtttest;
}
}
2. 安装 花生壳
- 测试 ngrok 好像用不了 tcp 内网穿透,但花生壳可以。
- 下载好后,实名认证,添加自定义映射(官网有教程)
- 本机IP 就是设置 自己主机(p2)的IP,端口设置为 7777
- 让 外网能访问到 自己的7777端口。
- 因为没有花钱,外网的 域名和端口如下
- 注意点:协议一定选 TCP,因为mqtt底层依然是 TCP
6g8231567p.zicp.fun:5748
192.168.30.36 本机p2的IP
7777 本机p2的端口
- 开启 花生壳的自定义 映射。
3. 课外 mqtt服务端搭建
- 也可以自己搭建一个 mqtt服务器。
- 使用软件为:mosquitto,参考文档。
- 修改:配置文件 mosquitto.conf
- listener 7788
- allow_anonymous true
- 就不要密码了
- 在管理工具->服务,中找到Mosquitto Broker,启动mosquitto服务
- 使用 CMD窗口进行订阅
- 没用用户名密码,去掉这些参数即可。
- -v 进行订阅
mosquitto_sub.exe -h 127.0.0.1 -p 7788 -u admin -P 123456 -v -t sensor
- 使用 CMD 窗口进行发布
- -t进行发布 -m是消息内容
mosquitto_pub.exe -h 127.0.0.1 -p 7788 -u admin -P 123456 -t sensor -m “消息测试”
- 最后使用 MQTTX 进行测试
- 点击“New Connection”按钮,则出现新建连接对话框,根据MQTT服务器的信息,输入对应的参数
- 如果想订阅一个主题,则点击“New Subscription”按钮,则出现新建订阅对话框
- 订阅上面的:t sensor 即可。
4. MQTTX 进行测试
- 点击链接,名称随便起
- 服务器地址为:
- mqtt:// 默认的
- 6g8231567p.zicp.fun (就是上面 花生壳 对外访问的地址)
- 端口为:57482,花生壳 提供的
- 点击链接,链接成功后,即可给 p1 主机发送 消息。
- 同理 添加了 订阅后,即可收到 消息。
- 使用 p1 cmd 窗口,发送 mqtt消息。
- 这个 依然能收到 内网的消息。
5. 总结
- 客户主机 p1
- 跳板机 p2
- 安装 花生壳
- 安装 nginx
- 对外用户
- 访问流程:
- 对外用户访问——>花生壳——>Nginx——>客户主机
- Nginx 暴露 7777端口,供花生壳 访问
- 访问了 7777 端口,Nginx 转发到 p1 的 IP 和 端口
- 实现了:只需要给 对外用户一个,花生壳 的 域名和端口
- 他 即可连接到 mqtt服务,能接受 和 发送 消息。
- 对外用户:直接能 和 p1 进行通信。