0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Hướng Dẫn Chi Tiết Đưa Máy Chủ Mosquitto Broker Từ Local Ra Internet (Phần 3)

Đăng vào 1 tuần trước

• 4 phút đọc

Giới thiệu

Trong các bài viết trước, mình đã chia sẻ cách xây dựng một Mosquitto Broker local (Phần 1) và cách tích hợp cơ chế xác thực người dùng với Plugin mosquitto-go-auth (Phần 2). Trong bài viết này, mình sẽ hướng dẫn các bạn 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. Cụ thể:

  • Cổng 1883 (MQTT): Chủ yếu dành cho các thiết bị IoT và ứng dụng không yêu cầu giao diện web.
  • Cổng 9001 (WebSocket): Dùng cho các ứng dụng web-based (như dashboard IoT) để kết nối với Mosquitto broker.

Trong bài trước, mình đã cấu hình cho cổng 1883 trong file default.conf. Bây giờ, mình sẽ tạo một file mới websocket.conf trong thư mục /etc/mosquitto/conf.d để cấu hình cho cổng 9001:

Copy
listener 9001 127.0.0.1
protocol websockets
allow_anonymous true

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

Copy
sudo kill -HUP $(pidof mosquitto)

Lưu ý: Khi sử dụng per_listener_settings true trong file /etc/mosquitto/mosquitto.conf, cấu hình của các cổng sẽ không xung đột.

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

  • Mở cổng tương ứng trong firewall:
Copy
sudo ufw allow 1883/tcp   # Mở cổng MQTT
sudo ufw allow 9001/tcp   # Mở cổng WebSocket (nếu cần)
  • NAT Port: Vào địa chỉ (192.168.1.1) trên thiết bị kết nối vào modem, làm theo hướng dẫn để mở port (Port Forwarding) cho Mosquitto.

Kiểm tra kết quả mở Port bằng cách truy cập trang port-check. Ghi nhớ địa chỉ IP Wan để kết nối Mosquitto Broker từ internet.

  • Kiểm tra kết nối bằng mosquitto-clients:
    Mình đã tạo người dùng "user1" và sẽ thêm chỉ thị -d để hiển thị debug message. Tham khảo thêm bằng cách sử dụng:
Copy
mosquitto_sub --help
mosquitto_pub --help

Như vậy, chúng ta đã thành công trong việc đưa máy chủ Mosquitto Broker từ local ra internet. Cổng 9001 có thể NAT Port tương tự. Ta sẽ sử dụng NGINX làm proxy cho Mosquitto Broker qua WebSocket.

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

  • Cài đặt NGINX trên máy chủ chạy Mosquitto Broker:
Copy
sudo ufw allow 'Nginx Full' # Mở tường lửa cho Nginx
  • Cấu hình NGINX cho cổng 1883:
    Mình sẽ cập nhật file /etc/mosquitto/conf.d/default.conf:
Copy
listener 9883 127.0.0.1
protocol mqtt

Thêm cấu hình Proxy TCP cho Nginx vào file /etc/nginx/nginx.conf:

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

Kiểm tra cấu hình và khởi động lại Nginx:

Copy
sudo nginx -t
sudo nginx -s reload

Chúng ta đã cấu hình Nginx chuyển tiếp TCP đến Mosquitto Broker.

  • Cấu hình NGINX cho WebSocket:
    Tạo file /etc/nginx/sites-available/mosquitto-proxy.conf:
Copy
server {
    listen 80;  # Cổng HTTP của NGINX
    server_name your-domain.com;  # Địa chỉ tên miền hoặc IP

    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;
    }
}

Lưu ý: Để tránh nhớ địa chỉ IP Wan, các bạn nên mua một Domain và trỏ record A về địa chỉ IP Wan của nhà bạn.

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

Fare:

Copy
# Tải Certbot
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 your-domain.com -d www.your-domain.com

# Tạo symbolic link cho mosquitto-proxy.conf:
sudo ln -s /etc/nginx/sites-available/mosquitto-proxy.conf /etc/nginx/sites-enabled/mosquitto-proxy.conf

# Kiểm tra cấu hình và khởi động lại Nginx:
sudo nginx -t
sudo nginx -s reload
  • Tạo cron job tự động gia hạn chứng chỉ SSL:
Copy
crontab -e

# Thêm dòng sau:
0 12 * * * /usr/bin/certbot renew --quiet && sudo systemctl reload nginx

Như vậy, bạn đã thêm chứng chỉ SSL cho Nginx và chuyển tiếp yêu cầu HTTP sang HTTPS.

5. Sử dụng CloudFlare để tự động cập nhật IP Wan

Trỏ Name servers về CloudFlare và chuyển Proxy Status sang DNS only để sử dụng API của CF cập nhật record A khi IP Wan thay đổi.

Mình đã tạo mã cloudflare_iot-mqtt-broker.sh để cập nhật địa chỉ IP Wan tự động.

Tổng kết

Cảm ơn các bạn đã theo dõi chuỗi bài viết này. Hy vọng những kiến thức này sẽ hữu ích cho bạn trong việc triển khai Mosquitto Broker thành công. Nếu có câu hỏi hay góp ý, các bạn hãy cho mình biết nhé!

Nguồn tham khảo

  1. Cài đặt Nginx trên Ubuntu22.04
  2. Cài đặt bảo mật Nginx với Let's Encrypt
  3. Định cấu hình NGINX cho websockets bảo mật mosquitto mqtt
  4. Cấu hình Nginx cho TCP load Balancing
  5. Cập nhật IP động cho tên miền qua CloudFlare
    source: viblo
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào