OpenWrt trên Router Nhà: DNS Tùy Chỉnh, VPN, và QoS Sau 6 Tháng Dùng Thực Tế

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Vấn Đề Khởi Đầu Tất Cả

Mạng nhà tôi lúc đó là một mớ hỗn độn. Cuộc gọi video cứ bị đứng mỗi khi con tôi bật YouTube xem. DNS query thì rò rỉ sang máy chủ của nhà mạng — những máy chủ mà tôi chẳng có lý do gì để tin tưởng. Còn cái “router gaming” với đèn LED nhấp nháy loè loẹt kia? Nó thậm chí không cho tôi biết thiết bị nào đang chiếm hết băng thông lúc 2 giờ sáng.

Sáu tháng trước, tôi flash OpenWrt lên ba router khác nhau: TP-Link Archer C7, Linksys WRT3200ACM, và Raspberry Pi 4 nối dây làm router phụ. Tóm lại — nó hoạt động tốt. Nhưng con đường đến đó gập ghềnh hơn nhiều so với những gì các hướng dẫn thường viết, và hầu như ai cũng bỏ qua những phần thực sự quan trọng trong cuộc sống hàng ngày.

Nguyên Nhân Gốc Rễ: Firmware Gốc Nghèo Nàn Tính Năng

Mọi firmware gốc của router mà tôi từng dùng đều chỉ tối ưu cho một việc: đưa bạn lên mạng trong mười phút. Khả năng kiểm soát mạng chỉ là thứ phụ. Giới hạn băng thông theo từng thiết bị? Bị ẩn hoặc không có. DNS-over-TLS với resolver dự phòng? Cứ thử tìm xem trong giao diện consumer. Phân tích traffic theo giao thức theo thời gian thực? Đó là tính năng enterprise giá 500 đô.

Bảo mật còn tệ hơn. Router do nhà mạng cấp của tôi vẫn chạy kernel từ năm 2019 — ba năm CVE chưa vá nằm chình ình giữa thiết bị của tôi và internet. OpenWrt cập nhật bảo mật thường xuyên, và nó trao cho bạn toàn bộ môi trường Linux: trình quản lý gói opkg, iptables/nftables, giao diện web LuCI, và SSH vào mọi thứ.

Chi phí thực sự của firmware gốc không phải là những tính năng bị thiếu. Mà là mất khả năng quan sát một thiết bị xử lý toàn bộ gói tin mà cả nhà bạn gửi và nhận.

Ba Phương Án Tôi Đã Thử

Phương án 1: DD-WRT

DD-WRT đã tồn tại từ năm 2005. Danh sách tương thích khổng lồ, không phải bàn cãi. Tôi chạy nó trên Archer C7 hai tuần — giao diện trông như không được đụng tới từ thời Firefox 3, số lượng gói phần mềm ít hơn OpenWrt nhiều, và hệ thống build khó hiểu. Chạy thì ổn. Nhưng cảm giác như đang duy trì phần mềm cũ thay vì xây dựng thứ gì đó thực sự là của mình.

Phương án 2: Tomato/FreshTomato

Giao diện gọn hơn DD-WRT, và phần trực quan hóa QoS thực sự tốt. Nhưng có giới hạn cứng: chỉ hỗ trợ chipset Broadcom. Điều đó loại ngay hai trong ba thiết bị của tôi. Nếu bạn có Netgear R7000 hay router Broadcom tương tự, FreshTomato đáng thử. Còn với thiết bị khác, đây là ngõ cụt.

Phương án 3: OpenWrt

OpenWrt thắng trên mọi tiêu chí tôi quan tâm — hơn 6.000 gói phần mềm, phát triển tích cực, hệ thống build minh bạch, hỗ trợ WireGuard và nftables hạng nhất. Đường cong học tập dốc hơn. Nhưng nó là Linux, nên những gì bạn học được đều có thể dùng được ở nơi khác.

Phương Án Tốt Nhất: OpenWrt từ Flash đến Chạy Thực Tế

Bước 1: Kiểm Tra Tương Thích Phần Cứng Trước

