💡 Полезные Советы

Сокеты и Веб-сокеты: От системных вызовов 80-х до Real-time веба

18.03.26
23

Сетевые сокеты (Berkeley Sockets).
С точки зрения операционной системы, сокет - это дескриптор файла. В Unix-подобных системах "всё есть файл", и сокет не исключение. Это абстракция, которая позволяет программе читать и записывать данные в сеть так же просто, как в текстовый документ на диске.

Техническая формула: Socket = IP Address + Port + Protocol (TCP/UDP)
Дескриптор файла - это маленькое целое число, которое операционная система выдаёт процессу, когда тот открывает файл, сокет, канал, pipe, устройство или любой другой ресурс ввода‑вывода. Это идентификатор, через который программа взаимодействует с ресурсом.

История: Эпоха BSD

История Berkeley Sockets API - это фактически история того, как интернет стал интернетом. До 1983 года мир сетевых технологий напоминал Вавилонскую башню: каждый производитель железа (IBM, DEC, Xerox) имел свои протоколы, которые не умели "разговаривать" друг с другом.

В начале 80-х программирование под сеть было кошмаром. Если вы писали софт для мейнфрейма IBM, вы использовали одни системные вызовы; для машин DEC - другие. Не существовало единой абстракции "соединения".

Разработчики из Computer Systems Research Group (CSRG) в Университете Беркли, работая над релизом 4.2BSD, поставили цель: сделать работу с сетью такой же простой, как работу с файлами в Unix.

"Всё есть файл"

Гениальность Berkeley Sockets заключалась в адаптации концепции Unix "Everything is a file".

  • Чтобы прочитать данные из файла, вы его открываете, читаете и закрываете.
  • Билл Джой и его команда предложили делать то же самое с сетью.

Они ввели понятие дескриптора сокета. Сокет - это "конечная точка" (IP-адрес + Порт). Программисту стало неважно, как именно пакеты летят по проводам; ему достаточно было создать сокет и писать в него данные.

Популярность Berkeley Sockets была обусловлена двумя факторами:

  • Открытость: Код BSD был доступен для изучения и копирования.
  • Финансирование DARPA: Агентство продвигало TCP/IP как основной протокол для своей сети (предшественника интернета), и реализация Беркли была лучшей на рынке.

Как это работает  жизненный цикл сокета(Lifecycle)?

Жизненный цикл сокета - это последовательность системных вызовов, через которые проходит любое сетевое соединение. Каждый шаг меняет состояние сокета в ядре и определяет, что с ним можно делать дальше. Ниже - подробное, но компактное объяснение, ориентированное на разработчика, который хочет понимать, что реально происходит под капотом.

Чтобы понять, как работает жизненный цикл сокета, проще всего представить его как процесс установки телефонной связи в офисе. Есть "телефонный аппарат" (сам сокет), "номер" (IP и порт) и "оператор" (ядро ОС).

1. socket() - Покупка телефона
Процесс начинается с системного вызова socket(). На этом этапе вы просто сообщаете операционной системе: "Мне нужно устройство для связи".

  • Что происходит: ОС выделяет ресурс и возвращает дескриптор (целое число).
  • Параметры: Вы выбираете "тип" связи. Обычно это AF_INET (IPv4) и SOCK_STREAM (TCP, для надежности) или SOCK_DGRAM (UDP, для скорости).

2. bind() - Присвоение номера
У вас есть телефон, но у него нет номера. Вызов bind() привязывает сокет к конкретному адресу сетевой карты и порту.

  • Для сервера: Это обязательно. Сервер должен "сидеть" на известном порту (например, 80 для HTTP), чтобы клиенты знали, куда стучаться.
  • Для клиента: Обычно не вызывается вручную; ОС сама выделяет свободный случайный порт при подключении.

3. listen() - Перевод в режим ожидания (Только сервер)
Этот вызов превращает обычный сокет в пассивный. Сервер говорит системе: "Я готов принимать звонки".

  • Очередь (backlog): В параметрах указывается размер очереди. Если 10 клиентов постучатся одновременно, а сервер занят, listen определит, сколько из них подождут, а кому сразу придет отказ.
  • Что происходит, если очередь заполнена? Пришли 10 клиентов, они сидят в очереди в ядре ОС. Пришёл 11, ОС смотрит "мест нет". ОС либо просто игнорирует пакет (клиент отвалится по таймауту), либо отправляет ему ECONNREFUSED (отказ в соединении).

4. connect() vs accept() - Установка связи
Здесь пути клиента и сервера расходятся:

  • connect() (Клиент): Клиент инициирует "трехэтапное рукопожатие" (TCP Three-way Handshake). Он отправляет запрос серверу.
  • accept() (Сервер): Это блокирующий вызов. Сервер "засыпает" на этой строчке кода, пока не придет клиент. Как только соединение установлено, accept "просыпается" и создает новый отдельный сокет специально для этого клиента.
  • Важно: Основной сокет продолжает слушать других, а новый - используется для общения с конкретным подключившимся пользователем.

5. send() / recv() - Разговор
Когда соединение установлено, начинается обмен данными.

  • Байты, а не объекты: Сокеты ничего не знают о JSON, картинках или тексте. Они передают только сырые байты.
  • Потоковый режим: В TCP данные могут прийти не целиком, а кусками. Разработчику нужно проверять, сколько байт реально получено, и "склеивать" их.

6, close() - Повесить трубку
Когда данные переданы, одна из сторон (или обе) вызывает close(). Это высвобождает дескриптор в ОС и закрывает порт.

WebSockets: Живое общение в браузере

Протокол HTTP (до версии 1.1 включительно) был "молчаливым". Клиент спросил - сервер ответил - соединение закрылось. Чтобы сделать чат, браузеру приходилось каждые 2 секунды отправлять пустые запросы (Polling). Это создавало огромную нагрузку на сервер и дикие задержки.
Протокол WebSocket (RFC 6455)
В 2011 году появился WebSocket. Его главная фишка - Full-Duplex (полный дуплекс). Это значит, что и клиент, и сервер могут одновременно слать данные друг другу по одному открытому каналу.
Почему HTTP не справлялся?

Чтобы понять ценность WebSocket, нужно осознать масштаб проблемы Polling (опроса).

Представьте чат на 1000 человек. При обычном опросе (Short Polling) сервер получает 500 запросов в секунду, даже если никто ничего не пишет. Каждый такой запрос - это:

  • Установление TCP-соединения (3-way handshake).
  • Огромные HTTP-заголовки (Cookies, User-Agent), которые весят больше, чем само сообщение "Привет".
  • Закрытие соединения.

Long Polling (длинные опросы) немного спасали ситуацию: сервер держал запрос открытым, пока не появятся данные. Но это все равно был "костыль", съедающий ресурсы сервера.

Внутри канала: Что такое Фреймы (Frames)?

Когда соединение установлено, данные больше не передаются в виде текста с заголовками. Они упаковываются в бинарные фреймы.

Фрейм - это очень компактный конверт. В нем есть:

  • FIN бит: Указывает, является ли этот кусок данных финальным или за ним последуют еще.
  • Opcode: Тип данных (0x1 - текст, 0x2 - бинарные данные, 0x8 - закрытие соединения, 0x9 - пинг).
  • Payload length: Размер данных. Для маленьких сообщений заголовок фрейма весит всего 2-10 байт. Сравни это с 500+ байтами заголовков HTTP.

Ключевые отличия для IT-специалиста

Сетевой сокет (L4): Это программный интерфейс (API) операционной системы. Когда ты открываешь сокет, ты говоришь ОС: "Выдели мне порт и отправляй все байты с этого IP-адреса моему приложению".

WebSocket (L7): Это протокол прикладного уровня. Он добавляет к "сырому" сокету правила: как поздороваться (Handshake), как зашифровать данные (Masking) и как делить поток байтов на понятные сообщения (Frames).

