AIoT.IO.VN
AIoT.IO.VN
router

Hướng dẫn mở SSH và flash OpenWRT cho Viettel NR3053

Ng Nghia Phan • • ⚡ 7 phút đọc • -- lượt xem • --
Hướng dẫn mở SSH và flash OpenWRT cho Viettel NR3053
MỤC LỤC BÀI VIẾT (Nhấn để xem)

Bài viết được tham khảo từ bài gốc https://github.com/quytttb/immortalwrt-mt798x-rebase của tác giả quytttb. Nếu được, hãy ủng hộ tác giả 1 Star trên github nhé.

Khám phá phần cứng Viettel SDMC NR3053

Tải các file cần thiết tại thư mục Github releases

Bài viết dành cho người dùng đã có kiến thức cơ bản về router và firmware, nếu bạn đọc không hiểu thì không nên làm theo bài viết này. Chú ý nguồn điện và các cáp kết nối không lỏng lẻo trong quá trình thực hiện. Mọi rủi ro trong quá trình thực hiện, bạn sẽ tự chịu trách nhiệm.
Firmware tác giả đang build là ImmortalWRT, bản ROM dựa trên OpenWRT do các dev Trung Quốc phát triển, nếu cần build firmware thuần OpenWRT thì liên hệ mình.

Nạp firmware qua SSH từ ROM gốc (Không cần tháo vỏ)

  • Máy tính chạy Linux và Windows cần cài sẵn git, python, các chương trình hỗ trợ truy cập ssh/telnet như Putty, …

Bước 1 — Mở khoá SSH

  1. Kết nối PC vào cổng LAN của router.

  2. Factory reset router (nhấn giữ nút Reset >10 giây cho đến khi đèn tắt rồi sáng lại). Mật khẩu admin trang web lúc này sẽ là Serial Number (S/N) in dưới đáy router.

  3. Clone và chạy công cụ unlock riêng cho NR3053:

    Linux:

    git clone https://github.com/quytttb/nr3053-tools.git
    cd nr3053-tools
    pip3 install -r requirements.txt
    python3 unlock_nr3053.py --password SERIAL_NUMBER_CUA_BAN
    

    Windows (PowerShell):

    git clone https://github.com/quytttb/nr3053-tools.git
    cd nr3053-tools
    py -m pip install -r requirements.txt
    py unlock_nr3053.py --password SERIAL_NUMBER_CUA_BAN
    

    Nếu script báo config.cgi chỉ trả JSON, hãy tải config.bin thủ công trong giao diện web ở mục Sao lưu / Backup, rồi chạy lại. Tham số --password vẫn bắt buộc vì script cần đăng nhập để upload file đã sửa:

    Linux:

    python3 unlock_nr3053.py --password SERIAL_NUMBER_CUA_BAN --config-input /duong/dan/config.bin
    

    Windows (PowerShell):

    py unlock_nr3053.py --password SERIAL_NUMBER_CUA_BAN --config-input "C:\duong\dan\config.bin"
    
  4. Đợi script chạy xong và router khởi động lại, bạn sẽ có quyền truy cập SSH:

    ssh root@192.168.1.1
    # Mật khẩu: admin
    

Bước 2 — Hiểu sự khác biệt partition layout (quan trọng!)

⚠️ Cực kỳ quan trọng: Layout phân vùng của ROM gốc Viettel khác hoàn toàn với ImmortalWrt ở phần OS/firmware. Không thể dùng sysupgrade trực tiếp vì ROM gốc dùng firmware/firmware2 kiểu flat, còn ImmortalWrt dùng UBI volumes.

ROM gốc Viettel và ImmortalWrt dùng cùng địa chỉ vật lý cho BL2/FIP (bootloader), nhưng tổ chức phần OS hoàn toàn khác:

Offset NANDROM gốc Viettel (NR3053)ImmortalWrt
0x000000 – 0x100000BL2 (mtd1)BL2 (mtd0)
0x100000 – 0x200000u-boot-env (mtd2)u-boot-env (mtd1)
0x200000 – 0x400000Factory (mtd3) ← KHÔNG GHIFactory (mtd2) ← KHÔNG GHI
0x400000 – 0x600000FIP (mtd4) ← cùng offset vật lýFIP (mtd3) ← cùng offset vật lý
0x600000 → hết NANDfirmware (32MB) + firmware2 (32MB) + các vùng khácubi (~234MB) — toàn bộ hệ điều hành