Trước khi làm bất cứ điều gì, hãy kiểm tra Bảng Phần Cứng của OpenWrt. Không phải thiết bị được hỗ trợ nào cũng như nhau. Hãy chú ý đặc biệt đến dung lượng flash (tối thiểu 16MB được khuyến nghị) và RAM (tối thiểu 128MB để dùng thoải mái với các gói). Archer C7 v2 hoạt động tốt. V5 có vấn đề đã biết. Số phiên bản rất quan trọng ở đây.

Bước 2: Flash Firmware

Tải đúng file image. Có hai loại: factory (để flash từ firmware gốc) và sysupgrade (để nâng cấp OpenWrt đang có). Dùng nhầm sẽ brick router — đây không phải giả thuyết.

# Xác minh checksum SHA256 trước khi flash
sha256sum openwrt-23.05.3-ath79-generic-tplink_archer-c7-v2-squashfs-factory.bin
# So sánh với checksum trên trang tải OpenWrt

Flash qua giao diện web của firmware gốc cho lần cài đầu tiên. Sau đó, sysupgrade xử lý cập nhật mà không gây rắc rối.

Bước 3: Cài Đặt Ban Đầu Qua SSH

Sau khi flash, kết nối qua Ethernet — không phải WiFi. Rồi SSH vào:

ssh [email protected]
# Đặt mật khẩu root ngay lập tức
passwd

Cấu hình giao diện WAN. Với hầu hết mạng gia đình đặt sau modem:

uci set network.wan.proto='dhcp'
uci commit network
/etc/init.d/network restart

Bước 4: DNS Tùy Chỉnh với DNS-over-TLS

DNS được mã hóa là lý do chính khiến tôi chuyển sang. OpenWrt xử lý việc này với stubby — một stub resolver DNS-over-TLS — kết hợp với dnsmasq làm cache cục bộ. Cài cả hai:

opkg update
opkg install stubby luci-app-stubby

Cấu hình /etc/stubby/stubby.yml để dùng Cloudflare hoặc NextDNS:

resolution_type: GETDNS_RESOLUTION_STUB
dns_transport_list:
  - GETDNS_TRANSPORT_TLS
tls_authentication: GETDNS_AUTHENTICATION_REQUIRED
upstream_recursive_servers:
  - address_data: 1.1.1.1
    tls_auth_name: "cloudflare-dns.com"
  - address_data: 1.0.0.1
    tls_auth_name: "cloudflare-dns.com"
listen_addresses:
  - 127.0.0.1@5453

Trỏ dnsmasq về stubby:

uci set dhcp.@dnsmasq[0].server='127.0.0.1#5453'
uci set dhcp.@dnsmasq[0].noresolv='1'
uci commit dhcp
/etc/init.d/dnsmasq restart
/etc/init.d/stubby restart

Sáu tháng trôi qua, không một lần rò rỉ DNS nào. Độ trễ truy vấn thực ra còn giảm xuống — dnsmasq cache phản hồi cục bộ, nên các tên miền hay dùng (Google, YouTube, GitHub) trả về kết quả dưới 1ms thay vì phải gọi lên resolver upstream mỗi lần.

Bước 5: WireGuard VPN

OpenWrt hỗ trợ WireGuard gốc từ phiên bản 21.02. Nếu bạn cần giải pháp VPN đơn giản hơn cho nhiều thiết bị, Tailscale cũng là lựa chọn đáng cân nhắc. Cài các gói:

opkg install wireguard-tools luci-app-wireguard kmod-wireguard

Tạo khóa trực tiếp trên router:

wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
cat /etc/wireguard/privatekey
cat /etc/wireguard/publickey

Tạo giao diện WireGuard qua UCI:

uci set network.wg0=interface
uci set network.wg0.proto='wireguard'
uci set network.wg0.private_key="$(cat /etc/wireguard/privatekey)"
uci set network.wg0.listen_port='51820'
uci set network.wg0.addresses='10.0.0.1/24'

# Thêm một peer (laptop, điện thoại, v.v. của bạn)
uci add network wireguard_wg0
uci set network.@wireguard_wg0[-1].public_key='PEER_PUBLIC_KEY_HERE'
uci set network.@wireguard_wg0[-1].allowed_ips='10.0.0.2/32'
uci commit network

Thêm rule firewall để cho phép traffic WireGuard:

uci add firewall rule
uci set firewall.@rule[-1].name='Allow-WireGuard'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].dest_port='51820'
uci set firewall.@rule[-1].proto='udp'
uci set firewall.@rule[-1].target='ACCEPT'
uci commit firewall
/etc/init.d/firewall restart
/etc/init.d/network restart

Bước 6: QoS với SQM (Khắc Phục Bufferbloat)

Bufferbloat chính là lý do cuộc gọi video bị đứng khi ai đó đang tải file. Hàng đợi TX của router bị đầy và mọi thứ — gói Zoom, đoạn Netflix, bản cập nhật Windows nền — đều xếp hàng chung một chỗ. Không ai thắng cả.

SQM (Smart Queue Management) với thuật toán CAKE khắc phục điều này bằng cách chủ động quản lý độ sâu hàng đợi và ưu tiên traffic nhạy cảm với độ trễ. Nếu bạn muốn hiểu sâu hơn về cơ chế QoS với tc và iproute2 trên Linux, đó là nền tảng lý thuyết đằng sau những gì SQM thực hiện:

opkg install luci-app-sqm sqm-scripts

Cấu hình qua LuCI (Network → SQM QoS) hoặc UCI:

uci set sqm.eth1=queue
uci set sqm.eth1.interface='eth1'  # Giao diện WAN của bạn
uci set sqm.eth1.enabled='1'
uci set sqm.eth1.download='95000'  # 95% tốc độ download thực tế tính bằng kbps
uci set sqm.eth1.upload='19000'    # 95% tốc độ upload thực tế tính bằng kbps
uci set sqm.eth1.qdisc='cake'
uci set sqm.eth1.script='piece_of_cake.qos'
uci commit sqm
/etc/init.d/sqm restart

Chi tiết quan trọng: đặt giá trị tốc độ bằng 95% tốc độ đường truyền thực tế đo được — dùng iperf3 để đo chính xác, không phải con số nhà mạng quảng cáo. Khoảng trống đó cho phép CAKE quản lý hàng đợi trước khi buffer của nhà mạng can thiệp vào. Điểm bufferbloat trên DSLReports của tôi nhảy từ C lên A. Cuộc gọi Zoom không còn bị đứng vào buổi tối giờ cao điểm, kể cả khi có hai người chơi game cùng lúc trên cùng kết nối.

Sáu Tháng Sau: Những Gì Vẫn Hoạt Động Tốt

DNS không cần can thiệp lần nào. Không có lỗi hồi quy, không cần khởi động lại thủ công, không phát hiện rò rỉ nào qua dns.leak-test.com. WireGuard kết nối ngay tức thì mỗi lần tôi test từ mạng 4G và WiFi khách sạn — thời gian bắt tay dưới 200ms trong mọi trường hợp. Cải thiện QoS là thay đổi được nhận ra ngay nhất. Gia đình không còn phàn nàn về chất lượng cuộc gọi video nữa, chỉ sau một tuần.

Một mảng cần chú ý thường xuyên: cập nhật gói. OpenWrt không tự cập nhật theo thiết kế — ổn định hơn tiện lợi. Hãy tạo thói quen kiểm tra hàng tháng:

opkg update && opkg list-upgradable

Áp dụng cập nhật vào giờ ít traffic. Chỉ mất chưa đến năm phút.

Kỳ Vọng Ngày Đầu So Với Tháng Thứ Sáu

Ngày đầu khá vất vả nếu bạn chưa quen với dòng lệnh. LuCI xử lý được hầu hết các tác vụ thông thường, nhưng bất cứ thứ gì thú vị hơn hầu như đều dẫn đến lệnh UCI hoặc chỉnh sửa file trực tiếp. Hãy dành cả ngày cuối tuần để làm quen trước khi nó trở thành router chính thức của bạn.

Tháng thứ sáu lại khác hoàn toàn. Router của bạn làm đúng những gì bạn cấu hình và không làm gì khác — không telemetry gửi dữ liệu về nhà, không cập nhật firmware cưỡng bức, không tính năng nền mà bạn không thể kiểm tra hay tắt đi. Đó mới là giá trị thực sự. Không phải bất kỳ tính năng đơn lẻ nào, mà là có toàn quyền kiểm soát phần cứng mình sở hữu và nắm rõ mọi thứ đang chạy trên đó.

Share: