+2

Đưa máy chủ Mosquitto Broker từ local lên internet (Part 3)

👋Giới thiệu

Ở các bài viết trước, mình đã chia sẻ tới các bạn cách xây dựng một Mosquitto Broker local (phần 1) và tích hợp cơ chế xác thực uỷ quyền người dùng dựa trên Plugin mosquitto-go-auth (phần 2). Bài viết này mình sẽ chia sẻ cách đưa máy chủ Mosquitto local lên internet.

🚀Cài đặt

1. Cấu hình các cổng kết nối

Mosquitto broker có thể kết nối qua MQTT protocol với cổng mặc định là 1883 và qua WebSocket với cổng 9001 để hỗ trợ các ứng dụng web.

Có thể nói:

  • Cổng 1883 (MQTT - Message Queuing Telemetry Transport): chủ yếu được sử dụng cho các thiết bị IoT, hệ thống nhúng, và các ứng dụng không yêu cầu giao diện web.
  • Cổng 9001 (WebSocket): cho phép các ứng dụng web-based (như dashboard IoT) kết nối với Mosquitto broker để theo dõi và giám sát các dữ liệu trong hệ thống.

Trong phần trước, mình đã cấu hình cho cổng 1883 trong file default.conf. Do đó, mình sẽ tạo thêm một file websocket.conf (cũng trong thư mục /etc/mosquitto/conf.d) để cấu hình cho cổng 9001 sử dụng giao thức websocket. Để đơn giản mình sẽ tắt yêu cầu xác thực người dùng với cổng này (ở đây mình chỉ nhận kết nối từ máy chủ cục bộ):

listener 9001 127.0.0.1
protocol websockets
allow_anonymous true

Sau khi hoàn tất, bạn hãy chạy lệnh sau để Mosquitto Broker tải lại cấu hình:

sudo kill -HUP $(pidof mosquitto)

⚠️Các bạn lưu ý rằng, khi đặt tuỳ chọn per_listener_settings true trong file cấu hình cơ sở /etc/mosquitto/mosquitto.conf thì cấu hình của mỗi cổng sẽ không xung đột lẫn nhau.

2. Đưa Mosquitto Broker từ local lên internet

  • Nếu máy chủ Mosquitto broker có firewall, bạn cần mở cổng tương ứng:
sudo ufw allow 1883/tcp   # Mở cổng MQTT
sudo ufw allow 9001/tcp   # Mở cổng WebSocket (nếu cần)
  • NAT Port: Các bạn hãy dùng thiết bị hỗ trợ trình duyệt đã kết nối sóng WiFi modem, để truy cập vào địa chỉ (192.168.1.1). Tuỳ theo modem nhà mạng, cách mở port (Port Forwarding) sẽ có giao diện khác nhau.

image.png

Nếu các bạn dùng nhà mạng fpt, các bạn có thể làm theo hướng dẫn sau. Để Kiểm tra kết quả mở Port, bạn hãy truy cập trang port-check

👉️ Nếu kết quả hiển thị như bên dưới, bạn đã mở Port 1883 thành công. Các bạn hãy ghi nhớ địa chỉ IP Wan để kết nối Mosquitto Broker từ internet nhé.

image.png

  • 🗝️ Kiểm trả pub/sub tin nhắn thông qua mosquitto-clients:

Trong phần 2, mình đã tạo một người dùng có tên "user1" và cấp quyền đọc ghi với chủ đề "read_write_topic". Mình sẽ thêm chỉ thị -d để hiện thị debug message. Các bạn có thể xem thêm các tuỳ chọn bằng cách sử dụng: mosquitto_sub --helpmosquitto_pub --help.

image.png

Như vậy, 😃chúng ta đã đưa thành công máy chủ Mosquitto Broker từ local ra internet để có thể truy cập từ ngoài mạng. Đối với cổng 9001, các bạn cũng có thể NAT Port tương tự nhé. Tuy nhiên, phần này mình sẽ sử dụng NGINX làm proxy cho Mosquitto Broker qua WebSocket.

3. Sử dụng NGINX làm proxy cho Mosquitto Broker

  • Đầu tiên, các bạn hãy cài đặt Nginx trên cùng một máy chủ chạy Mosquitto Broker.
sudo ufw allow 'Nginx Full' # Đảm bảo mở tường lửa cho Nginx
  • Cấu hình NGINX để chuyển tiếp kết nối TCP trên cổng 1883:

Nếu bạn muốn scale hệ thống lên thì Nginx rất hữu ích trong việc cân bằng tải khi cần chạy nhiều Mosquitto Broker khác nhau (mỗi broker sẽ chạy trên một container).

image.png

Mình sẽ cập nhập file /etc/mosquitto/conf.d/default.conf để Broker lắng nghe cổng 9883 và chỉ cần nhận các kết nối cục bộ.

listener 9883 127.0.0.1
protocol mqtt

Tiếp theo, thêm cấu hình Proxy TCP cho Nginx, các bạn thêm đoạn code sau vào cuối file /etc/nginx/nginx.conf (nếu trong file chưa có khối stream)

stream {
        server {
                listen 1883;
                proxy_pass 127.0.0.1:9883;
                tcp_nodelay on;
        }
}

Sau đó, các bạn hay kiểm tra file cấu hình có hợp lệ không và khởi động lại Nginx để tải cấu hình mới

sudo nginx -t
sudo nginx -s reload

Như vậy, chúng ta đã cấu hình thành công Nginx chuyển tiếp (proxy) các kết nối TCP đến một dịch vụ phía sau như Mosquitto Broker.

  • Cấu hình NGINX để chuyển tiếp WebSocket:

Cho phép các ứng dụng web có thể kết nối trực tiếp với broker mà không cần phải thông qua một server trung gian khác.

image.png Các bạn hãy tạo thêm file /etc/nginx/sites-available/mosquitto-proxy.conf để để thiết lập NGINX như một reverse proxy cho kết nối WebSocket đến Mosquitto.

Do đó thay vì mở cổng 9001, các bạn chỉ cần NAT Port 80(HTTP)443(HTTPS), nó giúp các bạn triển khai nhiều máy chủe Web khác không chỉ mỗi Mosquitto Broker.

server {
    listen 80;  # Cổng HTTP của NGINX
    server_name your-domain.com;  # Địa chỉ tên miền hoặc IP của bạn

    location /mqtt/ {
        proxy_pass http://localhost:9001/;  # Địa chỉ Mosquitto WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

⚠️ Để nhớ dãy số địa chỉ IP Wan khá rắc rối, và đôi lúc mất điện hoặc nhà mạng reset sẽ khiến cho địa chỉ IP Wan nhà bạn bị thay đổi. Do đó, các bạn nên sắm cho mình một Domain và trỏ bản record A về địa chỉ IP Wan nhà bạn.

😀 Mình thì mua tên miền từ tenten.vn chỉ với 20k cho đuôi io.vn hoặc .click. Trong bài viết này, mình sẽ demo với tên miền iot-mqtt-broker.click, các bạn hãy sửa giá trị server_name tương ứng với tên miền của bạn nhé.

🤝Mặc dù bài viét đã dài, các bạn cố gắng thêm một chút nữa nhé!!

Cài đặt SSL cho NGINX với Certbot:

# Tải Certboot
sudo apt install certbot python3-certbot-nginx

# Yêu cầu chứng chỉ SSL và tự động cấu hình cho NGINX bằng lệnh sau:
sudo certbot --nginx -d iot-mqtt-broker.click -d iot-mqtt-broker.click

# Kiểm tra cấu hình và khởi chạy lại Nginx
sudo nginx -t
sudo nginx -s reload

Tạo cron job để tự động gia hạn chứng chỉ SSL:

# Mở file cron để chỉnh sửa:
crontab -e

# Thêm dòng sau vào cuối file cron và lưu lại:
0 12 * * * /usr/bin/certbot renew --quiet && sudo systemctl reload nginx

🏁 Như vậy, các bạn đã thêm chứng chỉ SSL cho Nginx và chuyển tiếp các yêu cầu HTTP sang HTTPS (chi tiết file cấu hình mosquitto-proxy.conf)

🥇 Hãy nghiệm thu lại các kết quả mình đã đạt được nhé. Các bạn có thể sử dụng mqttx.app để tạo một Mqtt Client và thử kết nối tới máy chủ Mqtt của bạn qua Websocket nhé ^^.

image.png

✨️Ngoài ra, các bạn có thể tham khảo thêm chương trình python để kiểm tra kết nối tới Mosquitto Broker qua WebSockets tại đây nhé.

4. Sử dụng CloudFlare (CF) để tự động cập nhập IP Wan.

Hiện tại, với tên miền giá rẻ mình mua, Tenten chưa hỗ chỡ cấu hình Dynamic DNS. Do đó mình sẽ chuyển tên miền iot-mqtt-broker.click về CloudFlare quản lý và sử dụng API của CF để cập nhập record A khi địa chỉ IP Wan bị thay đổi. Các bạn làm theo các bước dưới đây nhé.

💡 Tổng kết

🤝Series này khá dài và nhiều kiến thức nâng cao, nên rất cảm kích các bạn đã dành thời gian để đọc bài viết của mình. Mình nhận thấy rằng kiến thức của mình còn nhiều hạn chết nên mình rất trân trọng nếu bạn có bất kì câu hỏi hay góp ý cho mình.

♥️ Một lần nữa mình xin cảm ơn các bạn đã dành thời gian theo dõi chuỗi bài viết của mình 😀

🔗 Nguồn tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí