Hướng dẫn chi tiết về mDNS: Cách thiết lập và sử dụng trong mạng IoT


Summary

Bài viết này khám phá chi tiết về mDNS và cách thiết lập cũng như sử dụng nó trong mạng IoT. Tôi cảm thấy đây là một chủ đề cực kỳ quan trọng vì nó liên quan đến sự phát triển nhanh chóng của công nghệ IoT trong cuộc sống hàng ngày của chúng ta. Key Points:

  • mDNS có thể được tích hợp với các giải pháp Zero Trust để tạo ra một mạng IoT an toàn hơn, chỉ cho phép các thiết bị được ủy quyền tương tác với nhau.
  • Trong kiến trúc mạng lưới Mesh, mDNS giúp tự động cấu hình và phát hiện các thiết bị nút, làm cho việc kết nối trở nên dễ dàng và hiệu quả hơn trong môi trường phức tạp.
  • Việc tích hợp mDNS với nền tảng đám mây IoT không chỉ tăng cường khả năng quản lý và giám sát mà còn mở rộng khả năng tương tác giữa các dịch vụ khác nhau.
Thông qua bài viết này, bạn sẽ hiểu rõ hơn về vai trò của mDNS trong việc cải thiện bảo mật cũng như khả năng hoạt động của mạng IoT.

Hiểu về mDNS qua ví dụ

Nhiều thiết bị tự động hóa gia đình công bố sự hiện diện và dịch vụ của chúng trên mạng cục bộ thông qua Hệ thống Tên Miền Đa Phát (mDNS). Bài viết này là phần đầu tiên trong ba phần, nhằm giúp bạn hiểu về mDNS qua một ví dụ cụ thể. Các phần tiếp theo sẽ trình bày về cách mDNS hoạt động trong giao thức tự động hóa nhà Matter và phân tích cách các gói tin mDNS di chuyển giữa Ethernet và giao thức IEEE 802.15.4, được gọi là Thread.

Trong lĩnh vực mạng, sức mạnh đến từ việc trao đổi thông tin bằng một ngôn ngữ chung, điều này không chỉ đúng với con người mà còn cả với các thiết bị. Ngôn ngữ chung chính là phương tiện để phối hợp hành động và tổ chức hiệu quả. Các thiết bị cần phải giao tiếp với nhau bao gồm máy in, máy quét và ngày càng nhiều hơn nữa là các thiết bị Internet of Things (IoT). Những thiết bị này thường hoạt động trên cùng một mạng cục bộ; do đó, chúng cần thông báo sự có mặt của mình, yêu cầu cấu hình cũng như chia sẻ dữ liệu và dịch vụ với những thiết bị khác.

Một điểm đáng chú ý là mDNS sử dụng giao thức UDP để phát hiện các thiết bị trong mạng cục bộ mà không cần phải có máy chủ DNS trung gian. Điều này giúp cho quá trình tự động cấu hình địa chỉ IP cho các thiết bị thông minh trở nên dễ dàng hơn, đồng thời hỗ trợ nhiều loại dịch vụ đa dạng cho hệ sinh thái IoT như in ấn tài liệu hay chia sẻ tệp tin giữa các thiết bị khác nhau trên cùng một mạng. Với khả năng tự động phát hiện và quản lý địa chỉ IP linh hoạt, mDNS thực sự đóng vai trò quan trọng trong môi trường kết nối ngày nay.

Cơ bản về mDNS và Avahi

Các thiết bị "khác" có thể đến từ nhiều nhà sản xuất khác nhau. Ví dụ, trong lĩnh vực tự động hóa gia đình, các thiết bị như nhiệt độ thông minh, đèn chiếu sáng, công tắc và camera an ninh cần một cách tiếp cận độc lập với nhà cung cấp để có thể thông báo sự hiện diện và dịch vụ của chúng với nhau cũng như với điện thoại di động và máy tính xách tay. Hơn nữa, những tương tác này cần diễn ra thường xuyên vì các thiết bị thường xuyên vào ra khỏi mạng. Một giải pháp cho vấn đề này là cho phép các thiết bị thông báo sự hiện diện và dịch vụ của chúng trên mạng nội bộ bằng cách sử dụng Multicast DNS (mDNS) kết hợp với DNS-Based Service Discovery (DNS-SD). Chẳng hạn, một chiếc đèn thông minh có thể sử dụng mDNS để phát tín hiệu về sự tồn tại của nó, và một ứng dụng điều khiển có thể tận dụng các bản ghi DNS-SD được chứa trong quảng cáo mDNS để tìm thấy chiếc đèn này và biết cách điều khiển nó. mDNS cho phép các thiết bị trong cùng một mạng nội bộ tự động nhận diện dịch vụ mà không cần phải cấu hình thêm máy chủ DNS nào khác.
Extended Perspectives Comparison:
Kết luận về mDNS và IoTThông tin cơ bảnLợi íchỨng dụng
mDNS là gì?Hệ thống phát hiện dịch vụ dựa trên DNS trong mạng cục bộ.Giúp tự động cấu hình thiết bị mà không cần máy chủ DNS trung gian.Được sử dụng trong các thiết bị IoT như đèn thông minh, camera an ninh.
Cách hoạt động của mDNSSử dụng giao thức UDP trên cổng 5353.Cho phép phát hiện và quảng bá dịch vụ dễ dàng giữa các thiết bị.Tích hợp với Matter và Thread trong tự động hóa nhà.
Các loại bản ghi mDNSBản ghi PTR, SRV, AAAA và TXT để quản lý thông tin dịch vụ.Giúp xác định địa chỉ IP, cổng kết nối và cấu hình dịch vụ một cách hiệu quả.Cải thiện khả năng tương tác giữa các thiết bị khác nhau.
Vai trò của Avahi và WiresharkAvahi giúp quảng bá và tìm kiếm dịch vụ qua mDNS.Wireshark cho phép theo dõi lưu lượng mạng để phân tích giao tiếp giữa các thiết bị.Hỗ trợ hiểu rõ hơn về cách thức hoạt động của mạng lưới IoT.
Triển vọng tương lai của mDNS trong IoTTiếp tục phát triển cùng với công nghệ mới như Matter và Thread.Cải thiện khả năng giao tiếp giữa các thiết bị đa dạng từ nhiều nhà sản xuất khác nhau.Khuyến khích sự đổi mới trong lĩnh vực tự động hóa gia đình.

Thiết lập môi trường mDNS

mDNS có ưu điểm so với DNS là không cần một cấu trúc máy chủ trung tâm, điều này sẽ phải được cập nhật khi các thiết bị tham gia hoặc rời bỏ mạng, hoặc thay đổi địa chỉ IP. ## Tổng quan về thiết lập mDNS hoạt động trên cả hai lớp mạng IPv4 và IPv6 thông qua các địa chỉ multicast và gửi dữ liệu qua UDP trên cổng 5353. Tôi sẽ chỉ tập trung vào IPv6 vì đây là lớp mạng được sử dụng trong Matter và Thread. Để hiểu cách mà mDNS sử dụng các bản ghi theo định dạng của DNS-SD để quảng bá và phát hiện dịch vụ trong mạng cục bộ, tôi đã thiết lập một mạng cục bộ với hai máy chủ. Mỗi máy chủ là một máy ảo (VM) chạy hệ điều hành Ubuntu Linux, được kết nối bởi giao diện mạng ảo IPv6. Dịch vụ quảng bá sẽ chạy trên máy chủ VM "M", trong khi máy chủ đang truy vấn dịch vụ sẽ là máy chủ VM "C".

Để tăng cường phần thiết lập môi trường mDNS này, chúng ta cũng nên biết rằng mDNS vận hành rất linh hoạt mà không cần cấu hình phức tạp. Nó hỗ trợ nhiều thiết bị như Raspberry Pi hay ESP8266, giúp người dùng dễ dàng triển khai trong các dự án IoT. Việc cấu hình địa chỉ IP tĩnh cho những thiết bị này cũng khá đơn giản và thực sự hữu ích cho việc duy trì kết nối ổn định trong suốt quá trình hoạt động của dịch vụ.

Ngoài ra, có những công cụ thú vị như Avahi hay Bonjour có thể hỗ trợ bạn rất nhiều trong việc quản lý và phát hiện dịch vụ thông qua mDNS, làm cho quá trình trở nên dễ dàng hơn bao giờ hết.

Cấu hình dịch vụ với Avahi

Tôi sẽ tiến hành điều tra lưu lượng mDNS thông qua việc ghi lại gói tin mạng trên máy chủ M sử dụng Wireshark. Giao tiếp mDNS sử dụng IPv6 thông qua các gói multicast (địa chỉ ff02::fb) giữa dịch vụ mDNS chạy trên máy chủ M và máy chủ đối tác, host C, nhằm quan sát các tin nhắn mDNS.

## Thiết lập công cụ mDNS

Để thiết lập công cụ mDNS cho cả dịch vụ quảng bá trên máy chủ M và khả năng duyệt dịch vụ trên máy chủ C, tôi đã sử dụng Avahi - một bộ công cụ được thiết kế dành riêng cho mDNS.

# Máy chủ M: Cài đặt daemon avahi
sudo apt install avahi-daemon avahi-utils

# Máy chủ M: Cấu hình thông tin dịch vụ bằng cách tạo tệp cấu hình
sudo tee /etc/avahi/services/myservice.service <<'EOF'
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h - Dịch vụ của tôi</name>
<service>
<type>_myservice._tcp</type>
<port>1234</port>
<txt-record>key1=value1</txt-record>
<txt-record>key2=value2</txt-record>
<txt-record>key3=value3</txt-record>
</service>
</service-group>
EOF

# Máy chủ M: Khởi động lại dịch vụ với tệp cấu hình mới
sudo systemctl restart avahi-daemon

# Máy chủ C: cài đặt các công cụ để duyệt tin nhắn mDNS
sudo apt install avahi-utils


Avahi không chỉ giúp quảng bá các dịch vụ mà còn hỗ trợ tìm kiếm chúng trong mạng cục bộ. Điều này thực hiện được nhờ vào giao thức DNS-SD (Service Discovery), cho phép người dùng dễ dàng phát hiện và kết nối đến các dịch vụ có sẵn mà không cần cấu hình phức tạp. Các tham số như `avahi-daemon.conf` cũng như tệp dịch vụ `.service` rất quan trọng để người dùng có thể tùy chỉnh theo nhu cầu của mình, từ đó tối ưu hóa quá trình hoạt động của hệ thống mạng cá nhân hoặc doanh nghiệp.


Cấu hình dịch vụ với Avahi Free Images


Tên dịch vụ mDNS và dữ liệu liên quan

Để hiểu rõ hơn về tên dịch vụ mDNS và các dữ liệu liên quan, chúng ta hãy xem xét những gì đã được cấu hình trong tệp `\/etc\/avahi\/services\/myservice.service`. Tên dịch vụ này sẽ được chuyển đổi thành "`matter-dev - My Service._myservice._tcp.local`" theo quy định của RFC 6763, bắt đầu từ phần 4.1.1. Các thông tin cụ thể từ `myservice.service` được sử dụng để tạo ra tên dịch vụ bao gồm:

1. **Phiên bản**: `
%h - My Service<\/name>` - Đây là một tên dễ nhận diện dành cho người dùng giúp họ nhận biết dịch vụ một cách dễ dàng hơn, ví dụ như "Máy in tầng 2". Tùy chọn `replace-wildcards` cho phép tên máy chủ (`%h`), như "matter-dev", tự động thêm trước "- My Service", tùy chỉnh tên của dịch vụ.

2. **Dịch vụ**: `_myservice._tcp<\/type>` - Loại hình dịch vụ này bắt đầu bằng dấu gạch dưới, theo sau là loại dịch vụ và kết thúc với giao thức "._tcp" hoặc "._udp" (cho tất cả các loại khác). Mã `_myservice._tcp` chỉ ra rằng loại hình dịch vụ là (_myservice) và giao thức (TCP), điều này giúp khách hàng dễ dàng tìm kiếm được dịch vụ này.

Hai thành phần trên kết hợp với tên máy chủ để tạo nên cái mà chúng ta gọi là "`matter-dev - My Service._myservice._tcp.local`". Tên quảng bá này còn được biết đến như "Tên phiên bản Dịch vụ" theo định nghĩa trong RFC 6763, bao gồm ba phần:

