Препарируем multiwan-роутеры от TP-link

Так уж вышло, что в 2018-м купил себе роутеры с поддержкой нескольких WAN-портов от TP-Link. Судя по истории заказов, сначала это был TP-Link TL-R480T+ (возможно, попалась вот эта статья о том, как легко и просто можно через одну коробочку подключить несколько аплинков и балансировать нагрузку между ними – а у меня как раз была такая задача в то время), потом TL-R470T+ (тут, наверное, сыграла свою роль низкая цена) и буквально через 2 недели – гулять так гулять – TP-Link TL-ER6020 – более производительная железка уже с гигабитными интерфейсами и обещаниями о том, что тут совсем уж все круто.

Ок, как уже написал – первый опыт был не особо удачный, но на 6020 обещали, помимо прочего, поддержку работы с несколькими LAN-сетями. Была мысль сделать на базе такой железки центр роутинга в сети на новом месте вместо “привычного” линуксового хоста с самописными скриптами для iptables. Хотелось просто открывать админку и тыкать галочки по необходимости.

На деле все оказалось не так красиво. Да, железка была явно шустрее, да, были новые фичи, но настроить поддержку НЕСКОЛЬКИХ изолированных сетей и роутинг между ними  оказалось невозможно. Спустя почти 7 лет уже не помню подробностей, однако в поисках решения я даже как-то наведывался в офис Tp-link’а в Киеве и мы там как-то пытались решить эту задачу. Итог беседы и чаепития – “О… Ну, тут не получится, это вам Циска нужна. А 6020… Ну, может попробуете вернуть в магазин?”. Занавес.

В итоге роутинг на новом месте сделал по привычной схеме, а tp-link’ки были отложены на полку. Поначалу, пока были гарантийные, пытался продать, но железка не особо типичная, брать никто не хотел. Потом уже и не вспоминал о них особо. Поинтересовался как-то, можно ли накатить на них альтернативные прошивки, но поддержки в популярных проектах не было. Так и пролежали несколько лет.

На днях снова сделал типичный запрос в стиле “tp link 470 openwrt” и тут внезапно на глаза попался пост на pikabu (!) примерно годичной давности, где получали рут-шелл на некоторых устройствах от TP-Link, в том числе и искомой 470-й модели. Там была отсылка на этот форум, в свою очередь оттуда – на reddit. Везде фигурировали разные устройства; т.е., если собрать все в кучу – это и упомянутый мой multiwan-роутер, и некие TP-Link Omada (свичи), и TP-Link ER8411 (роутеры).

Вкратце – идем на “System Tools > Diagnostics > Remote Assistance” и включаем “Remote Assistance“. Это включает SSH на устройстве. Дальше можно логиниться с пользователем root и паролем в таком формате:

echo -n 'AA:BB:CC:33:DD:EEuser' | md5sum | cut -b1-16
b8a0f8859710ce76

Где AA:BB:CC:33:DD:EE – это MAC-адрес (написан на этикетке) в верхнем регистре, а user – имя пользователя, заданное при логине. На свежих системах у ssh могут быть отключены небезопасные шифры, в итоге с ноута с Debian 11 у меня не получалось попасть на устройство, но получалось с более старой системы. С ноута можно подключиться с командой, указанной на форуме TP-Link:

ssh -o KexAlgorithms=diffie-hellman-group1-sha1,diffie-hellman-group14-sha1 root@ip

В итоге я проверил все 3 устройства – и таки да, механизм работает и для TL-R480T+, и для TL-ER6020 и везде был получен root-шелл.

Между делом, кстати, обновил прошивку, последняя версия выпустилась в 2020-м году.

Дальше поразглядывал систему, а потом и разобрал железки, как же без этого? 🙂

Везде – OpenWRT 14.07.

root@TL-R470T+:~# uname -a
Linux TL-R470T+ 3.10.14 #1 Fri Mar 13 09:07:12 CST 2020 mips GNU/Linux

root@TL-R470T+:~# free -m
total used free shared buffers
Mem: 126016 44056 81960 0 5332
-/+ buffers: 38724 87292
Swap: 0 0 0

root@TL-R470T+:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                   61.5M    712.0K     60.8M   1% /
/dev/root                10.3M     10.3M         0 100% /rom
tmpfs                    61.5M    372.0K     61.2M   1% /tmp
root                     61.5M    712.0K     60.8M   1% /tmp/root
overlayfs:/tmp/root      61.5M    712.0K     60.8M   1% /
/dev/mtdblock8            2.0M    560.0K      1.5M  27% /tmp/userconfig
tmpfs                   512.0K         0    512.0K   0% /dev

В плане железа 470 и 480 идентичны: Mediatek MT7628, 128 MB RAM, поэтому описанные на форуме различия – исключительно софтовые:

Its not only rack mountable, there are much more.

1. Concurrent sessions supported in R470 is 10K while R480 supports 30K;
2. You can do port mirroring in R480 which is not possible in R470
3. NAT is available in R480 while its not there in R470.
4. IP/MAC binding is removed in R480

Похожа даже основная часть платы – честно говоря, не вижу причины, почему ее не сделали полностью одинаковой с разъемом в одном случае и пятаками для запайки проводов под внешний БП в другом. Так или иначе, что есть:

Флешки чуть отличаются. На 470 это Winbond 25Q128JVSQ, на 480 – 25Q127CSIG. Но в целом – одного поля ягоды и у меня в планах попробовать, во-первых, сдампить целиком флешки для обоих роутеров, а во-вторых – попробовать прошить 470-ку образом от 480-го (или просто впаять в 470-й флешку от 480-го для проверки).

TP-Link TL-ER6020 выглядит чуть посерьезнее:

В основе – двухядерный проц от Qualcomm:

root@TL-ER6020:~# cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 0 (v7l)
BogoMIPS        : 818.38

И 256 MB RAM:

root@TL-ER6020:~# free -m
            total         used         free       shared      buffers
Mem:        215320        91000       124320            0         6012
-/+ buffers:              84988       130332
Swap:            0            0            0

Флешка – 16-ногая MX25U25635F. Тут уже 1,8 В, но у меня  как раз есть переходник, так что в планах получить полную копию флешки и тут.

Да, как раз поэтому вчера в том числе наткнулся и на упоминание в сети бага с напряжением на программаторе.

На пока все, но в дальнейшем есть желание попробовать как-то полноценно использовать данные железки. Возможно, как-то обновить старый OpenWRT – по opkg update репозитории недоступны, но может удастся что-то найти. Так или иначе, если научиться сохранять свои скрипты и вписать все в автозапуск, то железки вполне применимы даже в том виде, что есть.

Update 2025-02-13: итак, первый апдейт: я выпаял флешки с TP-Link 470 и 480 и сделал их дампы.

Дампим 470

root@walkbook:/tmp# flashrom -p ch341a_spi -r tplink470.bin
flashrom v1.2 on Linux 5.10.0-33-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Winbond flash chip “W25Q128.V” (16384 kB, SPI) on ch341a_spi.
Reading flash… done.

[свернуть]
Дампим 480

root@walkbook:/tmp# flashrom -p ch341a_spi -r tplink480.bin
flashrom v1.2 on Linux 5.10.0-33-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found GigaDevice flash chip “GD25B128B/GD25Q128B” (16384 kB, SPI) on ch341a_spi.
Found GigaDevice flash chip “GD25Q127C/GD25Q128C” (16384 kB, SPI) on ch341a_spi.
Multiple flash chip definitions match the detected chip(s): “GD25B128B/GD25Q128B”, “GD25Q127C/GD25Q128C”
Please specify which chip definition to use with the -c <chipname> option.

root@walkbook:/tmp# flashrom -p ch341a_spi -c “GD25Q127C/GD25Q128C” -r tplink480.bin
flashrom v1.2 on Linux 5.10.0-33-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found GigaDevice flash chip “GD25Q127C/GD25Q128C” (16384 kB, SPI) on ch341a_spi.
Reading flash… done.

[свернуть]

По факту там сейчас в пользовательском разделе пароль рута (и настройки) сгенерированные под MAC-адреса моих экземпляров, но при хард-ресете все должно скинуться на дефолт и перегенерироваться заново (надо проверить).

А теперь первый эксперимент – я успешно загрузил TP-Link 470 с флешкой от 480, а также прошил флешку 470-го образом от 480-го.

Шьем

root@walkbook:/home/rain/work/tplink/480# flashrom -p ch341a_spi -w tplink480.bin
flashrom v1.2 on Linux 5.10.0-33-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Winbond flash chip “W25Q128.V” (16384 kB, SPI) on ch341a_spi.
Reading old flash chip contents… done.
Erasing and writing flash chip… Erase/write done.
Verifying flash… VERIFIED.

[свернуть]

В целом, MT7628NN достаточно часто используется во всяких роутерах, можно попробовать залить или собрать более свежую прошивку.

Мало того, поразглядывал даташит – тут вполне есть и USB 2.0, и pci-e-шина.

Да, насчет пользовательского раздела. Монтируется он в /tmp/userconfig, свободного места там 1,5 МБ. Доступен на запись, в том числе там присутствует обрабатываемый etc/rc.local, в который можно вписать ссылки на свой скрипт. В целом тут получается слоенка с помощью overlayfs – похоже, какой-то предшественник overlayroot, с которым я столкнулся в Armbian. В mount у нас

/dev/root on /rom type squashfs (ro,relatime)
root on /tmp/root type tmpfs (rw,noatime,mode=755)
overlayfs:/tmp/root on / type overlayfs (rw,noatime,lowerdir=/,upperdir=/tmp/root)

Т.е., как и в случае с NAS’ом, есть RO нижний слой и есть верхний в tmpfs. В свою очередь,

root@TL-R480T+:~# cat /proc/cmdline
console=ttyS1,115200n8 root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd rootfstype=squashfs,yaffs,jffs2

И попутно:

/dev/mtdblock8 on /tmp/userconfig type jffs2 (rw,relatime)

Где идут отсылки на /tmp/userconfig – пока не нашел (т.е., как файл, лежащий в /tmp/userconfig/etc/rc.local, становится актуальным в корне – не знаю). В остальном – mtdblock2 – это squashfs на 10,3 МБ, mtdblock8 – наш RW-раздел.

Из интересного – /lib/functions/userconfig.sh и каталог /etc/cfgsync.d/

Update 2025-02-16: выпаял флешку  из TP-Link TL-ER6020. Сначала вырисовывал согласно даташиту схему соединений между 16-выводным и 8-выводным вариантом; под вопросом была только 7-я нога. В 8-выводном варианте она звалась RESET#/SIO3, в 16-выводном были 2 значимых ноги с такими названиями: 1 – DNU/SIO3 и 3 – RESET#. Как оказалось, с программатором был переходник (на который я обычно подключал “прищепку”), на котором были посадочные места под 8 и 16 ног как раз с нужными связями. Правильным вариантом оказалось подключение на 1-ю ногу.

Поначалу пытался подключить микросхему без запайки, простым прижатием, но контакта так и не было, в итоге  пропаял используемые ноги.

Дамп делал дважды – сначала своей немного устаревшей версией flashrom из дистрибутива, потом собрал из исходников наиболее свежую. В обоих случаях была ругань на возможно некорректную работу с некоторыми операциями, но на чтение оба дампа совпали:

Дамп TP-Link TL-ER6020

root@walkbook:/tmp# flashrom -p ch341a_spi -r 6020.rom
flashrom v1.2 on Linux 5.10.0-33-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Macronix flash chip “MX25U25635F” (32768 kB, SPI) on ch341a_spi.
===
This flash part has status UNTESTED for operations: ERASE WRITE
The test status of this chip may have been updated in the latest development
version of flashrom. If you are running the latest development version,
please email a report to flashrom@flashrom.org if any of the above operations
work correctly for you with this flash chip. Please include the flashrom log
file for all operations you tested (see the man page for details), and mention
which mainboard or programmer you tested in the subject line.
Thanks for your help!
Reading flash… done.

rain@walkbook:/tmp/flashrom/builddir$ sudo ./flashrom -p ch341a_spi -r /tmp/6020-1.rom
flashrom v1.6.0-devel (git:v1.5.0-19-g971ea27d) on Linux 5.10.0-33-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Found Macronix flash chip “MX25U25635F” (32768 kB, SPI) on ch341a_spi.
Found Macronix flash chip “MX25U25643G” (32768 kB, SPI) on ch341a_spi.
Found Macronix flash chip “MX25U25645G” (32768 kB, SPI) on ch341a_spi.
Multiple flash chip definitions match the detected chip(s): “MX25U25635F”, “MX25U25643G”, “MX25U25645G”
Please specify which chip definition to use with the -c <chipname> option.
rain@walkbook:/tmp/flashrom/builddir$ sudo ./flashrom -p ch341a_spi -c “MX25U25635F” -r /tmp/6020-1.rom
flashrom v1.6.0-devel (git:v1.5.0-19-g971ea27d) on Linux 5.10.0-33-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Found Macronix flash chip “MX25U25635F” (32768 kB, SPI) on ch341a_spi.
===
This flash part has status UNTESTED for operations: WP
The test status of this chip may have been updated in the latest development
version of flashrom. If you are running the latest development version,
please email a report to flashrom@flashrom.org if any of the above operations
work correctly for you with this flash chip. Please include the flashrom log
file for all operations you tested (see the man page for details), and mention
which mainboard or programmer you tested in the subject line.
You can also try to follow the instructions here:
https://www.flashrom.org/contrib_howtos/how_to_mark_chip_tested.html
Thanks for your help!
Reading flash… done.

root@walkbook:/tmp# md5sum 6020*

5f71ff63fe0721c241fe2b99bc0c8883 6020-1.rom
5f71ff63fe0721c241fe2b99bc0c8883 6020.rom

[свернуть]

Образ tplink6020.bin

Пока больше экспериментов не делал, но на будущее – стоит взять какой-то переходник, чтобы не паять флешку каждый раз.

Update 2025-02-18: Панелька – а если быть точным, то переходник – как выяснилось, у меня была.

Пришлось извернуться, чтобы вставить переходник в адаптер на 1,8В – мешал движок фиксатора, а если его чуть сдвигаешь – то уже не можешь вставить переходник в зеленую панельку. В дальнейшем первым делом запараллелил  2 половинки зеленой панельки (вторая половина не использовалась) между собой так, чтобы можно было вставлять переходник подальше от рычага.

Провозился полдня в попытках запустить флешку через панельку. Раза 3 распаивал ее обратно на плату. В итоге  оказалось, что при выпайке смахнул мелкий резистор, стоящий в сигнальной цепи – слишком уж близко он был к отпаиваемой микросхеме.

В сравнении с линейкой, щупом мультиметра и резистором 0805:

В процессе экспериментов улетело еще 2 резистора в обвязке. По факту это просто перемычки, так что сделал замену из жилки медного провода.

Пока искал причину отсутствия запуска – думал уже подключаться на последовательный интерфейс. Поисследовал точки подключения – последовательного интерфейса там нет, конвертер уровней не распаян. На гребенке присутствует  только питание 3,3В (ближний контакт к RJ45), дальше общий. Конвертер уровней – 8-ножка, 1/8 – к гребенке, 2 – общий, 3 – +1,8В, 7 – +3,3В, 4/5 – к процессору (один через резистор R384).

Когда запустил роутер обратно – начались эксперименты с прошивкой. Сгенерировал что-то через openwrt-imagebuilder, залил через mtd, роутер окирпичился. Программатором успешно поднял все обратно:

Восстанавливаем образ

rain@walkbook:/tmp/flashrom/builddir$ sudo ./flashrom -p ch341a_spi -c “MX25U25635F” -w /tmp/6020-2.rom
flashrom v1.6.0-devel (git:v1.5.0-19-g971ea27d) on Linux 5.10.0-33-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Found Macronix flash chip “MX25U25635F” (32768 kB, SPI) on ch341a_spi.
===
This flash part has status UNTESTED for operations: WP
The test status of this chip may have been updated in the latest development
version of flashrom. If you are running the latest development version,
please email a report to flashrom@flashrom.org if any of the above operations
work correctly for you with this flash chip. Please include the flashrom log
file for all operations you tested (see the man page for details), and mention
which mainboard or programmer you tested in the subject line.
You can also try to follow the instructions here:
https://www.flashrom.org/contrib_howtos/how_to_mark_chip_tested.html
Thanks for your help!
Reading old flash chip contents… done.
Updating flash chip contents… Erase/write done from 0 to 1ffffff
Verifying flash… VERIFIED.

[свернуть]

Подампил информацию о системе – dmesg, lsmod и так далее

Осталось освоить, как сделать свой образ под это все.

Update 2025-03-01: мини-заметка, краткое описание событий, чтобы закрыть лишние вкладки в браузере и чтобы не забылось:

  • Тред на ЛОРе – отсюда и ниже.
  • 6020 решил пока отложить, попрактиковаться на том, что выглядит проще – 470/480.
  • Сделал на 470 (который теперь будет тоже 480) выход последовательного порта: распаял гребенку и перемычку  вместо резистора (находится прямо рядом с гребенкой, через него был подключен один из пинов). Распиновка плюс-минус обычная: +/-/Rx/Tx.
  • Выяснилось, что у pl2303 тоже есть некоторые особенности с уровнем напряжений на линиях. Тред, даташит. По факту для 470/480 все решилось бы пересадкой 4-й ноги на выход 3,3В, но паять микросхему действительно не сильно удобно. Воспользовался купленными когда-то на arduino.ua трансляторами уровней. По факту двухканальный транслятор состоит из 4 схем: двух резистивных делителей и двух схемах на полевиках:
    Хотел использовать в одну сторону делитель, в другую – полевик. Сходу не завелось – хотя сейчас уже не уверен, что проблема была в электрической части. В итоге переделал схему на использование полевиков в обе стороны (чего зря простаивать?):

    loop-тест работает; для подключения к железке использовал minicom. В дальнейшем сделаю такой же адаптер, но для 1,8В.

  • Добрался до консоли u-boot. Старый, простой, но есть даже небольшой memtest.
    u-boot

    U-Boot 1.1.3 (Apr 14 2017 – 09:10:36)Board: Ralink APSoC 128 MB
    relocate_code Pointer at: 87fbc000
    *****%%%%%%%%%%%%%%%%%%%%%%���ͅ����HW
    ***************************
    find flash: GD25Q128C c8, device id 40��R
    *** Warning – bad CRC, using default environment

    ============================================
    Ralink UBoot Version: 4.3.S.0
    ——————————————–
    ASIC 7628_MP (Port5<->None)
    DRAM component: 1024 Mbits DDR, width 16
    DRAM bus: 16 bit
    Total memory: 128 MBytes
    Flash component: SPI Flash
    Date:Apr 14 &�������09:10:36
    icache: sets:512========�����4, linesz:32 ,total:65536
    dcache: sets:256, ways:4, linesz:32 ,total:32768

    ###�$����CPU freq = 575 MHZ ####
    estimate memory size =128 Mbytes
    RESET MT7628 PHY!!!!!!

    Hit Ctrl+B to stop autoboot: 0
    ## Booting image at bc040000 …
    Image Name: MIPS OpenWrt Linux-3.10.14
    Image Type: MIPS Linux Multi-File Image (lzma compressed)
    Data Size: 1310728 Bytes = 1.3 MB
    Load Address: 80000000
    Entry Point: 80000000
    Contents:
    Verifying Checksum … OK
    Uncompressing Multi-File Image … OK
    No initrd
    ## Transferring control to Linux (at address 80000000) …
    ## Giving linux memsize in MB, 128

    MT7628 # help
    ? – alias for ‘help’
    bootm – boot application image from memory
    cp – memory copy
    erase – erase SPI FLASH memory
    go – start application at address ‘addr’
    help – print online help
    loadb – load binary file over serial line (kermit mode)
    md – memory display
    mdio – Ralink PHY register R/W command !!
    mm – memory modify (auto-incrementing)
    mtest – simple RAM test
    mtkswitch – Ralink switch register command
    mtkswitch_port_status – Ralink switch port status
    nm – memory modify (constant address)
    printenv- print environment variables
    reset – Perform RESET of the CPU
    rf – read/write rf register
    saveenv – save environment variables to persistent storage
    setenv – set environment variables
    spi – spi command
    tftpboot- boot image via network using TFTP protocol
    version – print monitor version
    MT7628 # printenv
    bootargs=console=ttyS1,115200 root=31:02 rootfstype=jffs2 init=/sbin/init mtdparts=raspi:256k(u-boot),64k(u-boot-env),2240k(rootfs),1408k(uImage),64k(mib0),64k(ART)
    bootcmd=bootm 0xbc040000
    bootdelay=1
    baudrate=115200
    ethaddr=”00:AA:BB:CC:DD:10″
    ipaddr=192.168.1.1
    serverip=192.168.1.10
    stdin=serial
    stdout=serial
    stderr=serial

    Environment size: 328/4092 bytes
    MT7628 # version

    U-Boot 1.1.3 (Apr 14 2017 – 09:10:36)

    MT7628 # spi id
    device id: c8 40 18 ff 60

    [свернуть]

    Поставил таймаут повыше – setenv bootdelay 1, потом saveenv
  • Доехали заказанные с Али микросхемы памяти, аналогичные используемым в 470/480.
  • Благодаря помощи Xenius’а с ЛОРа начал потихоньку разбираться в том, как сделать свою прошивку.

Продолжение следует.

Добавить комментарий