Chiến lược: Ghi FIP mới (U-Boot ImmortalWrt) vào đúng offset 0x400000 từ SSH của ROM gốc → reboot → U-Boot mới chạy → vào Web Failsafe → flash sysupgrade.itb qua HTTP (U-Boot sẽ tự định dạng lại vùng UBI).

Xác nhận layout từ SSH vào ROM gốc:

cat /proc/mtd

Kết quả điển hình ROM gốc NR3053:

dev:    size   erasesize  name
mtd0: 10000000 00020000 "spi0.0"     ← Raw toàn bộ NAND 256MB
mtd1: 00100000 00020000 "BL2"
mtd2: 00100000 00020000 "u-boot-env"
mtd3: 00200000 00020000 "Factory"    ← TUYỆT ĐỐI KHÔNG GHI
mtd4: 00200000 00020000 "FIP"        ← Ghi FIP mới vào đây
mtd5: 02000000 00020000 "firmware"
mtd6: 02000000 00020000 "firmware2"
mtd7: 08e00000 00020000 "rootfs_data"
...

Bước 3 — Ghi U-Boot ImmortalWrt vào NAND

Copy file FIP đúng thiết bị từ PC sang router:

# Chạy trên PC (Linux/macOS/Git Bash) — KHÔNG chạy trong SSH router
# NR3053:
scp immortalwrt-mediatek-filogic-viettel_nr3053-bl31-uboot.fip root@192.168.1.1:/tmp/fip.bin

# 32X6:
scp immortalwrt-mediatek-filogic-viettel_32x6-bl31-uboot.fip root@192.168.1.1:/tmp/fip.bin

Windows (PowerShell):

Windows 10/11 có sẵn OpenSSH Client. Trong PowerShell hoặc CMD:

scp immortalwrt-mediatek-filogic-viettel_nr3053-bl31-uboot.fip root@192.168.1.1:/tmp/fip.bin

Mật khẩu sau unlock: admin

Sử dụng Powershell/cmd hoặc Putty để SSH vào router, ghi FIP. Vì ROM gốc NR3053 có MTD tên FIP — có thể dùng trực tiếp:

# Xác nhận mtd4 là FIP (kích thước 0x200000 = 2097152 bytes)
cat /proc/mtd | grep FIP

# Ghi FIP ImmortalWrt vào phân vùng FIP
mtd write /tmp/fip.bin FIP

Kết quả thành công:

Unlocking FIP ...
Writing from /tmp/fip.bin to FIP ...     [w]

Nếu ROM gốc của thiết bị không có MTD tên FIP (kiểm tra cat /proc/mtd), dùng lệnh dd ghi theo offset vật lý. Offset FIP = 0x400000, erase block = 0x20000 (128KB) → seek = 0x400000 / 0x20000 = 32:

# Ghi raw vào NAND tại offset 0x400000 (bỏ qua BL2 + env + Factory)
dd if=/tmp/fip.bin of=/dev/mtd0 bs=131072 seek=32 conv=sync

Sau khi ghi xong, reboot:

sync && reboot

Bước 4 — Cài firmware ImmortalWrt qua Web Failsafe

Sau khi reboot, router chạy U-Boot ImmortalWrt. Do vùng NAND chưa có hệ điều hành hợp lệ theo định dạng UBI của ImmortalWrt, U-Boot sẽ tự động vào chế độ Web Failsafe.

Địa chỉ IP TFTP server: U-Boot ImmortalWrt mặc định dùng serverip = 192.168.1.254 (khác với 192.168.1.2 mà một số hướng dẫn khác dùng). Đặt IP PC là 192.168.1.254.
  1. Đặt IP tĩnh cho card mạng PC: 192.168.1.254/24.

Linux:

# Linux — thay eth0 bằng tên interface thật
sudo ip addr flush dev eth0
sudo ip addr add 192.168.1.254/24 dev eth0
sudo ip link set eth0 up

Windows

# Thay name bằng tên cổng LAN đang cắm (tổ hợp Win+R -> gõ ncpa.cpl -> Enter để xem)
netsh interface ip set address name="Ethernet" static 192.168.1.254 255.255.255.0
  1. Mở trình duyệt, vào http://192.168.1.1/ — giao diện “FIRMWARE UPDATE” sẽ hiện ra.

  2. Chọn file *-squashfs-sysupgrade.itb đúng thiết bị:

    • NR3053: immortalwrt-mediatek-filogic-viettel_nr3053-squashfs-sysupgrade.itb
  3. Bấm Upload → Update. Đợi ~3 phút. Router tự reboot vào ImmortalWrt.

Nếu không vào được Web Failsafe: Ping thử ping 192.168.1.1. Nếu không ping được nghĩa là FIP ghi sai (sai thiết bị hoặc file bị lỗi). Cần UART để debug, hoặc thử lại từ Bước 3 với cách ghi dd raw.


Gỡ lỗi

mtk_uartboot — handshake timeout / không kết nối

  • Kiểm tra TX/RX đã đảo (TX adapter ↔ RX board).
  • Đúng mức 3.3 V, không dùng 5 V.
  • Thử cổng khác: Linux /dev/ttyUSB0, /dev/ttyUSB1; Windows COM3, COM4 (Device Manager).
  • Chạy mtk_uartboot trước, rồi mới cắm nguồn hoặc nhấn reset.
  • Kẹp 2 cửa sổ sẵn: mtk_uartboot + picocom/PuTTY — không mở picocom/PuTTY trong lúc mtk_uartboot đang chạy.
  • Dùng đúng file BL2 RAM Payload tải từ quytttb/bl-mt798x-dhcpd Releases cho thiết bị tương ứng (bl2-viettel-nr3053-ram.bin hoặc bl2-viettel-32x6-ram.bin).

Sau FIP received không thấy log U-Boot:

  1. Ctrl+C cửa sổ mtk_uartboot ngay.
  2. Cửa sổ kia: Enter (picocom) hoặc Open (PuTTY) trong 1–2 giây — đây là lý do nên kẹp 2 cửa sổ từ đầu.
  3. Nếu vẫn trống: rút nguồn, lặp lại.
  4. Hai chương trình không cùng chiếm /dev/ttyUSB0 hoặc COMx một lúc.

TFTP timeout / không tải được file

  • TFTP server đang chạy và lắng nghe UDP 69.
  • IP máy tính 192.168.1.254, subnet /24, không gateway, tắt VPN.
  • Tên file trong thư mục TFTP khớp chính xác (phân biệt hoa/thường trên Linux TFTP).
  • Trong U-Boot: printenv serverip ipaddr → phải là 192.168.1.254 và 192.168.1.1.

Windows thêm:

  • Tftpd64 chạy Administrator, tab Tftp Server, Server interfaces = card 192.168.1.254 (không phải 127.0.0.1).
  • Current Directory trùng thư mục chứa file .itb.
  • Cho phép Tftpd64 qua Windows Firewall (UDP 69).
  • Cửa sổ Tftpd64 phải hiện dòng Read request khi router tải — không thấy = router chưa kết nối tới PC.
  • Không dùng Wi-Fi — chỉ cáp Ethernet trực tiếp PC ↔ cổng LAN router.

Sau cài đặt, thiết bị không khởi động được

  1. Vào bootmenu, chọn [4] Boot recovery system from NAND — nếu đã cài recovery.
  2. Nếu recovery chưa có, dùng Tuỳ chọn A để boot initramfs từ TFTP.
  3. Trong initramfs, chạy firstboot hoặc xoá partition từ CLI.

Reset về mặc định

Từ U-Boot bootmenu, chọn [a] Reset all settings to factory defaults.

Hoặc lệnh thủ công:

run reset_factory
reset

NR3053 — cảnh báo NMBM cũ

Nếu thiết bị trước đây dùng firmware có NMBM, khi lần đầu boot initramfs V2, chạy:

# Trong ImmortalWrt initramfs shell
ubirmvol /dev/ubi0 -N rootfs_data 2>/dev/null
ubirename /dev/ubi0 fit fit

Nếu UBI không nhận do bảng NMBM cũ, cần xoá toàn bộ phân vùng ubi từ U-Boot:

ubi part ubi
run ubi_format
# Thiết bị sẽ reset, sau đó chạy lại cài đặt từ bước đầu

Firmware: GitHub Releases hoặc bin/targets/mediatek/filogic/ sau build
Cập nhật: 2026-07-03

Bình luận & Thảo luận 0

Chia sẻ thắc mắc, phản hồi hoặc kinh nghiệm thực chiến của bạn