- **Phiên bản**: Được mô tả ở trên.
- **Dịch vụ**: Được mô tả ở trên.
- **Miền**: Miền mà trong đó dịch vụ được đăng ký, thường là "local." trong các mạng cục bộ.

Tất cả những yếu tố này cùng nhau tạo thành một Tên phiên bản Dịch vụ hoàn chỉnh phục vụ cho việc khám phá trong môi trường mạng. Tuy nhiên, việc phát hiện một dịch vụ không chỉ dừng lại ở cái tên của nó. Những chi tiết thiết yếu như số cổng tầng truyền tải, tên máy chủ, địa chỉ IP và cấu hình cũng rất quan trọng.

mDNS hoạt động dựa trên nguyên lý rằng các thiết bị có thể tự động phát hiện lẫn nhau mà không cần sự cấu hình tĩnh phức tạp nào. Điều này đặc biệt hữu ích trong các ứng dụng IoT nơi mà nhiều thiết bị cần phải tương tác với nhau một cách linh hoạt và nhanh chóng. Thông qua mDNS, mỗi thiết bị có thể quảng bá thông tin của chính mình tới mạng lưới xung quanh và đồng thời truy cập vào thông tin của các thiết bị khác nhằm phục vụ cho nhu cầu sử dụng hiệu quả hơn.

Khám phá các bản ghi DNS trong mDNS

Tệp `\/etc\/avahi\/services\/myservice.service` chứa thông tin về số cổng và cấu hình trong các thẻ `
` và ``. Tất cả thông tin này được liên kết với nhau qua một tập hợp các cấu trúc DNS chính thức, được gọi là bản ghi. Việc chuẩn hóa này cho phép sử dụng các kỹ thuật tự động để truy xuất thông tin dịch vụ từ các thiết bị khác. Đầu tiên, Bản ghi PTR chỉ đến một tên miền liên quan đến phiên bản dịch vụ. Điều này được sử dụng để phát hiện dịch vụ trong DNS-SD. Bản ghi PTR giúp chuyển hướng các yêu cầu tới một tên dịch vụ cụ thể hơn. Thông tin chi tiết hơn về tên dịch vụ đó được lưu trữ trong Bản ghi SRV, nó xác định vị trí của máy chủ cho một dịch vụ cụ thể, bao gồm tên máy chủ mục tiêu, cổng tầng vận chuyển và độ ưu tiên của dịch vụ. Những thông tin này gần như đủ để kết nối với dịch vụ mà bạn cần. 

Để hiểu rõ hơn về cách hoạt động của các bản ghi này, có những loại bản ghi khác như A (địa chỉ IPv4), AAAA (địa chỉ IPv6) cũng đóng vai trò quan trọng trong việc xác định thiết bị trong mạng IoT. Mỗi loại bản ghi góp phần vào quá trình nhận diện và truy cập nhanh chóng vào các dịch vụ trên mạng. Ví dụ, bản ghi A sẽ cung cấp địa chỉ IP tương ứng với tên miền, còn bản ghi AAAA thì dành cho địa chỉ IPv6 hiện đại hơn.

Ngoài ra, có nhiều công cụ hữu ích mà bạn có thể sử dụng để kiểm tra và phân tích mDNS records như `avahi-browse`, `dns-sd`, hoặc thậm chí là Wireshark để theo dõi lưu lượng mạng và xem xét chi tiết từng gói dữ liệu giao tiếp giữa các thiết bị trong môi trường IoT.

Phương pháp phát hiện dịch vụ sử dụng avahi-browse

Phần còn thiếu là địa chỉ IP của máy chủ dịch vụ, được cung cấp bởi bản ghi AAAA. Thông tin kết nối được chỉ định trong các bản ghi PTR, SRV và AAAA sẽ được kết hợp với thông tin trong bản ghi TXT để cấu hình dịch vụ. Bản ghi TXT này lưu trữ dữ liệu cấu hình dưới dạng cặp khóa-giá trị trong định dạng chuỗi văn bản. Bây giờ, chúng ta sẽ xem xét thứ tự mà các bản ghi này được yêu cầu khi phát hiện một dịch vụ.

Khi một thiết bị muốn tìm kiếm dịch vụ, nó sẽ bắt đầu bằng cách kiểm tra bản ghi PTR để xác định tên miền của dịch vụ mong muốn. Tiếp theo, nó sẽ truy cập vào các bản ghi SRV để lấy thông tin về cổng và phương thức giao tiếp cần thiết cho việc kết nối đến dịch vụ đó. Cuối cùng, địa chỉ IP của máy chủ sẽ được lấy từ bản ghi AAAA. Tất cả những thông tin này sau đó sẽ được sử dụng cùng với dữ liệu từ bản ghi TXT để hoàn thành quá trình cấu hình và khởi động dịch vụ một cách chính xác.

Như vậy, việc sử dụng các loại bản ghi DNS khác nhau giúp đảm bảo rằng nhiều yếu tố cần thiết cho việc phát hiện và kết nối đến một dịch vụ đều được tổ chức rõ ràng và hiệu quả trong mạng LAN. Điều này không chỉ giúp tiết kiệm thời gian mà còn giảm thiểu khả năng xảy ra sai sót trong quá trình xác định và liên lạc với các dịch vụ khác nhau trên mạng.

Phân tích gói tin mDNS bằng Wireshark

Để khám phá cách các thiết bị tìm kiếm dịch vụ mDNS (giả sử daemon Avahi đang chạy trên máy chủ M), chúng ta có thể sử dụng ứng dụng `avahi-browse` trên máy chủ C để tìm bất kỳ dịch vụ mDNS nào đang quảng bá trên địa chỉ đa phương tiện ff02::fb. Dưới đây là một ví dụ minh họa. Tôi đã loại bỏ lưu lượng IPv4 và kết quả từ giao diện loopback để tập trung vào giao diện ens33 mà tôi quan tâm đến các gói tin mDNS. Kết quả hiển thị tên phiên bản dịch vụ, tên máy chủ M cùng với địa chỉ IPv6, số cổng dịch vụ và các cặp giá trị cấu hình.

$ avahi-browse -a -r


Kết quả trả về (đã chỉnh sửa để chỉ hiển thị kết quả từ giao diện ens33):

+ ens33 IPv6 matter-dev - My Service _myservice._tcp local=
ens33 IPv6 matter-dev - My Service _myservice._tcp
hostname = [matter-dev.local]
address = [fe80::bb63:fa10:f529:2e86]
port = [1234]
txt = ["key3=value3" "key2=value2" "key1=value1"]


Thông qua lệnh này, bạn có thể thấy được thông tin chi tiết về dịch vụ mà thiết bị đang quảng cáo, bao gồm cả địa chỉ IP và các thuộc tính khác liên quan đến dịch vụ đó.

Chi tiết giao tiếp giữa các thiết bị trong mạng cục bộ

Cách mà những gì chúng ta thấy từ `avahi-browse` trên host C phù hợp với những gì được gửi bởi host M? Câu trả lời nằm trong bản ghi Wireshark của các gói mDNS. Bốn gói mDNS quan trọng đã được ghi lại trên host M khi chạy `avahi-browse -a -r` trên host C như sau:

Đầu tiên, gói (5A) thực hiện việc liệt kê các loại dịch vụ bằng cách sử dụng tên ngắn đặc biệt _services._dns-sd._udp.local. Gói thứ hai (5B) cho thấy giao tiếp mDNS diễn ra qua cổng 5353, điều này rất quan trọng vì nó là tiêu chuẩn cho giao thức này. Tiếp theo, ở gói (5C), địa chỉ IPv6 của host C được xác định rõ ràng; điều này giúp trong việc nhận diện và liên lạc giữa các thiết bị trong mạng.

Gói (5D) mang địa chỉ multicast dành riêng cho toàn bộ lưu lượng mDNS, một yếu tố không thể thiếu để đảm bảo rằng thông tin được phát đi đến tất cả các thiết bị đang lắng nghe. Đặc biệt cần chú ý là gói (5E), nơi mà ID giao dịch mDNS không được sử dụng – đây có thể là điểm khác biệt so với một số giao thức khác mà bạn đã từng biết.

Sau đó, ở gói (5F), địa chỉ IPv6 và cổng mDNS của host M cũng được nêu rõ, điều này giúp xác định nguồn gửi phản hồi cho yêu cầu từ host C. Gói tiếp theo (5G) là phản hồi từ host M đối với yêu cầu liệt kê dịch vụ của nó, bao gồm tên dịch vụ mà nó cung cấp. Cuối cùng, trong gói (5H), chúng ta thấy rằng host C đã yêu cầu thông tin chi tiết về dịch vụ của host M và ở gói cuối cùng (5I), thông tin cụ thể về dịch vụ của host M bao gồm cả địa chỉ và cấu hình cũng như cách hoạt động của nó trong mạng lưới.

Tóm lại, sự tương tác giữa các thiết bị qua giao thức mDNS này không chỉ đơn thuần là việc truyền tải dữ liệu mà còn đóng vai trò quan trọng trong việc phát hiện và quản lý các dịch vụ mạng hiệu quả hơn.

Kết luận và hướng đi tiếp theo

Bốn gói tin mDNS được mô tả theo thứ tự mà chúng được gửi: **Gói tin 1** từ máy chủ C yêu cầu thông tin về các dịch vụ có sẵn trong mạng cục bộ thông qua loại dịch vụ mDNS `_services._dns-sd._udp.local`. Tất cả giao tiếp mDNS diễn ra qua cổng UDP 5353 và được gửi đến địa chỉ multicast. Mã định danh giao dịch DNS không được xem xét trong giao tiếp này. **Gói tin 2** là phản hồi từ máy chủ M đối với yêu cầu liệt kê dịch vụ. Máy chủ M chia sẻ dịch vụ mà tôi đã cấu hình trước đó, "`matter-dev - My Service._myservice._tcp.local`". Nó cũng sử dụng cổng UDP 5353 cần thiết để gửi phản hồi này. **Gói tin 3** lại từ máy chủ C yêu cầu thêm thông tin về dịch vụ của máy chủ M, "`matter-dev - My Service._myservice._tcp.local`", và **gói tin 4** cung cấp những chi tiết cụ thể của dịch vụ ấy, bao gồm địa chỉ và cấu hình. Những chi tiết này đã được mô tả trước đó.

## Kết luận
Chúng ta đã khám phá cách thiết lập mDNS, cách thức truyền tải các thông điệp và cách lưu lượng truy cập đến các máy khác qua địa chỉ multicast. Các công cụ Avahi tạo ra và hiển thị quảng cáo dịch vụ, trong khi Wireshark cho phép chúng ta nhìn sâu vào hoạt động của mDNS. Điều này sẽ giúp chuẩn bị cho hai bài viết tiếp theo; bài viết kế tiếp nói về việc Matter sử dụng mDNS, còn bài thứ ba đề cập đến sự chuyển đổi của các quảng cáo mDNS khi di chuyển từ Ethernet sang Thread.

## Tài liệu tham khảo
- Multicast DNS [[RFC 6762]]
- DNS-SD Dịch vụ dựa trên DNS [[RFC 6763]]

Reference Articles

Multicast Domain Name System (mDNS)

Lập trình Arduino kết nối Wifi là khóa học IoT với Arduino nâng cao, giúp các bạn làm quen với các khái niệm về phần truyền và nhận dữ liệu lên Internet ...

Source: Ohstem

Internet Of Things (IoT) : cho người mới bắt đầu

Phần cứng sử dụng chính là System On Chip (SoC) ESP8266 - có khả năng kết nối WiFi và lập trình được với giá thành rẻ và phổ biến trên thế giới.

Source: GitHub Pages

GIẢI PHÁP ĐIỀU KHIỂN TẮC NGHẼN TRONG MẠNG IoT ...

Chi tiết về các giao thức ở nhóm hạ tầng mạng như định tuyến, IPv4/IPv6, 6LoWPAN, WiFi (802.11), ZigBee. (802.15), LTE-A, Z-Wave có trong các tài liệu tiêu ...


Lloyd Minor

Expert

Related Discussions

❖ Related Articles