Так уж вышло, что в 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 и сделал их дампы.
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.
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 из дистрибутива, потом собрал из исходников наиболее свежую. В обоих случаях была ругань на возможно некорректную работу с некоторыми операциями, но на чтение оба дампа совпали:
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
Пока больше экспериментов не делал, но на будущее – стоит взять какой-то переходник, чтобы не паять флешку каждый раз.
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 и так далее
Осталось освоить, как сделать свой образ под это все.
Продолжение следует.