Điều khiển ESP8266 không cần chuyển tiếp cổng: một đường MQTT đi ra
Một broker truy cập được từ internet cho phép điều khiển thiết bị trong nhà qua kết nối do chính nó mở. Điều đó thay đổi gì cho bộ nhớ TLS, các chủ đề và việc phát lại.
Thiết bị nằm sau router gia đình không có chuyển tiếp cổng và không có địa chỉ công khai, vậy mà vẫn phải nhận cấu hình trong vài giây. Mẹo không phải là một lỗ hổng trong tường lửa. Đó là kết nối mà thiết bị mở ra ngoài tới một broker mà nó có thể tới được, rồi broker gửi tin nhắn trở lại theo đúng đường đã thiết lập đó. Mọi đặc tính người ta thích ở thiết kế này, và mọi cạm bẫy trong đó, đều đến từ sự đảo ngược ấy.
Điều gì thực sự đi qua NAT
Khi thiết bị mở kết nối TCP tới broker, router trong nhà tạo một ánh xạ và giữ nó sống trong suốt thời gian của luồng. Các phản hồi trên luồng đó quay về thiết bị vì ánh xạ đã tồn tại. Broker không bao giờ khởi tạo điều gì về phía ngôi nhà, nên không có gói tin vào không được yêu cầu nào để router phải từ chối. Đó là toàn bộ lập luận mạng, và đó là lý do cách tiếp cận này hoạt động trên những mạng bạn không kiểm soát.
Thiết bị phải giữ kết nối sống hoặc thiết lập lại nó, và điều đó trở thành câu hỏi về độ tin cậy khi kiến trúc đã được chốt.
Broker định tuyến các chủ đề, nó không làm proxy HTTP
MQTT định nghĩa các trao đổi xuất bản và đăng ký: thiết bị đăng ký một bộ lọc chủ đề mà nó được phép đọc, và một bộ điều khiển được uỷ quyền xuất bản tới chủ đề khớp. Broker ghép các bản xuất bản với các đăng ký và giao bản sao. Nó không biết yêu cầu của trình duyệt là gì, và nó sẽ không chuyển tiếp một HTTP GET tới máy chủ web của thiết bị. Nếu firmware hiện có chỉ nói HTTP, thiết kế broker cần thay đổi ứng dụng hoặc một thành phần dịch có chủ đích.
Tên chủ đề cũng không phải là uỷ quyền. Hầu hết broker hỗ trợ danh sách kiểm soát truy cập theo từng máy khách, và thiết bị nên bị giới hạn trong cây xuất bản và đăng ký của riêng nó thay vì chia sẻ một không gian tên toàn cầu.
Tài nguyên của thiết bị quyết định hình dạng của TLS
ESP8266 có RAM hạn chế, và bắt tay TLS là việc tốn kém nhất nó làm. Lõi Arduino cung cấp BearSSL chính vì ràng buộc này, và lựa chọn giữa xác minh CA và ghim dấu vân tay thay đổi cả dấu chân bộ nhớ lẫn điều mà kẻ tấn công có chứng chỉ hợp lệ cho tên khác có thể làm. Xác minh CA của broker là lựa chọn mạnh hơn khi heap cho phép. Kích thước tải trọng cũng quan trọng: máy khách MQTT giữ một bộ đệm, và các tin nhắn lớn hơn nó bị cắt lặng lẽ trừ khi bộ đệm được tăng lên có chủ đích.
Keepalive và thời gian chờ của socket là một phần của cùng ngân sách, vì một máy khách không bao giờ nhận ra kết nối đã chết sẽ ngừng nhận lệnh mà không báo lỗi.
Ngữ nghĩa tin nhắn cắn người
Tin nhắn được lưu giữ sẽ do broker lưu và giao cho những người đăng ký khớp về sau, điều này tuyệt vời cho trạng thái hiện tại và nguy hiểm cho các lệnh một lần: thiết bị kết nối lại có thể nhận lệnh của hôm qua như thể nó mới. QoS 1 bảo đảm giao ít nhất một lần, nên bản trùng là bình thường và ứng dụng phải an toàn với việc lặp lại, lý tưởng nhất là với một định danh hoặc dấu thời gian mà nó có thể từ chối. Di chúc cuối cùng cho bạn tín hiệu trạng thái khi thiết bị rơi, nhưng chỉ khi kết nối thực sự thất bại chứ không phải bị treo.
Hành vi phiên sạch quyết định việc broker có giữ các đăng ký của bạn khi bạn vắng mặt hay không, và sai ở đó chính là lý do một số thiết bị bỏ lỡ tin nhắn đầu tiên sau mỗi lần kết nối lại.
TLS bảo vệ chặng tới broker. Đây không phải mã hoá tải trọng đầu-cuối chống lại người vận hành broker, người có thể đọc mọi thứ bạn xuất bản qua nó.
Giới hạn vòng đời và thử nghiệm nó bằng dữ liệu vô hại
Lên kế hoạch kết nối lại với việc lùi dần thay vì một vòng thử lại dày đặc, đăng ký lại một cách rõ ràng nếu phiên không bền, và ghi lại kết quả kết nối để một thiết bị im lặng ngoại tuyến để lại bằng chứng. Thử đường kết nối lại bằng các tải trọng mẫu không làm gì cả, vì thử nghiệm sản xuất đầu tiên của một kênh lệnh không nên là một lệnh thật. Sau đó xác nhận điều gì xảy ra với một tin nhắn được lưu giữ cũ khi kết nối lại, và quyết định xem hành vi đó có chấp nhận được cho từng chủ đề hay không.
Làm theo cách này, thiết kế loại bỏ một yêu cầu mạng vào và để phần mềm thiết bị, chính sách broker và ngữ nghĩa tin nhắn thành công việc nhìn thấy được thay vì những giả định ẩn.