ХарактеристикаСетевые сокеты (TCP/UDP)WebSockets
Уровень OSIТранспортный (L4)Прикладной (L7), работает поверх TCP
Среда выполненияОС, системные вызовы, backendБраузеры, веб‑серверы
Формат данныхСырые байты. Нет понятия "сообщение", только поток.Фреймы. Есть четкие границы сообщений (текст/бинарные).
API‑сложностьНизкоуровневая (нужно самому склеивать пакеты).Высокоуровневая (события: onmessage, onerror).
ТранспортTCP или UDPТолько TCP (как база для надежности)
БезопасностьПрямой доступ к портам (опасно для браузера).Работает через HTTP Handshake, поддерживает шифрование (WSS).
АдресацияIP-адрес и порт (напр. 192.168.1.1:8080)URL-схема (напр. wss://example.com/chat)
Проход через ProxyЧасто блокируются корпоративными фаерволами.Маскируются под HTTP, легко проходят через прокси.

Когда и что выбирать?

СитуацияЧто использовать?Почему?
Браузерный чат / УведомленияWebSocketsЕдинственный стандартный способ держать живое соединение в JS.
Мобильная игра (Unity/C++)TCP/UDP сокетыМинимальные задержки, нет лишнего оверхеда протокола WebSocket.
Система мониторинга (Веб-панель)WebSocketsУдобство интеграции с React/Vue и простота API.
Передача потокового видео (Real-time)WebRTC (UDP-based)WebSockets могут быть медленными из-за TCP-контроля доставки.

Обзор Cudy WR300: думал будет проходняк, а оказался топ за свои деньги

15.03.26
42

Недавно мне в руки попал Wi-Fi роутер Cudy WR300. Я брал его сугубо как точку доступа, с мыслью "куплю какое-то барахло на сдачу, лишь бы сеть раздавало". Но реальность превзошла ожидания настолько, что устройство однозначно заслуживает отдельного разбора.

Железо: скромно, но со вкусом

Аппаратная база здесь без претензий на гигабитные скорости, но для своих задач она сбалансирована идеально:

Процессор: MediaTek MT7628 (580 МГц)

Память: 64 МБ ОЗУ (DDR2) и 8 МБ Flash

Интерфейсы: 1x WAN и 3x LAN (все порты стандарта 10/100 Мбит/с)

Беспроводная сеть: Только 2.4 ГГц (802.11n, до 300 Мбит/с), работают две несъемные антенны с усилением 5 дБи.

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

Программная оболочка: Скрытый OpenWRT

Интерфейс и софт заслуживают твердые 10 из 10. Настраивается роутер практически в автоматическом режиме, что огромный плюс. Но самое интересное кроется под капотом - прошивка базируется на OpenWRT.

Да, она урезана и сильно адаптирована под рядового пользователя, но стабильность ядра OpenWRT никуда не делась. Роутер работает как швейцарские часы и из коробки поддерживает современные VPN-протоколы (WireGuard, L2TP, PPTP).

Киллер-фичи для своей цены

  • MESH из коробки. Был приятно удивлен тем, что этот малыш поддерживает бесшовный роуминг. Если покрытия одной точки не хватит, можно легко докупить еще один роутер Cudy и в пару кликов собрать единую сеть.
  • Умный редирект при обрыве. Если отходит интернет-кабель (как случилось у меня) или пропадает линк от провайдера, роутер не просто оставляет вас перед неработающим браузером. При потере связи он автоматически выкидывает вас на окно авторизации/статуса устройства. Это невероятно удобно для быстрого траблшутинга - сразу понимаешь, на чьей стороне проблема.

 

Результаты:

  • Программная оболочка: 10 из 10
  • Дизайн: 10 из 10
  • Комплектация: 10 из 10

Это превосходный роутер для создания точки доступа, покрытия умного дома или работы на тарифах до 100 Мбит/с. Тот самый случай, когда железка отрабатывает каждый вложенный рубль.

Что такое Pi-Apps и как его установить на Raspberry Pi

08.03.26
51

Если вы используете свой Raspberry Pi 5 в качестве настольного компьютера, ретро-консоли или медиацентра, вы наверняка сталкивались с тем, что установка некоторых программ в Linux требует поиска сложных команд и ручной компиляции кода. Именно эту проблему решает Pi-Apps.

Что такое Pi-Apps?
 

Pi-Apps - это бесплатный магазин приложений с открытым исходным кодом, созданный специально для Raspberry Pi (и других устройств на базе ARM/x86 Linux).

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

Что можно установить через Pi-Apps?

  • Браузеры: Chromium (с поддержкой Widevine для Netflix/Spotify), Firefox, Tor и так далее
  • Мессенджеры: Telegram, Discord, Skype.
  • Разработка: Visual Studio Code, Arduino IDE, Android Studio.
  • Игры: Minecraft, Doom, эмуляторы Box86/Box64 для запуска Windows-игр,.
  • Утилиты: GIMP, OBS Studio, TeamViewer.

Как установить Pi-Apps на Raspberry Pi

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

***
Перед установкой любого нового софта рекомендуется обновить систему. Это поможет избежать конфликтов версий.

  1. Откройте терминал (сочетание клавиш Ctrl + Alt + T).
  2. Введите следующую команду и нажмите Enter:

    sudo apt update && sudo apt upgrade -y
  3. Дождитесь завершения процесса обновления.

Установка Pi-Apps

Разработчик Pi-Apps (Botspot) подготовил удобный скрипт автоматической установки. В том же терминале введите одну простенькую команду:

wget -qO- https://raw.githubusercontent.com/Botspot/pi-apps/master/install | bash

Завершение и запуск

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

Как только в терминале появится сообщение об успешной установке, вы можете его закрыть.

Где найти Pi-Apps?

На вашем рабочем столе появится иконка Pi-Apps.

Также программу можно найти в главном меню Raspberry Pi OS в разделе "Стандартные" (Accessories).

Как пользоваться Pi-Apps

Интерфейс программы интуитивно понятен:

  1. Запустите Pi-Apps.
  2. Перед вами появится окно с категориями (Games, Internet, Tools и т.д.).
  3. Выберите нужную категорию или воспользуйтесь кнопкой Search (Поиск), чтобы найти конкретное приложение.
  4. Выберите программу и нажмите кнопку Install (Установить).
  5. После этого откроется окно терминала, где вы сможете наблюдать за процессом установки. Как только он завершится, программа будет готова к использованию!

Неблокируемый VPN‑туннель AmneziaWG для Raspberry Pi 5: подключение к VPS и проброс портов (на примере CS 1.6)

27.02.26
664

Для кого это решение:
Идеально подходит тем, у кого дома нет публичного/статического ("белого") IP-адреса, чтобы напрямую открыть порты, но есть любой недорогой VPS-сервер. В данном руководстве для примера, мы используем сервер игры Counter-Strike 1.6.
Как работает эта архитектура:
Мы превращаем VPS сервер в публичную "витрину" для домашнего железа, связывая их через неблокируемый VPN-туннель.

  • VPS (Внешний шлюз): Смотрит в интернет своим реальным IP-адресом и принимает подключения игроков. Внутри туннеля AmneziaWG он получает адрес 10.8.0.1.
  • Raspberry Pi 5 (Домашний сервер): Спокойно стоит за провайдерским NAT. Она сама инициирует подключение к VPS, пробивая туннель, и получает внутренний адрес 10.8.0.2.
  • Магия маршрутизации: Мы берем внешний игровой порт (27015 UDP/TCP) на VPS и прозрачно пробрасываем его сквозь туннель прямо на вашу домашнюю "малинку", ну или linux сервер.

Главный плюс: мы буквально "вытягиваем" Raspberry Pi в глобальную сеть, не ломая то, что уже работает. Порт-форвардинг настраивается настолько ювелирно, что крутящиеся на VPS сайты, веб-сервисы и боты даже не заметят соседства с игровым сервером.

1. Установка AmneziaWG 

На сервере VPS (Ubuntu/Debian):

sudo add-apt-repository ppa:amnezia/ppa
sudo apt update
sudo apt install amneziawg-tools amneziawg-dkms -y

На Raspberry Pi 5 (Особый способ установки ключей, обходящий блокировки):

sudo apt update
sudo apt install -y gnupg2 curl linux-headers-$(uname -r)
# Скачиваем ключ через 80 порт
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 57290828
gpg --export 57290828 | sudo tee /usr/share/keyrings/amnezia.gpg > /dev/null
# Добавляем репозиторий
echo "deb [signed-by=/usr/share/keyrings/amnezia.gpg] https://ppa.launchpadcontent.net/amnezia/ppa/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/amneziawg.list
sudo apt update
sudo apt install -y amneziawg-tools amneziawg-dkms

2. Генерация ключей

Все ключи для удобства генерируем на VPS, чтобы потом просто скопировать их в конфиги.

Выполняем на VPS:

mkdir -p ~/awg-keys && cd ~/awg-keys
awg genkey | tee server_private | awg pubkey > server_public
awg genkey | tee client_private | awg pubkey > client_public

# Выводим на экран и копируем в блокнот:
cat server_private && cat server_public
cat client_private && cat client_public

3. Настройка VPS (Сервер)

  1. Включаем маршрутизацию (форвардинг) в ядре:

    echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
  2. Создаем конфигурационный файл:

    sudo nano /etc/amnezia/amneziawg/awg0.conf
  3. Вставляем настройки (замените ключи на сгенерированные). Внимание: если ваш основной сетевой интерфейс называется не eth0, а ens3 - измените его в правилах PostUp/PostDown.

    [Interface]
    PrivateKey = <server_private>
    Address = 10.8.0.1/24
    ListenPort = 51820
    
    # Магические параметры Amnezia
    Jc = 4
    Jmin = 40
    Jmax = 70
    S1 = 29
    S2 = 15
    H1 = 2021056581
    H2 = 641527027
    H3 = 1018901243
    H4 = 301646271
    
    # Маскарадинг для выхода туннеля в сеть
    PostUp = iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    PostDown = iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    
    [Peer]
    PublicKey = <client_public>
    AllowedIPs = 10.8.0.2/32
  4. Открываем порт в фаерволе (если используете UFW) и запускаем туннель:

    sudo ufw allow 51820/udp
    sudo systemctl enable --now awg-quick@awg0

4. Настройка Raspberry Pi 5 (Клиент)

  1. Создаем конфигурационный файл:

    sudo nano /etc/amnezia/amneziawg/awg0.conf
  2. Вставляем настройки. Важно: Обязательно проверьте наличие заголовка [Peer], без него парсер выдаст ошибку Line unrecognized

    [Interface]
    PrivateKey = <client_private>
    Address = 10.8.0.2/24
    
    Jc = 4
    Jmin = 40
    Jmax = 70
    S1 = 29
    S2 = 15
    H1 = 2021056581
    H2 = 641527027
    H3 = 1018901243
    H4 = 301646271
    
    [Peer]
    PublicKey = <server_public>
    Endpoint = IP_ВАШЕГО_VPS:51820
    AllowedIPs = 10.8.0.0/24
    PersistentKeepalive = 25
  3. Запускаем туннель и проверяем пинг до VPS:

    sudo systemctl enable --now awg-quick@awg0
    ping -c 4 10.8.0.1

5. Настройка проброса портов (NAT и UFW) на VPS

Чтобы внешний трафик, приходящий на публичный IP VPS по порту 27015, улетал на домашнюю малинку, выполняем на VPS:

  1. Открываем нужные порты для входящих подключений:

    sudo ufw allow 27015/udp
    sudo ufw allow 27015/tcp
  2. Критически важный шаг: Разрешаем транзитный (FORWARD) трафик в UFW, иначе фаервол молча убьет пакеты, идущие сквозь сервер в туннель:

    sudo ufw route allow proto udp to 10.8.0.2 port 27015
    sudo ufw route allow proto tcp to 10.8.0.2 port 27015
  3. Прописываем правила iptables для перенаправления (DNAT) и обратной подмены адреса (SNAT/MASQUERADE):

    # Перенаправление внутрь туннеля
    sudo iptables -t nat -A PREROUTING -p udp --dport 27015 -j DNAT --to-destination 10.8.0.2:27015
    sudo iptables -t nat -A PREROUTING -p tcp --dport 27015 -j DNAT --to-destination 10.8.0.2:27015
    
    # Обратный маскарадинг
    sudo iptables -t nat -A POSTROUTING -d 10.8.0.2 -p udp --dport 27015 -j MASQUERADE
    sudo iptables -t nat -A POSTROUTING -d 10.8.0.2 -p tcp --dport 27015 -j MASQUERADE
  4. Сохраняем правила iptables, чтобы они пережили перезагрузку сервера:

    sudo apt install iptables-persistent -y
    sudo netfilter-persistent save

Вывод:
Сервер работает стабильно, трафик полностью скрыт от DPI, а игровой сервер светит в мир с выделенного IP-адреса.

Raspberry Pi 5 8GB с AliExpress превращается в кирпич после обновления: как исправить ошибку SDRAM и восстановить плату

24.02.26
147

Сегодня разберем очень коварную проблему, с которой сталкиваются энтузиасты при покупке Raspberry Pi 5 на китайских маркетплейсах. Вы заказываете версию на 8 ГБ для своего нового домашнего сервера, радостно запускаете её, система обновляется, и после первой же перезагрузки плата превращается в безжизненный кусок текстолита.

Спойлер: дело чаще всего не в браке, а в хитрых аппаратных модификациях. И чтобы докопаться до истины, нам потребуется старый добрый UART.

Откуда берутся дешевые 8 ГБ?

На AliExpress массово продаются Raspberry Pi 5, которые изначально сошли с конвейера с 2 ГБ оперативной памяти. Умелые мастера выпаивают дешевый чип памяти и ставят на его место банку на 8 ГБ (например, от Samsung).

Проблема кроется в том, что объем памяти на Raspberry Pi аппаратно задается крошечными конфигурационными SMD-резисторами на плате. Перепаивать эту мелочь под микроскопом слишком долго, поэтому китайские продавцы этого просто не делают. В итоге получается плата-мутант: аппаратно она заявляет загрузчику, что она версия на 2 ГБ, но физически несет на борту 8 ГБ.

Ловушка обновления загрузчика (EEPROM)

До середины 2024 года встроенная прошивка Raspberry Pi (EEPROM) закрывала глаза на такие расхождения. Система просто загружалась и позволяла Linux работать со всеми доступными 8 ГБ.

Но в новых версиях прошивок (начиная с конца 2024 года) разработчики внедрили строгую проверку соответствия железа. Теперь загрузчик сравнивает аппаратный ID платы с физически обнаруженным чипом. Если есть расхождение - загрузка намертво блокируется ради безопасности.

Именно поэтому свежекупленная плата может отлично работать в первый день, но стоит Raspberry Pi OS в фоновом режиме обновить EEPROM - и вы получаете нерабочее устройство.

UART - ваш главный помощник в отладке

Когда плата не грузится, на мониторе через HDMI вы видите просто черный экран. Вентилятор может крутиться на 100%, но что именно пошло не так - загадка. Здесь на помощь приходит аппаратная отладка.

UART (Universal Asynchronous Receiver-Transmitter) - это низкоуровневый интерфейс, который выводит текстовые логи работы процессора и загрузчика еще до того, как инициализируется видеовыход.

У Raspberry Pi 5 есть огромное преимущество перед прошлыми поколениями - выделенный 3-контактный порт отладки (JST-SH), расположенный между разъемами micro-HDMI.

После подключения USB-адаптера к компьютеру, вам нужно открыть терминал с правильными параметрами.

Параметры соединения:

  • Baud rate (скорость): 115200

  • Data bits: 8

  • Parity: None (Нет)

  • Stop bits: 1

  • Flow control: None (Нет)

Для Windows:

  1. Зайдите в Диспетчер устройств -> Порты (COM и LPT) и найдите номер вашего адаптера (например, COM3).

  2. Скачайте и откройте программу PuTTY.

  3. Выберите тип соединения (Connection type): Serial.

  4. В поле Serial line впишите ваш порт (например, COM3), а в поле Speed - 115200.

  5. Нажмите Open.

Запуск процесса отладки

  1. Нажмите кнопку Open внизу окна PuTTY. Откроется черное пустое окно терминала.

  2. Только после этого подайте питание на вашу Raspberry Pi 5 (подключите блок питания).

  3. В черном окне сразу же должен побежать белый текст - это логи загрузчика (EEPROM) и старта системы.

В окне терминала побегут логи. Если у вас модифицированная плата с новой прошивкой, вы увидите, как загрузка разбивается о критическую ошибку: BOOT ERROR: code 9 - 'SDRAM mismatch' (Процессор ожидает конфигурацию 16 Gbit (2 ГБ), а видит актуальную конфигурацию 64 Gbit (8 ГБ)).

Инструкция по "оживлению" платы

Чтобы плата стабильно работала, нужно откатить прошивку на ту, которая не проверяет память, и жестко запретить ей обновляться.

  1. Откат загрузчика:

    • Берем обычную USB-флешку или MicroSD, форматируем строго в FAT32.

    • Скачиваем с официального GitHub (raspberrypi/rpi-eeprom в разделе Releases) архив старой прошивки восстановления (ищите версии до сентября 2024 года). Можно скачать с нашего сайта.

    • Распаковываем все файлы из архива прямо в корень флешки (без подпапок).

    • Вставляем в выключенную Raspberry Pi, подаем питание. Ждем несколько секунд, пока зеленый диод на плате не начнет быстро и равномерно мигать (это означает успешную перепрошивку EEPROM).

  2. Блокировка обновлений (Критически важно!):

    • Вытаскиваем флешку восстановления, вставляем рабочий накопитель с Raspberry Pi OS и успешно загружаемся в систему.

    • Немедленно открываем терминал Linux и навсегда отключаем фоновую службу обновления EEPROM двумя командами:

      sudo systemctl disable rpi-eeprom-update
      sudo systemctl mask rpi-eeprom-update

Стоит ли игра свеч?

Покупка модифицированной Raspberry Pi на китайских маркетплейсах - это самая настоящая лотерея, в которой вы расплачиваетесь своим собственным временем. Ради сомнительной экономии вы рискуете получить нестабильного "франкенштейна" и потратить несколько вечеров кряду, пытаясь заставить его хотя бы загрузить операционную систему. Если вы собираете надежный домашний сервер, где важен стабильный аптайм и отсутствие сюрпризов, такой подход категорически не годится! Лучше переплатить за официальную плату и спать спокойно.

Но в этой ситуации есть один огромный, жирный плюс. Пытаясь оживить этот "кирпич", изучая логи через UART, откатывая версии загрузчика EEPROM и ковыряясь в консоли Linux через отладочный порт, вы прокачаете свои навыки траблшутинга на все сто. Вы потеряете кучу нервов и времени, но взамен получите тот самый хардкорный опыт работы с железом, который не даст ни один учебник. Не покупайте это, если вам нужно, чтобы всё работало "из коробки". Покупайте, если хотите научиться решать настоящие инженерные проблемы.

Бонус. Тот самый момент "окирпичивания" (Ошибка SDRAM)

Это ранняя стадия загрузки, где система проводит инвентаризацию "железа". Обратите внимание на ключевые строки:

  • 2.37 Expected configuration 16 Gbit: Загрузчик считывает конфигурационные резисторы на плате и ждет, что сейчас увидит 2 ГБ памяти (16 Гигабит).

  • 2.41 Actual configuration 32 Gbit byte-mode: Процессор физически стучится в чип памяти и понимает, что перед ним 4 ГБ (32 Гигабита). Примечание: на платах с 8 ГБ здесь будет значение 64 Gbit.

  • 2.48 BOOT ERROR: code 9 - 'SDRAM mismatch': Система уходит в жесткий отказ. Дальше этой строчки процесс не пойдет, пока мы не вмешаемся.

Чудесное исцеление (Успешная прошивка EEPROM)

Это лог успешного отката прошивки со спасательной флешки. Именно ради этих строк я и затевал всю возню с UART!

  • 6.82 Writing EEPROM: Начался процесс стирания злой прошивки и записи доброй (старой). Полоса из плюсиков и точек показывает прогресс.

  • 14.70 Verify BOOT EEPROM: Плата умная, она проверяет сама себя, чтобы убедиться, что новая прошивка легла ровно и без ошибок.

  • 19.08 BOOT-EEPROM: UPDATED: Победа. Загрузчик успешно обновлен. После этой строчки можно выключать питание, вставлять флешку с Raspberry Pi OS и наслаждаться работающим сервером или мини ПК. НО если у Вас OS RASBIAN не забудьте про:
     

    sudo systemctl disable rpi-eeprom-update
    sudo systemctl mask rpi-eeprom-update

Внимание: Система обновляется как вирус, даже без интернета!
ВАЖНО: даже если вы успешно откатили EEPROM через флешку восстановления, расслабляться рано. Официальная операционная система Raspberry Pi OS обновляет прошивку загрузчика без спроса, словно вирус.

Самое коварное здесь то, что ей для этого даже не нужен доступ к сети! Свежие файлы прошивки уже лежат внутри самого установочного образа операционной системы. Как только вы впервые загружаете свежую ОС, фоновая служба rpi-eeprom-update сверяет версии, находит в своих локальных папках более новую "злую" прошивку и молча подготавливает её к установке.

При следующей перезагрузке ваша плата снова превратится в кирпич, и вам в любом случае придется заново искать старые файлы и откатывать EEPROM, теряя кучу времени!

Именно поэтому порядок действий должен быть строго таким: откатили прошивку -> успешно загрузились в Linux -> немедленно отключили службу rpi-eeprom-update в терминале -> и только потом начали настраивать сеть и сервер.

 

Что такое MTProto FakeTLS и как настроить свой прокси для Telegram?

19.02.26
517

В этой статье подробно разберем, как работает технология MTProto FakeTLS, почему она так эффективна для Telegram, и пошагово настроим собственный неуязвимый прокси-сервер.

Что такое MTProto?

MTProto - это специализированный криптографический протокол, разработанный командой Telegram для безопасной передачи данных. Благодаря ему все ваши переписки надежно зашифрованы (как в прочном сейфе), и никто не может прочитать их содержимое. Однако обычный MTProto-прокси легко обнаруживается провайдерами: они не могут прочитать трафик, но видят его специфическую структуру и просто блокируют соединение.

Что такое FakeTLS?

Чтобы обмануть DPI, была придумана надстройка FakeTLS. Её задача - маскировка.
FakeTLS берет зашифрованный трафик Telegram и оборачивает его так, чтобы внешне он выглядел как абсолютно стандартное, безопасное HTTPS-соединение с популярным сайтом (например, с серверами Google, Microsoft или Apple).

Представьте, что вы отправляете секретный документ (ваше сообщение). Обычный прокси - это прозрачный конверт: почтальон (провайдер) не может прочесть текст, но видит, что письмо адресовано в Telegram, и выбрасывает его.
С FakeTLS вы кладете документ в стандартную коробку из-под популярного интернет-магазина. Почтальон видит обычную посылку, ничего не подозревает и свободно пропускает её.

Ограничения: почему не работают звонки?

Важно понимать, что MTProto идеально подходит для передачи текста, фото, видео и кружочков (используется надежный протокол TCP).
Однако голосовые и видеозвонки в Telegram требуют максимальной скорости без задержек, поэтому для них используется протокол UDP. MTProto-прокси не умеет маршрутизировать UDP-трафик. При попытке позвонить приложение попытается установить прямое соединение в обход прокси, и провайдер его заблокирует. (Для звонков лучше использовать полноценные VPN-решения, такие как Outline или WireGuard).

Пошаговая настройка сервера VPS/VDS

Для настройки нам понадобится виртуальный сервер (VPS/VDS) с установленной ОС Linux (рекомендуется Ubuntu) и доступом по SSH. Мы будем использовать современный и легковесный сервер mtg версии 2, работающий через Docker.

1. Подготовка сервера и установка Docker
Подключитесь к вашему серверу по SSH. Для маскировки под HTTPS-трафик нам обязательно нужен свободный порт 443. Проверим, не занят ли он:

ss -tulnp | grep :443

Если вывод пустой - порт свободен.

Установим Docker одной командой (если он еще не установлен):

curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh

2. Генерация криптографического ключа (FakeTLS)

Нам нужно создать специальный секрет, который заставит наш прокси притворяться сервером Google (dl.google.com). Выполните команду:

docker run --rm nineseconds/mtg:2 generate-secret --hex dl.google.com

В терминале появится длинная строка, начинающаяся с букв ee (например: ee123456789...dl.google.com). Скопируйте и сохраните её! Это ваш секретный ключ.

3. Создание файла конфигурации

Современная версия mtg требует отдельного файла настроек. Создадим его. Скопируйте приведенный ниже блок целиком, заменив ВАШ_СЕКРЕТ_ИЗ_ШАГА_2 на скопированный ранее длинный ключ (кавычки вокруг ключа нужно оставить!):

cat <<EOF > config.toml
secret = "ВАШ_СЕКРЕТ_ИЗ_ШАГА_2"
bind-to = "0.0.0.0:3128"
EOF

Нажмите Enter. Файл config.toml успешно создан в вашей текущей директории.

4. Запуск прокси-сервера

Теперь запустим сам сервер в фоновом режиме. Команда пробросит нужные порты и применит наш файл настроек:

docker run -d --name mtproto-proxy \
  -p 443:3128 \
  -v $(pwd)/config.toml:/config.toml \
  --restart unless-stopped \
  nineseconds/mtg:2 run /config.toml

Чтобы убедиться, что всё запустилось без ошибок, проверьте логи:

docker logs mtproto-proxy

Если вы не видите сообщений об ошибках, значит сервер успешно работает!

5. Настройка Firewall (UFW)
Обязательно нужно разрешить входящий трафик на наш порт маскировки.
Внимание: Если вы используете UFW, сначала обязательно разрешите порт SSH (22), чтобы не потерять доступ к серверу!

sudo ufw allow 22/tcp
sudo ufw allow 443/tcp
sudo ufw enable

(Нажмите y, если система предупредит о возможном разрыве SSH-соединения).

Подключение в Telegram

Ваш сервер готов! Осталось только сформировать ссылку для себя и своих друзей/клиентов.

Шаблон ссылки выглядит так:
tg://proxy?server=IP_АДРЕС_СЕРВЕРА&port=443&secret=ВАШ_СЕКРЕТ

  1. Замените IP_АДРЕС_СЕРВЕРА на реальный IP вашего сервера.
  2. Вместо ВАШ_СЕКРЕТ вставьте ту самую длинную строку, начинающуюся на ee.
  3. Отправьте эту ссылку себе в "Избранное" в Telegram.
  4. Нажмите на нее и выберите "Подключить прокси".

В верхней части экрана Telegram появится значок щита с галочкой. Поздравляем, теперь ваш трафик надежно замаскирован, а блокировки остались в прошлом!

P.S: Не забудьте обезопасить сервер и другими полезными вещами, например fail2ban, доступ по ssh ключам и т.д.