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

На текущий момент использования платформы контейнеризации не запрещено, однако, загрузка образов из репозиториев прекращена для некоторых стран! Что делать, если вы случайно попали под блокировку? Существует множество вариантов решения проблемы: поднятие зеркала сайта, VPN-сервера или же прокси туннеля. В данном руководстве мы рассмотрим самый не приметный и просто вариант подключения к Docker Hub. Для этого будем использовать ShadowSocks!
Что такое ShadowSocks и как его настраивать?
ShadowSocks – это прокси-сервер с возможностью шифрования туннелированного трафика проходящего через него с целью безопасной передачи, через недоверенные участки сети, а также обращения через устройства с иным IP-адресом.
Принцип работы заключается в следующей схеме:
клиент <—> ss-локальный<–[зашифрованный трафик]–> ss-удаленный <—> целевой сервер
Клиент поднимает на своей стороне прокси сервер, которому можно обратиться по внутреннему адресу. Весь приходящий на него трафик шифруется и передается на ss-удаленный или же endpoint, где он принимается и расшифровывается. После чего происходит обращение от машины куда пришли пакеты, и затем происходит обратный процесс передачи на клиент.
Настройка сервера ShadowSocks
Все действия были выполнены в среде облачного сервера от Serverspace, для этого перейдем к созданию сервера, на любой из двух платформ vStack cloud или же VMware cloud. Нажмем на кнопку Создать сервер и выберем конфигурацию, подходящую под наши задачи, затем нажмем кнопку Создать:

Потребуется некоторое время для развертывания серверных мощностей. После чего вы можете подключиться любым из удобных способов. На основе предлагаемы VPS и VDS серверов, так же можно развернуть уже свою виртуальную инфраструктуру.
Перед установкой и настройкой сервера необходимо обновить репозитории и скачать необходимые для работы пакеты. Если вы используете apt-менеджер, то команда будет выглядеть следующим образом:
apt update && apt install curl snapd -y 
Установку сервера будем производить через snap, который представляет собой пакетный менеджер с возможностью изолированно запускать утилиты и приложения. Для этого установим через snap основные утилиты для работы, через команду:
snap install core После чего установим сам пакет с ShadowSocks:
snap install shadowsocks-rustПроверим его компоненты и разрешения для работы с остальной ОС через команды:
snap services shadowsocks-rust snap connections shadowsocks-rust
Как видим пакет состоит из двух служб 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"
}
В поле сервер укажите конкретный внешний IP-адрес или оставьте прием со всех интерфейсов по умолчанию в виде 0.0.0.0. В поле mode укажите протокол для транспорта вашего трафика, далее укажите порт для подключения к серверу. Пароль из 31 одного символа в виде base64, для этого пропишите следующую команду и введите результат в поле password:
echo “ВАШ_ПАРОЛЬ” | base64 По желанию и вашим требованиям, вы можете изменить метод шифрования трафика! Сохраним конфигурацию файла комбинацией Ctrl + O. После чего протестируем работоспособность сервера командой, где вызовем демон и укажем конфиг для его работы:
snap run shadowsocks-rust.ssserver-daemon -c /root/shadowsocks.json 
Отлично трафик проксируется, значит можем добавить сервер в автозагрузку:
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 
Сохраним файл и перечитаем новую конфигурацию, после чего запустим службу:
systemctl daemon-reload && systemctl restart snap.shadowsocks-rust.ssserver-daemonПосле чего зафиксируем результат и проверим порты:
systemctl status snap.shadowsocks-rust.ssserver-daemon netstat -tulnp 
Порты прослушиваются, а служба работает исправно, теперь необходимо выполнить аналогичные действия, но для клиента.
Настройка клиента ShadowSocks
Также установим пакеты snapd и curl и проведем аналогичные действия, как и для сервера.
apt install snapd curl -yУстановим клиент и распишем новый файл конфигурации для него:
snap install shadowsocks-rustnano /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-daemonnano /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.servicenetstat -tulnp && curl -- proxy socks5://127.0.0.1:1224 https://ifconfig.me
Для того, чтобы только трафик Docker ходил через прокси необходимо дополнить юнит системы инициализации. Создадим папку и зайдем в конфиг файл:
mkdir /etc/systemd/system/docker.service.dnano /etc/systemd/system/docker.service.d/http-proxy.conf
Пропишем необходимые переменные для работы 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 dockerShadowSocks, благодаря своей возможности шифрования трафика, обеспечивает безопасное подключение к необходимым ресурсам, обходя ограничения и предоставляя доступ к Docker Hub. Настройка сервера и клиента ShadowSocks, а также интеграция его с Docker-клиентом и демоном позволяют создать устойчивое и надежное соединение. Следуя пошаговым инструкциям по установке и настройке, вы сможете настроить систему таким образом, чтобы весь трафик Docker проходил через прокси, обеспечивая доступ к необходимым образам и репозиториям.
Таким образом, даже в условиях блокировки вы можете продолжать использовать возможности контейнеризации Docker, используя современные и надежные решения для проксирования трафика.