Có rất nhiều cách để bạn trỏ tên miền riêng khi sử dụng OpenWRT, cũng có rất nhiều cách khác nhau để bạn có thể sử dụng HTTPS cho tên miền, trong hướng dẫn này mình sẽ đưa ra cách mà mình thấy nó đơn giản nhất.
Mục lục nội dung
Cấu hình tên miền riêng vào OpenWRT
Để cấu hình được tên miền riêng bạn cần cài thêm các package sau đây, bạn vào ssh của router và lần lượt thêm các lệnh sau:
opkg update
opkg install ddns-scripts
opkg install luci-app-ddns
Sau đó bạn logout tài khoản root ra và login lại sẽ thấy mục Services -> Dynamic DNS hiển thị trên thanh menu router.

Tại đây bạn có thể thêm dịch vụ DDNS mà bạn muốn sử dụng và điền thông tin của bạn vào, có rất nhiều loại DDNS khác nhau ở đây, mình đã thử với noip, duckdns và cloudflare đều dùng ngon. Trong bài viết này mình sẽ hướng dẫn bạn cấu hình với tên miền riêng sử dụng DNS cloudflare.
Nếu bạn sử dụng duckdns thì trong danh sách cài đặt đã có sẵn.
Nếu bạn sử dụng noip thì bạn cần cài thêm package cho noip.
opkg install ddns-scripts-noip
Nếu bạn sử dụng cloudflare bạn cũng sẽ cần cài thêm package dành cho cloudflare.
opkg install ddns-scripts-cloudflare
Chi tiết về hướng dẫn DDNS của OpenWRT bạn có thể xem thêm tại đây.
Cấu hình sử dụng Cloudflare.
Sau khi đã cài đủ các package bạn tiến hành đăng nhập vào quản lý DNS của tên miền trong cloudflare. Tạo tên miền mà bạn cần sử dụng và trỏ tạm IP đến 1.1.1.1

Sau đó bạn tiến hành truy cập vào link này để lấy Global API Key tài khoản Cloudlflare của bạn.



Khi đã có Global API Key rồi chúng ta quay lại phần cấu hình Dynamic DNS trên router.
Bạn chọn Add new services, điền tên bạn muốn, chọn IPv4 và chọn dịch vụ là cloudflare.com-v4

Bạn nhấn Create để tạo dịch vụ và bắt đầu cấu hình nó.
Phần Basic Settings

Bạn tích vào mục chọn Enabled
Lookup Hostname: Điền tên miền bạn sẽ sử dụng.
IP address version: Chọn IPv4
DDNS Service provider: Chọn cloudflare.com-v4
Domain: Tại đây bạn điền một email tên miền của bạn vào, ví dụ [email protected]
Username: Điền email tài khoản cloudflare của bạn
Password: Bạn điền Global API Key đã lấy ở bước trên.
Use HTTP Secure: Tích chọn mục này.
Phần Advanced Settings

IP address source: Đây là cách thức để package check IP của bạn là gì để đẩy lên DNS của cloudflare. Có 4 phương án để lựa chọn là Network, URL, Interface và Script. Ở hướng dẫn này mình dùng Network.
Network: Mặc định sẽ chọn giao diện Wan của bạn ở router, nếu bạn muốn sử dụng giao diện mạng khác thì có thể chọn lại ở đây.
DNS-Server: Ở đây bạn nên đặt DNS là 1.1.1.1 hoặc 8.8.8.8 để khi có sự thay đổi IP thì việc cập nhật lại IP mới sẽ nhanh hơn và không bị phát sinh lỗi.
Các phần cấu hình còn lại bạn để mặc định.
Tiến hành nhấn Save lưu lại cấu hình, tiếp đó Save & Apply trên router để lưu và chạy.
Sau đó tiến hành Restart lại DDNS.

Sau khi khởi động lại xong, bạn tiến hành vào phần Edit của cấu hình bạn vữa tạo.

Chuyển sang tab Log File Viewer và chọn Read / Reread log file
Kéo phần log xuống cuối cùng nếu bạn thấy có 1 đoạn log như sau thì tức là IP đã cập nhật thành công.
IPv4 at CloudFlare.com already up to date
Forced update successful - IP: 'IP của giao diện WAN bạn đã chọn' send
Waiting 300 seconds (Check Interval)
Nếu IP cập nhật thành công thì bạn đã có thể sử dụng tên miền bằng cách bật trình duyệt web lên, truy cập vào tên miền của bạn là sẽ vào thẳng giao diện đăng nhập của router. Khi đã truy cập thành công bạn sẽ thấy trên thanh trình duyệt đang hiển thị là http:// thay vì https:// để có thể sử dụng giao thức https giúp cho việc bảo mật tốt hơn một chút và cũng để cho một số giao thức bắt buộc phải có https thì bạn làm theo hướng dẫn bên dưới.
Lưu ý:
Nếu restart DDNS xong mà check log chưa thấy gì thì bạn nhấn vào phần Reload và chờ cho nó chạy xong rồi check lại log xem sao.

Nếu bạn check log thấy tên miền đã được cập nhật IP thành công rồi nhưng truy cập trên trình duyệt web vẫn chưa vào được thì kiểm tra xem máy của bạn đã cập nhật đúng IP đó cho tên miền chưa bằng cách vào Command trên máy Window.
ipconfig /flushdns
ping domain.com

Nếu ping ra được đúng Public IP của router thì mới chạy, còn ra IP khác thì có thể DNS của bạn chưa cập nhật được IP mới của tên miền, bạn cần chờ 1 thời gian để DNS cập nhật đúng IP thì sẽ vào được.
Hướng dẫn cài đặt HTTPS cho OpenWRT
Có rất nhiều hướng dẫn khác nhau để cài HTTPS cho OpenWRT, ở hướng dẫn này mình sẽ sử dụng chứng chỉ miễn phí tại zerossl.
Đầu tiên bạn cần vào System -> Software của router chọn tab Installed và nhập vào ô Filter để tìm kiếm 1 trong 3 cặp package này.
libuhttpd-mbedtls
libustream-mbedtls20201210
hoặc
libuhttpd-openssl
libustream-openssl20201210
hoặc
libuhttpd-wolfssl
libustream-wolfssl20201210
Bạn lưu ý phải check trong tab Installed trước để xem firmware của bạn đang sử dụng cái nào trong 3 cái trên, thường thì ở các bản OpenWRT 23.05 trở lên hay có cài sẵn libustream-openssl20201210 bạn chỉ cần cài thêm libuhttpd-openssl là được. Tương tự như thế nếu router của bạn đã cài sẵn libustream-mbedtls20201210 thì bạn chỉ cần cài thêm libuhttpd-mbedtls. Lưu ý là không gỡ bản libustream có sẵn của bạn, nếu không sẽ bị lỗi TLS phải cài lại package thủ công, khá phiền phức.
Khi đã cài 1 trong 3 bản package bên trên chúng ta tiến hành đăng ký tài khoản zerossl tại đây và tiến hành lấy chứng chỉ.
Sau khi đăng ký và đăng nhập thành công vào Dashboard của zerosl bạn chọn New Certificate để tạo chứng chỉ mới.

Điền tên miền mà bạn cần tạo chứng chỉ ssl.

Tại mục Validity bạn chọn 90 ngày nếu dùng ssl miễn phí và 1 năm nếu bạn sử dụng chứng chỉ trả phí.

Mục Add-Ons để mặc định nếu bạn dùng chứng chỉ 90 ngày miễn phí.

CSR & Contact để mặc định.

Finalize Your Order chọn plan miễn phí hoặc trả phí tùy vào nhu cầu của bạn, ở đây mình chọn miễn phí.

Tiếp theo bạn cần xác thực mình là chủ sở hữu domain hoặc sub domain mà bạn đang sử dụng theo 1 trong 3 cách sau:
Email Verification

Bạn sẽ cần nhận 1 email xác thực từ hệ thống của zerossl, email sẽ được gửi đến một trong các email của tên miền mà zerossl gợi ý như trong ảnh demo bên trên, không phải dùng email nào cũng được. Đối với cách này bạn phải có quyền nhận email từ tên miền riêng.
DNS (CNAME)

Đối với cách xác minh bằng DNS bạn cần có quyền vào quản lý DNS của tên miền, thêm CNAME theo hướng dẫn zerossl đưa ra cho bạn.
File Upload

Đây là cách xác thực bằng file upload, bạn tải file cho sẵn của zerossl về upload lên theo hướng dẫn là được.
Trong hướng dẫn này mình sử dụng xác minh qua email là thấy đơn giản nhất, 2 cách kia phải cấu hình hơi phức tạp.
Sau khi xác minh tên miền xong bạn qua mục Certificates để tải file chứng chỉ về.

Giải nén file chứng chỉ bạn sẽ thấy 3 file như sau:

Ok, đã có 3 file này rồi chúng ta quay lại phần ssh của router.
Bạn sẽ cần chỉnh sửa file
nano /etc/config/uhttpd
Nếu bạn chưa có nano có thể chỉnh sửa bằng vi hoặc có thể cài thêm nano. Trong hướng dẫn này mình dùng nano.
opkg install nano
Trong file /etc/config/uhttpd bạn sửa option redirect_https thành “1”

Ctrl + O để lưu lại và Ctrl + X để thoát.
Tiếp theo bạn tạo file
nano /etc/uhttpd.crt
Chép nội dung trong file certificate.crt đã giải nén bên trên và dán vào file này, Ctrl + O để lưu và Ctrl + X để thoát.
Tiếp tục tạo file
nano /etc/uhttpd.key
Chép nội dung trong file private.key vào đây và lưu lại.
Tiếp theo khởi động lại uhttpd
/etc/init.d/uhttpd restart
Bây giờ bạn truy cập tên miền sẽ tự động chuyển sang https như vậy là thành công.
Lưu ý hiện tại bạn chỉ truy cập được từ mạng nội bộ, nếu bạn muốn truy cập từ mạng khác vào router thông qua tên miền bạn sẽ cần mở port 80 và 443 ra internet bằng cách vào Network -> Firewall -> Port Forwards và tiến hành mở port.

Name: Bạn để tên gì cũng được
External port: Bạn điền port cần mở ở đây, trong ví dụ này là 80
Internal IP address: Điền IP của router vào đây, hoặc bất cứ IP nội bộ nào mà bạn cần mở port cho nó.
Internal port: Bạn điền port tương tự external port, ở đây là 80
Tương tự như thế bạn mở thêm port 443 nữa là được. Việc mở port ra ngoài internet cũng sẽ mang đến nhiều nguy cơ bảo mật, cần thiết thì mở không thì thôi bạn nhé, và nhớ đặt mật khẩu router phức tạp một chút.
Với cách này thì bạn sẽ dễ dàng thay đổi chứng chỉ của bất cứ nhà cung cấp nào, chỉ việc vào edit các file /etc/uhttpd.crt và /etc/uhttpd.key cập nhật chứng chỉ của bạn vào là được. Nhược điểm là phải gia hạn thủ công. Với zerossl thì 90 ngày phải cập nhật lại một lần. Mình thấy thế cũng được. Nếu có cách nào tốt hơn mình sẽ cập nhật thêm sau.
Bạn có thể xem thêm thông tin về uHTTPd Web Server Configuration nếu cần tại đây.
Trong quá trình cài nếu phát sinh lỗi bạn có thể để lại comment bên dưới để mình hỗ trợ.