Home Assistant

Home Assistant: truy cập từ xa khi không thể “mở port”

Truy cập Hass từ xa

Giải pháp truy cập Home Assistant từ bên ngoài khi không thể mở port

Photo: oreilly.com (original one)
20 phút để đọc hết nội dung

Thông thường, các phương thức cấu hình máy chủ Home Assistant (Hass) để truy cập từ xa bao gồm dịch vụ Nabucasa – Home Assistant Cloud (nếu được bạn hãy sử dụng để ủng hộ nhóm phát triển) & thông qua Domain. Dịch vụ Nabucasa có phí 5USD (khoảng 120,000VND) mỗi tháng, không chỉ giúp truy cập từ xa mà còn giúp bạn dễ dàng liên kết Home Assistant với một số dịch vụ khác như Google Assistant, Alexa.

Nabucasa - Home Assistant Cloud
Bạn có thể dùng thử dịch vụ Nabucasa trong 1 tháng

Trong khi đó, truy cập Hass thông qua DDNS (như duckdns.org) hay domain là miễn phí (ngoại trừ chi phí mua và duy trì domain riêng) tuy nhiên đòi hỏi bạn phải cấu hình mạng (cấu hình IP tĩnh, port-forwarding – “mở port”) phù hợp.

Vậy nếu bạn chỉ cần truy cập từ xa nhưng lại không muốn sử dụng Nabucasa và vì lí do gì đó không thể sử dụng DDNS thì sao?

Không thể sử dụng DDNS/Domain?

Một số lí do không thể sử dụng DDNS/domain:

  • Bạn không có quyền truy cập và cấu hình router
  • Home Assistant thuộc về một mạng bị hạn chế, không thể thực hiện port-forwarding như mạng 3G/4G hoặc sau CGNAT
  • Bạn không thể cấu hình IP tĩnh cho máy chủ Home Assistant
  • Home Assistant nằm trong một mạng bị giới hạn bởi firewall chỉ cho phép truy cập một số dịch vụ nhất định như web, smtp, pop (phổ biến với mạng doanh nghiệp)

Khi vướng phải các hạn chế trên, một số cách tương đối “đơn giản” để có thể truy cập Hass từ xa bao gồm:

  • Kết nối máy chủ Hass và các thiết bị cần truy cập đến Hass qua một máy chủ VPN riêng, thông thường bạn sẽ phải tốn phí để tạo/thuê và duy trì máy chủ này
  • Sử dụng SSH reverse tunnel (xem cách dùng) khá bất tiện
  • Sử dụng mạng ngang hàngp2ppeer-to-peer như ZeroNet

Tuy nói rằng đơn giản, trên môi trường máy chủ Home Assistant (HassOS/Linux), việc cấu hình và khởi tạo các kết nối trên đều rất phức tạp với người dùng thông thường.

Truy cập qua ZeroTier

ZeroTier và ZeroTier One

ZeroTier (zerotier.com) là dịch vụ và cũng là phần mềm giúp bạn kết nối tất cả các thiết bị của mình vào một mạng ngang hàng riêng qua kết nối Internet. Để dễ hiểu, ZeroTier sẽ giúp tạo một mạng ảo (virtual network) bao gồm tất cả các thiết bị (node) kết nối vào đó, thông qua đó, các thiết bị này có thể giao tiếp với nhau gần tương tự như khi ở trong cùng một mạng nội bộ (lan).

Để sử dụng dịch vụ này trên máy chủ Home Assistant, ta sẽ sử dụng addon ZeroTier One và các ứng dụng ZeroTier One trên máy khác.

Dịch vụ Zero Tier
Kết nối tất cả dịch vụ và thiết bị vào một mạng duy nhất
! Home Assistant Core

Nếu bạn không sử dụng Home Assistant Supervisor, bạn có thể cài đặt ZeroTier ngay trên hệ điều hành (OS) hoặc sử dụng Docker.

Cài đặt trực tiếp trên Linux: curl -s https://install.zerotier.com | sudo bash

Kết nối vào mạng sau khi cài đặt: sudo zerotier-cli join network-id

Ưu điểm của ZeroTier

Ưu điểm của việc sử dụng ZeroTier truy cập Hass từ xa:

  1. Cài đặt và cấu hình đơn giản trên Hass & các thiết bị dùng để truy cập (điện thoại, máy tính)
  2. Hỗ trợ rất nhiều nền tảng vận hành máy chủ Hass (Pi/SMC/NUC/VM/NAS v.v..)
  3. Không đòi hỏi bất cứ cấu hình đặc biệt nào trên máy chủ Hass và mạng như không đòi hỏi IP tĩnh, không cần port-forwarding
  4. Tốc độ truy cập Hass khá tốt
  5. Truy cập được tất cả các dịch vụ mạng khác trên máy chủ Hass như SMB, chặn quảng cáo, SSH
  6. Hỗ trợ đa dạng thiết bị cuối (iOS/Android/Windows/MacOS/Linux)
  7. Không ảnh hưởng đến việc truy cập đến các tài nguyên khác trên thiết bị cuối
  8. Có thể sử dụng với bất cứ cổng – port hợp lệ nào, do đó gần như không bị hạn chế bởi firewall
  9. Không ảnh hưởng đến hiệu năng & năng lượng của máy chủ và thiết bị cuối

Nhược điểm khi truy cập Hass qua ZeroTier

Nhược điểm chính khi bạn chỉ có thể truy cập Hass qua ZeroTier chính là không thể sử dụng domain, do vậy cũng không thể chứng thực quyền sở hữu domain khi triển khai https. Một số dịch vụ như Google Assistant, Google Translate đòi hỏi xác thực domain, do đó không thể sử dụng được, trong khi các dịch vụ không đòi hỏi xác thực domain như Spotify, Accuweather v.v.. không bị ảnh hưởng.

Một số nhược điểm khác:

  1. Phải cài đặt và kích hoạt ứng dụng hỗ trợ ZeroTier trên mỗi thiết bị tham gia mạng
  2. Trên một số thiết bị (như thiết bị chạy iOS), ZeroTier không thể đồng thời được kích hoạt cùng với dịch vụ VPN khác

Cài đặt và cấu hình ZeroTier trên Hass

Tạo tài khoản ZeroTier

Trước khi cấu hình addon ZeroTier One, bạn cần tạo một tài khoản (Free) trên website https://zerotier.com để sử dụng dịch vụ.

Truy cập: my.zerotier.com rồi chọn Login To ZeroTier > Register để đăng ký tài khoản. Đăng kí khá đơn giản với địa chỉ email và password.

Sau khi hoàn tất đăng ký, bạn sẽ nhận được email từ ZeroTier Central để xác thực địa chỉ email. Bấm vào liên kết trong email để xác thực và chuyển đến ZeroTier Central (my.zerotier.com), tất cả các networks (mạng) và nodes (thiết bị) của bạn sẽ được quản lý từ đây.

! ZeroTier Free

Tài khoản ZeroTier miễn phí cho phép kết nối tối đa 100 thiết bị vào mạng. Các dạng tài khoản trả phí không giới hạn số thiết bị và chủ yếu khác nhau ở dịch vụ hỗ trợ.

Tạo network riêng cho các thiết bị truy cập Hass

Một tài khoản ZeroTier có thể tạo nhiều network (mạng). Để tạo network, bạn truy cập vào địa chỉ my.zerotier.com/network.

Bấm + Create a Network để tạo một mạng mới.

ZeroTier Create Network
Tạo Mạng mới

Tiếp theo điền các thông tin mô tả cho mạng mới tạo này.

ZeroTier Network
ZeroTier network

Lưu ý: Không chọn PUBLIC cho mạng này

Tiếp theo, bạn có thể lựa chọn dải địa chỉ IP sẽ được gán cho các máy con, tương tự như khi cấu hình máy chủ DHCP. Lưu ý, chọn dải IP ít phổ biến để tránh lỗi định tuyến khi các thiết bị ở trong mạng nội bộ có dải IP tương tự (1).

ZeroTier network ipv4
Cấu hình dải IP

Cuối cùng, copy lại Network ID để sử dụng cấu hình addon ZeroTier One và các thiết bị khác. Đây là chìa khoá duy nhất để kết nối vào mạng.

Các cấu hình bạn đã thực hiện sẽ được lưu tự động nhưng bạn đừng đóng cửa sổ trình duyệt vội.

(1) Thiết bị sẽ không phân biệt được địa chỉ IP 192.168.1.10 nằm trong mạng LAN hay trong mạng ZeroTier nếu 2 dải IP này trùng nhau.

Cài đặt addon ZeroTier One

Để cài đặt addon ZeroTier One, bạn vào Supervisor > Add-on store, tìm kiếm “zero” rồi chọn addon ZeroTier One trong kết quả tìm kiếm, bấm INSTALL để cài đặt.

* Sau khi hoàn tất cài đặt, bạn nhớ chọn Start on boot.

Hass Addon Zero Tier One
addon ZeroTier One

Chuyển đến mục Configuration trên addon ZeroTier One rồi thêm Network ID đã copy ở trên vào phần cấu hình networks: của addon.

Cấu hình addon ZeroTier One trong Hass
Cấu hình addon ZeroTier One

Lưu ý: có thể cấu hình để máy chủ Hass tham gia vào nhiều network khác nhau tạo bởi ZeroTier, ví dụ như khi bạn muốn tất cả các thiết bị đều truy cập được máy chủ Hass nhưng một số thiết bị sẽ không “nhìn thấy” những thiết bị khác trong mạng.

Sau khi cấu hình networks, bạn chọn SAVESTART addon ZeroTier One để bắt đầu kết nối vào mạng ZeroTier đã tạo.

Cài đặt và tham gia mạng ZeroTier trên thiết bị

Trên các thiết bị còn lại (các thiết bị cần truy cập máy chủ Hass từ xa), bạn tải và cài đặt ứng dụng ZeroTier One để tham gia vào mạng.

Bạn có thể tải ứng dụng cho Windows/MacOS/Linux/iOS/Android/OpenWrt/FreeBSD/NAT tại: ZeroTier Download.

Bạn cũng có thể quét – scan QRcode bên dưới để tải ứng dụng ZeroTier One trên iOS & Android.

ZeroTier Appstore QRCode
AppStore/iOS
ZeroTier Playstore QRCode
PlayStore/Android

Sau khi cài đặt, mở ứng dụng ZeroTier One, chọn Tham gia mạng – Join network hoặc Thêm mạng rồi nhập cùng Network ID đã tạo trong ZeroTier Central (my.zerotier.com) để tham gia mạng.

ZeroTier trên iPhone (retina)ZeroTier trên iPhone (retina)
Thêm và kết nối network trên ZeroTier One iOS

Cho phép thiết bị tham gia mạng ZeroTier

Sau khi hoàn tất cài đặt, cấu hình và tham gia mạng trên máy chủ Home Assistant lẫn các thiết bị cuối, bạn quay lại trang ZeroTier Central (my.zerotier.com) để cho phép các thiết bị tham gia mạng. (với mỗi thiết bị mới, bạn phải làm lại bước này)

Chọn menu Networks (hoặc quay lại trang cấu hình mạng lúc nãy), chọn Network ID đã tạo để truy cập trang cấu hình.

Kéo xuống dưới để tìm mục Members, là nơi thể hiện danh sách các thiết bị tham gia mạng và cấu hình cho các thiết bị này.

Hass ZeroTier Members
Danh sách các thiết bị đang tham gia vào mạng

Để CHO PHÉP một thiết bị được tham gia mạng (từ bây giờ về sau), bạn đánh dấu vào cột Auth? tương ứng với thiết bị đó.

Bạn cũng có thể nhập tên và mô tả cho từng thiết bị để dễ quản lý.

Truy cập Hass từ xa qua mạng ZeroTier

Sau khi cho phép máy chủ Hass và thiết bị khác tham gia vào cùng một mạng, bạn có thể truy cập đến máy chủ Hass từ xa trên các thiết bị khác qua địa chỉ nội bộ (Managed IPs) thể hiện trong ZeroTier Central. Địa chỉ này sẽ không thay đổi cho đến khi bạn cấu hình lại network hoặc thay đổi một số cài đặt trên thiết bị (xoá addon, xoá app).

Trong ví dụ trên, bạn có thể truy cập đến giao diện máy chủ Hass qua địa chỉ:

http://10.147.20.66:8123 hoặc https://10.147.20.66:8123 trong trường hợp sử dụng giao thức https.

Tương tự như trong mạng nội bộ – LAN, bạn cũng có thể kết nối đến dịch vụ Samba trên máy chủ Hass qua địa chỉ này.

Một vài lưu ý

Truy cập từ thiết bị cùng mạng nội bộ

Bạn có thể truy cập đến máy chủ Hass trên cùng mạng nội bộ qua cả hai địa chỉ thật và ảo (tạo bởi ZeroTier). Trong các mạng cho phép UDP Broadcast, không có khác biệt đáng kể nào giữa 2 cách này.

Cấu hình Firewall cho phép ZeroTier

Trên nhiều hệ điều hành – như Windows, bạn cần cấu hình Firewall/Chương trình bảo mật để cho phép ứng dụng ZeroTier One kết nối Internet. Cách cấu hình tương tự như khi bạn cấu hình cho phép các ứng dụng khác.

Cấu hình cổng – port cho ZeroTier

