23.06.2025

Docker заблокирован, как исправить ошибку?

При попытке подключиться к репозиторию Docker многие пользователи могли столкнуться с ошибкой “denied: 403 Forbidden. “Error response from daemon: error parsing HTTP 403 response body: invalid character ‘<’ looking for beginning of value:”

Скриншот №1 — Блокировка

На текущий момент использования платформы контейнеризации не запрещено, однако, загрузка образов из репозиториев прекращена для некоторых стран! Что делать, если вы случайно попали под блокировку? Существует множество вариантов решения проблемы: поднятие зеркала сайта, VPN-сервера или же прокси туннеля. В данном руководстве мы рассмотрим самый не приметный и просто вариант подключения к Docker Hub. Для этого будем использовать ShadowSocks!

Что такое ShadowSocks и как его настраивать?

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

Принцип работы заключается в следующей схеме:

клиент <—> ss-локальный<–[зашифрованный трафик]–> ss-удаленный <—> целевой сервер

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

Настройка сервера ShadowSocks

Все действия были выполнены в среде облачного сервера от Serverspace, для этого перейдем к созданию сервера, на любой из двух платформ vStack cloud или же VMware cloud. Нажмем на кнопку Создать сервер и выберем конфигурацию, подходящую под наши задачи, затем нажмем кнопку Создать:

Скриншот №2 — Создание сервера

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

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

apt update && apt install curl snapd -y

Скриншот №3 — Установка snap

Установку сервера будем производить через snap, который представляет собой пакетный менеджер с возможностью изолированно запускать утилиты и приложения. Для этого установим через snap основные утилиты для работы, через команду:

snap install core

После чего установим сам пакет с ShadowSocks:

snap install shadowsocks-rust

Проверим его компоненты и разрешения для работы с остальной ОС через команды:

snap services shadowsocks-rust
snap connections shadowsocks-rust

Скриншот №4 — Список сервисов

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

Создадим конфигурационный файл для нашего сервера, в формате json:

nano /root/shadowsocks.json

И пропишем конфигурацию для подключения к серверу:

{
"server": "0.0.0.0",
"mode":"tcp_and_udp",
"server_port":1224,
"password":"ZmVlNmlldDVhZW5naWU2ZWlUb29nOGFobjNvaFlpZQo=",
"timeout":300,
"method":"2022-blake3-aes-256-gcm"
}

Скриншот №5 — Конфигурация сервера

В поле сервер укажите конкретный внешний IP-адрес или оставьте прием со всех интерфейсов по умолчанию в виде 0.0.0.0. В поле mode укажите протокол для транспорта вашего трафика, далее укажите порт для подключения к серверу. Пароль из 31 одного символа в виде base64, для этого пропишите следующую команду и введите результат в поле password:

echo “ВАШ_ПАРОЛЬ” | base64

По желанию и вашим требованиям, вы можете изменить метод шифрования трафика! Сохраним конфигурацию файла комбинацией Ctrl + O. После чего протестируем работоспособность сервера командой, где вызовем демон и укажем конфиг для его работы:

snap run shadowsocks-rust.ssserver-daemon -c /root/shadowsocks.json

Скриншот №6 — Тест сервера

Отлично трафик проксируется, значит можем добавить сервер в автозагрузку:

snap start --enable shadowsocks-rust.ssserver-daemon -c /root/shadowsocks.json

После этого будет создан unit в системе инициализации, который необходимо отредактировать и добавить наш новый конфигурационный файл:

nano /etc/systemd/system/snap.shadowsocks-rust.ssserver-daemon.service

К полю ExecStart добавим строку и запустим чтение конфигураций:

ExecStart=/usr/bin/snap run shadowsocks-rust.ssserver-daemon -c /root/shadowsocks.json

Скриншот №7 — Добавим конфиг к демону

Сохраним файл и перечитаем новую конфигурацию, после чего запустим службу:

systemctl daemon-reload && systemctl restart snap.shadowsocks-rust.ssserver-daemon

После чего зафиксируем результат и проверим порты:

systemctl status snap.shadowsocks-rust.ssserver-daemon
netstat -tulnp

Скриншот №8 — Результат работы сервера

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

Настройка клиента ShadowSocks

Также установим пакеты snapd и curl и проведем аналогичные действия, как и для сервера.

apt install snapd curl -y

Установим клиент и распишем новый файл конфигурации для него:

snap install shadowsocks-rust
nano /root/client.json

В сам файл вставляем следующие поля JSON:

{
"server": "IP_Сервера",
"mode":"tcp_and_udp",
"server_port":Ваш_порт_сервера,
"local_address":"127.0.0.1",
"local_port":Локальный_порт,
"password":"Пароль в Base64 от сервера",
"timeout":300,
"method":"Метод шифрования"
}

Подключим автозагрузку для клиента пользователя и настроим файл:

snap start --enable shadowsocks-rust.sslocal-daemon
nano /etc/systemd/system/snap.shadowsocks-rust.sslocal-daemon.service

Пропишем в поле ExecStart необходимый конфиг для загрузки и работы:

ExecStart=/usr/bin/snap run shadowsocks-rust.sslocal-daemon -c /root/client.json

После чего запустим чтение новых конфигурационных файлов

systemctl daemon-reload

Перезапустим службу и проверим наши настройки через curl:

systemctl restart snap.shadowsocks-rust.sslocal-daemon.service
netstat -tulnp && curl -- proxy socks5://127.0.0.1:1224 https://ifconfig.me

Скриншот №9 — Результат работы клиента

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

mkdir /etc/systemd/system/docker.service.d
nano /etc/systemd/system/docker.service.d/http-proxy.conf

Скриншот №10 — Файл для прокси

Пропишем необходимые переменные для работы dockerd и сохраним через Ctrl + O:

Environment="HTTP_PROXY=127.0.0.1:1224"
Environment="HTTPS_PROXY=127.0.0.1:1224"

Перечитаем новые конфигурационные файлы и перезапустим Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

ShadowSocks, благодаря своей возможности шифрования трафика, обеспечивает безопасное подключение к необходимым ресурсам, обходя ограничения и предоставляя доступ к Docker Hub. Настройка сервера и клиента ShadowSocks, а также интеграция его с Docker-клиентом и демоном позволяют создать устойчивое и надежное соединение. Следуя пошаговым инструкциям по установке и настройке, вы сможете настроить систему таким образом, чтобы весь трафик Docker проходил через прокси, обеспечивая доступ к необходимым образам и репозиториям.

Таким образом, даже в условиях блокировки вы можете продолжать использовать возможности контейнеризации Docker, используя современные и надежные решения для проксирования трафика.