ZeroNet Blogs

Static ZeroNet blogs mirror

Ранее я уже писал о проблеме малого количестве трекеров в ZeroNet. К сожалению, при работе в режиме Tor: Always проблема усугубляется.


Вот список трекеров, используемых сетью по умолчанию в настоящий момент:

        trackers = [
            "zero://boot3rdez4rzn36x.onion:15441",
            "zero://zero.booth.moe#f36ca555bee6ba216b14d10f38c16f7769ff064e0e37d887603548cc2e64191d:443",  # US/NY
            "udp://tracker.coppersurfer.tk:6969",  # DE
            "udp://tracker.leechers-paradise.org:6969",  # NL
            "udp://104.238.198.186:8000",  # US/LA
            "http://tracker.skyts.cn:6969/announce",  # CN
            "http://open.acgnxtracker.com:80/announce",  # DE
            "http://retracker.mgts.by:80/announce"  # BY
        ]

Разберёмся, что тут к чему.

  • Адреса, начинающиеся на udp:// — это BitTorrent-трекеры, работающие по UDP. При работе через Tor они недоступны. Совсем.
  • Адреса, начинающиеся на http:// — это BitTorrent-трекеры, работающие по HTTP. Мы можем получить от них адреса пиров в клирнете, но не можем через них анонсировать onion-адреса. BitTorrent-трекер увидит и запомнит лишь IP-адрес exit-ноды Tor-а, который для входящих подключений бесполезен. Трекер ничего не знает про Tor.
  • Адреса, начинающиеся на zero:// — это собственные трекеры ZeroNet, работающие по внутрисетевому протоколу. Трекеры ZeroNet умеют работать как с IP-адресами, так и с onion-адресами пиров.

Как видим, собственных трекеров сети всего два. Один из них расположен в клирнете, а другой — в Tor.

Именно на этих двух трекерах и держится связность сети в режиме Tor: Always. Отключение этих узлов приведёт к невозможности пользоваться сетью в анонимном режиме.

Пока сохраняются BitTorrent-трекеры, и есть узлы сети на IP-адресах, к которым мы можем открыть входящие соединения, проблема может быть не критичной, тем не менее, это принципиальная проблема. Если завтра все участники сети решат пользоваться сетью без разглашения своих IP, то именно эти два узла станут самой уязвимой точкой отказа.

Как решать эту проблему? В три этапа:

  1. Поднимать новые ZeroNet-трекеры на своих компьютерах.
  2. Публиковать их onion-адреса и призывать других участников сети пользоваться ими, рассказывая, почему и зачем это нужно.
  3. Разрабатывать и внедрять в движок ZN новые механизмы анаонсирования узлов, такие как DHT или автоматический внутрисетевой поиск трекеров.

Что касается пункта 1, внутрисетевой трекер реализуется плагином Bootstrapper, поставляющимся с ZeroNet. Плагин по умолчанию отключен, и документации на него никакой нет; вся документация — только его исходники. Насколько я понимаю, два трекера из списка выше работают именно через этот плагин. Сам я еще не разбирался с тем, как там что.

Если я правильно понимаю, достаточно запустить ноду ZeroNet с включенным плагином, чтобы она слушала порт на локальном интерфейсе, и затем средствами Tor поднять hidden service с фиксированным адресом, который будет проксировать входящие подключения на порт ZeroNet. Но это пока теоретические соображения.

В скрипт docker-zeronet добавил опцию -T, обеспечивающую подключение списка трекеров из репозитория github.com/ngosang/trackerslist.

В одном из компьютеров разбивал диск на разделы еще под grub 1-й версии, который не умел работать с LVM. Из-за этого /boot всех линуксов пришлось вынести на отдельный раздел вне LVM. Получился такой усложненный конфиг:

    sda1 — boot <- тут grub, который грузится через бутсектор
    sda2 — linuxboot <- тут ядра линукса
    sda3 — LVM:
        archlinux
        voidlinux
        debian

Монтировался /boot в каждой системе примерно так:

/dev/disk/by-label/linuxboot      /mountpoints/linuxboot       ext4         defaults,noatime                 0      1
/mountpoints/linuxboot/voidlinux  /boot                        none         defaults,bind                    0      0

Давно мигрировал на grub2, но сейчас наконец-то дошли руки переделать загрузку.


Вернул ядро системы на корневой раздел:

mount -o bind / /tmp/tmp_root/
rsync -aHAX /boot/ /tmp/tmp_root/boot/
umount /boot/

Перегенерировал grub для корня:

grub-install -v --no-bootsector --target i386-pc /dev/mapper/sm-sm_voidlinux
  • --no-bootsector — чтобы grub не пытался свой бутсектор никуда установить. Он не BIOS-ом у нас будет грузиться.
  • --target i386-pc — просто на всякий случай, чтобы с UEFI не попутал.
  • /dev/mapper/sm-sm_voidlinux — самое главное. Grub должен увидеть, что он на LVM, и сгенерировать core.img, пригодный для старта с LVM.

Теперь основная магия. Открываем конфиг того grub, который у нас живёт на загрузочном разделе и пишем:

insmod lvm

menuentry "Voidlinux" {
    multiboot (lvm/sm-sm_voidlinux)/boot/grub/i386-pc/core.img
}

Получается следующая последовательность загрузки: * BIOS грузит бутсектор. * Бутсектор грузит grub с sda1. * Grub читает конфиг и показывает меню. * Когда мы выбираем пункт Voidlinux, grub по протоколу multiboot грузит другой grub из образа core.img. * Этот второй grub показывает нам меню, сгенерированное конкретной операционной системой. (Разные ядра, загрузка в fallback-режиме и т.п.)

Так можно установить и грузить любое количество Linux-ов внутри LVM без плясок с бубном.

Три месяца назад я писал про покупку б/у Irbis NB31. Что касается попытки запустить на нём Linux, об этом я напишу пост чуть позже. (Забегая вперёд: в целом всё работает.) А сейчас немного на другую тему.


Скорость работы встроенного SSD и microSD-контроллера

Результаты теста встроенного накопителя на 32ГБ:

Irbis-nb32-internal-storage.png (402x367)

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

Поскольку Windows занимает почти весь накопитель, для пользовательских данных была установлена microSD карта. Мы с женой долго читали отзывы, которые не отличаются разнообразием: "перестала определяться", "сдохла через 3 месяца", "перешла в режим только-чтение на 2-й день и сдана по гарантии" и т.п. В итоге купили карточку Samsung Evo Plus на 32 ГБ за 1300 рублей, которая по отзывам точно такое же говно, как и её конкуренты, но стоила на 100 р. дешевле и была в наличии в ближайшем магазине. Я в первый раз услышал, что под брендом Samsung у нас продают SD-карты. Производитель обещает 95 MB/s на чтении и 20 MB/s на записи, но это в идеальных сферических условиях при наличии высокоскоростного контроллера. В нашем случае всё упирается как раз в производительность контроллера:

Samsung-Evo-Plus.png (402x367)

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

Флешки

Согласно наклейке на корпусе нетбука, у нас имеется 2 порта USB 2.0. Никакого вам 3.0. Так что на скоростных флешках мы упираемся в производительность контроллера, а не накопителя. Тем не менее, даже достаточно дорогие флешки не умеют быстро писать данные при неупорядоченном доступе, и в этом случае производительность больше зависит от конкретной флешки, чем от версии USB.

Когда я экспериментировал с запуском Linux, мы как раз были за городом, так что купить скоростную флешку возможности не было. У жены была флешка, на которой не хранилось ничего важного, и я отформатировал её в GPT, разбил на FAT32 + ext4, как требуется для загрузки с UEFI, и засунул туда Void Linux. Это была ADATA UV100 на 16 ГБ. Дешевая флешка в ненадежном пластиковом корпусе, которая постоянно греется при работе. Вот результаты теста производительности (на скриншоте виден малый объем накопителя, это как раз раздел FAT32) :

ADATA-UV100.png (402x367)

Её производительности хватает, чтобы вполне бодро загружать систему и запускать приложения. В очередной раз это доказывает, что Linux способен работать с любого утюга, если там в принципе есть процессор, память и доступ в сеть. Но как только в кэше скапливается достаточно много dirty страниц, и система пытается сбросить их на устройство, случается глобальный фриз всех приложений. Здесь особенности крайне медленной неупорядоченной записи у дешевой флеш-памяти выходят на передний план, и из софта с ними ничего не сделать. Такой глобальный лаг обычно длится от 10 секунд до 2-3 минут, впрочем, если у вас много ОЗУ и либеральные настройки vm.dirty_bytes, вы можете столкнуться с ситуацией, когда ядро внезапно решит выгрузить на диск 3-4 гигабайта, и время IO будет измеряться уже десятками или сотнями минут. У меня эти параметры были уже подкручены, так что система в целом сохраняла управляемость. Тем не менее, операции установки пакетов идут очень долго; а бразеры с настройками по умолчанию работают с длительными лагами, поскольку рассчитывают на достаточно быстрый кэш на диске, а вместо быстрого кэша получают постоянный D-state.

Также у меня была купленная по случаю Kingston DataTraveler SE9 G2 на 32 ГБ. Как-то раз мне срочно нужна была флешка, и по пути, увидев в магазине флешку в стильном цельнометаллическом корпусе от известного производителя, я просто купил её без раздумий и чтений обзоров. Обошлась она мне что-то около 1300 р., точно уже не помню.

Эта флешка отлично справляется с хранением фотографий и документов, но тестирование в CrystalDiskMark ставит крест на идее использовать её в качестве системной. Как видно, при неупорядоченной записи этот Kingston ничем не отличается от любого no name:

Kingston-dtse9-g2.png (402x367)

Точно такие же значения 0.00x показывают любые дешевые флешки, независимо от бренда, или же продающиеся вовсе без всякого бренда.

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

Я долго гуглил и читал обзоры. В итоге решил брать что-нибудь из линейки Sandisk Ultra, но не был уверен, есть ли между флешками линейки какая-то разница, кроме дизайна корпуса. Потом наткнулся на очень информативный сайт usb.userbenchmark.com. Если там вбить в поиске 16GB (ну или 32GB), а потом отсортировать результаты по колонке Peak 4k-W, то получает интересная картина.

Первым идёт давно снятый с производства в этом объёме, но оставшийся непобеждённым Kingston DT Ultimate 16GB — живое доказательство того, что для быстрой флешки не требуется USB 3.0. Заслуженное второе место занимает SanDisk Extreme USB 3.0 16GB. Потом чего-то непонятное с неизвестными мне названиями, и наконец на 6-й позиции — SanDisk Ultra Flair USB 3.0 16GB. Прочие представители линейки Ultra почему-то отстали — значит, всё же отличаются не только дизайном, но и внутренностями.

Этот SanDisk Ultra Flair USB 3.0 16GB был в наличии в том самом «ближайшем магазине», в котором покупалась карточка Samsung, и стоил 800 рублей, поэтому и был куплен по дороге домой. Вот результаты тестов:

Sandisk-Ultra-Flair.png (402x367)

На всякий случай переставил флешку в другой порт USB и протестировал повторно:

Sandisk-Ultra-Flair-t2.png (402x367)

К сожалению, слабое железо с USB 2.0 не даёт возможности полностью раскрыться этой флешке.

Внешне SanDisk Ultra Flair и Kingston DataTraveler SE9 G2 очень похожи — одинаково узкий металлический корпус, схожая длина. Неизвестно, кто у кого спёр дизайн, однако начинка этих устройств отличается кардинально. В версии на 32 ГБ Ultra Flair на данный момент стоит 1350 рублей, примерно за эти деньги я брал и DataTraveler. Если бы я видел результаты тестов на момент покупки, я бы, разумеется, предпочел Ultra Flair.

Стоит еще добавить, что из всех перечисленных устройств, Ultra Flair единственный оставался в тесте чуть теплым. Не знаю, сохранится ли это при реальной эксплуатации, поскольку в отзывах упоминали достаточно высокую температуру. Остальные же флешки ощутимо разогреваются и на тесте, и в эксплуатации.

Когда я писал этот обзор, чисто ради интереса решил протестировать лежащий дома Smartbuy на 32 ГБ неустановленной модели, купленный, предположительно, в прошлом году. Не смотря на в целом провальные результаты последовательной записи, скорость неупорядоченной записи оказалась не совсем мёртвой:

Smartbuy.png (402x367)

Эх, если бы такие 0.2 МБ/с выдал DataTraveler, чтобы хоть символические показать своё превосходство над китайским ноунеймом из ларька. Но увы.

usb-sticks.jpg (438x254)

Теперь осталось перенести Linux на SanDisk Ultra Flair и протестировать накопитель в боевых условиях.

Иногда возникает необходимость скопировать пост с форматированием из чужого блога. Например, я копировал пост из блога ZAlex в комментарий на форуме. Как это легко сделать, если для разметки используется Markdown, а в браузере мы видим уже HTML? Неужели нужно лезть в папку с сайтом и искать, где там этот пост в глубинах data.json.


  • Открываем правую панель ZeroNet на нужном сайте.

  • Нажимаем на переключатель This is my site.

  • Обновляем страницу.

  • Voilà! У нас появилась возможность редактировать пост. Нажимаем на карандаш, потом на кнопку перехода в режим разметки Markdown. Выделяем и копируем, что нам нужно.

Как вы уже наверное поняли, это не единственное, что можно делать с зайтом в режиме This is my site. Так можно поступить с любым зайтом, и он будет думать, что вы его владелец (отображать интерфейс правки постов, настройки, если они у него есть, и т.п.).

Например, чтобы пощупать панель настроек в моём тестовом блоге, вы можете или клонировать сайт и поиграться с вашей собственной копией, или включить режим владельца прямо на моём блоге.

Для ядра ZeroNet и для сайта не нужны доказательства, что вы действительно владелец сайта. Если вы так сказали, они вам верят — до тех пор пока вы не попытаетесь отправить изменённый сайт в сеть. Вот тогда ZeroNet спросит приватный ключ сайта.

Если вы внесли на сайт какие-то изменения, то чтобы вернуться к обычному режиму, нужно выключить переключатель This is my site, затем перейти на главную страницу ZeroHello и там в меню сайта нажать Check files. ZeroNet проверит соответствие файлов цифровым подписям и закачает из сети правильные версии. Но иногда это не помогает, тогда проще всего удалить сайт и добавить заново.

В продолжение предыдущего поста.

Первый вариант. Можно добавить в код, работающий с подписыванием сайта, следующую логику:

  • Если приватный ключ не указан, то пытаемся сгенерировать ключ из master_seed и address_index и если он подходит, используем его.

Этот вариант нежелателен тем, что может разгласить информацию о принадлежности сайта тому или иному пользователю. Например, на основе измерения времени, потребовавшегося на подписывание сайта. Хотя поверхность такой атаки довольно извилиста (я не могу придумать реально опасную утечку данных таким образом), быть параноиком — обязательное качество разработчика криптосистемы.

Поэтому преходим ко второму варианту:

Выдвигающаяся справа панель на клиентской стороне работает как зайт, но на серверной реализована как плагин ядра ZN. Так что оттуда доступны все возможности ядра напрямую. Именно там мы включаем переключатель This is my site, после чего можем работать с сайтом в режиме владельца.

Идея заключается в том, чтобы сделать под этим переключателем кнопку Generate Private Key from Master Seed. Нажатие на эту кнопку будет восстанавливать ключ, и если ключ подходит, записывать его user.json.

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

Я считал, что для сайтов, созданных клонированием, приватный ключ не хранится в конфигах ZN, а каждый раз генерируется из приватного master_seed и публичного address_index. Оказывается, это не так. Эти части ядра не связаны напрямую друг с другом. Когда вы создаёте сайт средствами ZN, движок присваивает ему address_index, генерирует из этого address_index приватный ключ (а из ключа — публичный адрес сайта) и записывает ключ в файл users.json.

Затем, когда вы подписываете сайт, движок просто берёт ключ из этого файла. Если ключа там нет, он спросит ключ у вас. Движок не пытается создать ключ из известных ему master_seed и address_index и проверить, подходит ли он. На мой взгляд, это логичное усовершенствование, но оно не реализовано.

Если вы потеряли приватный ключ, созданный таким образом, то сгенерировать его из master_seed и address_index можно при помощи субкоманды zeronet.py cryptGetPrivatekey.

Предупреждение для параноиков:

Это означает, что вам придётся передать master_seed в явном виде в аргументах команды. Любой код на компьютере, который может читать список запущенных процессов, способен увидеть ваш master_seed.

За прошедшие сутки было сделано следующее:


Эффекты полупрозрачности

В варианте блога BinChan боковая панель становится полупрозрачной (почти невидимой), когда открыта страница с постом блога. При наведении мыши видимость панели восстанавливается. В оригинальном ZeroBlog эффекта полупрозрачной панели нет.

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

В редакторе контента используется эффект затенения. Когда вы переходите в режим редактирования текстового блока, все прочие части страницы становятся (почти) невидимыми. Теперь этот эффект также можно отключить через настройки.

Кроме того, была исправлена проблема, когда одновременное применение прозрачности панели и затенения от редактора приводило к исчезновению с экрана редактируемого поля.

Исправления Identicon

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

В коде предусмотрено переключение между старым и новым вариантами, но настройка еще не вынесена на страницу настроек.

Детальная информация о сборке включается в образ сайта

В целях упрощения отладки при сборке снапшотов в файл siteAddress/buildlog.txt записывается информация о сборке: идентификатор коммита, бранч, и состояние рабочей копии. Кроме того, туда выгружается git log, так что этот файл можно использовать в качестве краткого changelog-а.

Содержимое файла доступно также по адресу siteAddress/?Settings:BuildLog.

Очередное открытие при чтении исходников движка. ZeroBlog исправляет URL в гипер-ссылках, но не исправляет URL в свойстве src изображений.

what-a-twist.jpg (480x360)

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


  • Система настроек блога:
    • ☑ [FEATURE] Страница изменения настроек в интерфейсе сайта.
    • ☑ [FEATURE] Показ/скрытие элементов title, description, links в боковй панели.
    • ☑ [FEATURE] Показ/скрытие элемента footer.
    • ☑ [FEATURE] Показ/скрытие TOC в боковой панели.
    • ☑ [FEATURE] Показ/скрытие аватара блога в боковой панели.
    • ☑ [FEATURE] Включение/выключение поддержки тегов.
  • Стили:
    • ☑ Укомплектовать сайт полными версиями шрифтов Tinos и Roboto.

Если рассказывать более развёрнуто, я сейчас занимаюсь созданием админки сайта. Может быть, админка — это громко сказано, у нас тут не Вордпресс. Сейчас это просто страница настроек.

Сегодня движок научился работать с настройками типа boolean, и пока это единственный тип настроек, с которым он умеет работать. Зато это позволило реализовать сразу кучу настроек типа да/нет, как видно из списка выше.

Если говорить о технической стороне, то теперь средствами движка можно выдавать страницы (виртуальные «посты» блога), содержащие заготовки виджетов наподобие:

<label class='settings-boolean' data-settings='show_toc'>Show Table of Contents</label>

И затем простым вызовом метода activateEmbeddedUI() делать магию — превращать их в функционирующие элементы управления. Пока это лишь интерактивные чекбоксы (даже без красивого оформления), но по такому же принципу я рассчитываю сделать прочие необходимые виджеты.

Были добавлены настройки:

  • Содержимое левой панели сайта настраивается практически в каждом аспекте. Вы можете отключить/включить:
    • Аватарку блога.
    • Заголовок.
    • Описание под заголовком.
    • Ссылки TOC (оглавление по датам и по тегам).
    • Дополнительный текст (в котором обычно размещаются ссылки на другие сайты, вот как у меня в этом блоге).
  • Текст в footer-е также можно отключить.
  • Отключение тегов возвращает блог к look & feel оригинального ZeroBlog, если вам теги не нужны и только мусорят своим присутствием на экране.

Что касается look & feel, шаблон блога с правками BinChan имеет важное преимущество: версию для мобильных устройств. В то же время, на десктопных устройствах он выглядит несколько хуже оригинального на мой личный вкус. Я рассчитываю исправить вёрстку для полного соответствия на десктопе оригиналу.

Но перед тем, как этим заниматься, я внёс правку в самый существенную проблему внешнего вида ZeroBlog — шрифты. Теперь это полноразмерный Tinos в котором больше нет проблемы с отсутствующими русскими буквами. Roboto, использующийся в заголовках, также обновлён. Размер блога заметно подрос, но для пользовательского контента всё еще полно места в пределах дефолтных зеронетовских 10-ти мегабайт.

Что касается правок за предыдущие пару дней — они охватывают самые разные части сайта, от мелких улучшений в вёрстке, до постепенного рефакторинга движка с целью сделать возможным реализацию более богатого функционала.