Mặc định, ZeroTier sử dụng cổng 9993 (cổng ra) và giao thức UDP (trên mỗi thiết bị) để kết nối. Giữ nguyên cổng này có lợi về hiệu suất hoạt động của ZeroTier cũng như thiết bị.

Tuy nhiên nếu không thể kết nối trên cổng này (như khi bị Firewall chặn), bạn có thể cấu hình một cổng khác trong addon ZeroTier One, mục Network.

Cấu hình cổng addon ZeroTier
Cấu hình cổng cho addon ZeroTier One

Cần lưu ý:

  • Các cổng ít bị chặn ở môi trường doanh nghiệp: 80/443 (web-http/https), 25/465/587 (email)
  • Bạn có thể sử dụng hầu như mọi cổng hợp lệ, tuy nhiên KHÔNG sử dụng các cổng đang sử dụng trên thiết bị (máy chủ Hass). Các cổng này thường là 8123 (Hass), 445 (Samba), 1194 (OpenVPN) v.v..

Cấu hình Router

ZeroTier được biết (từ nhiều năm trước) là hoạt động “trơn tru” trong đa số trường hợp. Tuy nhiên, đôi khi có thể gặp vấn đề kết nối và tốc độ cũng như độ ổn định khi:

  • Thiết bị nằm sau quá nhiều bộ biên dịch địa chỉ (NAT)
  • Thiết bị nằm sau một NAT dạng symmetric (đối xứng – ít phổ biến)
  • Thiết bị nằm trong một mạng bị giới hạn, vô hiệu hoá kết nối UDP

Sử dụng ZeroTier như VPN

Mặc dù khá giống VPN (mạng riêng ảo), ZeroTier sử dụng trong bài này chưa phải là một giải pháp VPN. Để thực sự biến máy chủ Hass chạy ZeroTier thành một máy chủ VPN (tham khảo: Home Assistant – máy chủ VPN Wireguard), bạn cần phải kích hoạt NATIP Forwarding cũng như cấu hình network route phù hợp trên máy chủ Hass. Bên cạnh đó, cũng cần bổ sung một số route (định tuyến) trong network bạn đã tạo, sử dụng ZeroTier Central (my.zerotier.com).

Sử dụng Adguard/Pi-Hole từ bên ngoài

Nếu bạn đang vận hành dịch vụ chặn quảng cáo sử dụng DNS như Adguard/Pi-Hole và muốn sử dụng từ bên ngoài, chỉ cần cài đặt địa chỉ IP của máy chủ Adguard/Pi-Hole làm địa chỉ DNS đầu tiên trên các thiết bị tham gia cùng mạng trong ZeroTier.

Bên cạnh đó, bạn cũng có thể cấu hình Flow Rules, sử dụng ZeroTier Central để “chuyển” các yêu cầu phân giải gửi đến một địa chỉ máy chủ DNS (như 8.8.8.8 – Google DNS) về địa chỉ máy chủ Adguard/Pi-Hole.

Như rule sau:

# Accept anything else. This is required since default is 'drop'.
accept;
# Redirect DNS Requests to 8.8.8.8
redirect 10.147.20.66
	ipdest 8.8.8.8/32
    or ipdest 8.8.4.4/32
;
# End redirect DNS Request to 8.8.8.8

Lỗi kết nối trên thiết bị di động

Đôi khi bạn sẽ gặp lỗi không thể truy cập web và một số dịch vụ khác sau khi ngắt kết nối vào mạng ZeroTier đã tạo. Lỗi này thường do hệ điều hành không thực hiện đúng việc routing (định tuyến) và có thể gặp trên cả iOS lẫn Android.

Để khắc phục bạn có thể thử vô hiệu hoá kết nối (WiFi) rồi kích hoạt lại kết nối.

Sử dụng song song ZeroTier và các giải pháp truy cập từ xa khác

Bạn hoàn toàn có thể sử dụng ZeroTier như một giải pháp truy cập từ xa chính hoặc phụ cùng với các giải pháp thông thường như DDNS. Sẽ rất có ích nếu vì lỗi gì đó mà DDNS không thể cập nhật IP hoặc port-forwarding bị vô hiệu hoá v.v.. (xem thêm: khắc phục nhanh lỗi Duckdns)

Cảm ơn bạn đã xem bài viết này!

konnectED Team.

Lên Đầu
  • Đăng ký
Bạn quên mất mật khẩu? Vui lòng nhập tên đăng nhập và địa chỉ email đã đăng ký. Bạn sẽ nhận được liên kết tạo mật khẩu mới qua email (bạn nhớ kiểm tra hộp spam trong trường hợp email đi lạc).