По умолчанию Gopeed запускает встроенный HTTP-сервер на 0.0.0.0:9999 без какого-либо механизма аутентификации и шифрования. Это значит, что доступ к веб-интерфейсу открыт для всех клиентов, которые могут достучаться до порта 9999. В ситуации, когда Gopeed работает на VPS с публичным IP, любой сканер портов может обнаружить сервис и получить доступ к нему. Кроме того, изначально трафик передаётся по HTTP, то есть в незашифрованном виде. В такой конфигурации данные о загрузках, cookie и любые управляющие запросы могут быть перехвачены и изменены посредником.
Настройка реверс-прокси с HTTPS решает сразу несколько проблем. Во-первых, TLS-шифрование обеспечивает конфиденциальность и целостность трафика, поскольку данные между браузером и сервером больше не идут в открытом виде. Во-вторых, реверс-прокси позволяет включить базовую аутентификацию или любой другой механизм авторизации, чтобы ограничить доступ к интерфейсу Gopeed. В-третьих, внешний доступ остаётся только через стандартный порт 443, тогда как внутренний порт 9999 можно закрыть файерволом и оставить доступным только для прокси.
В статье разберём, как защитить доступ к Gopeed, установленном на Ubuntu или Debian, при помощи протокола HTTPS и базовой аутентификации.
Как защитить доступ к Gopeed
Чтобы настроить доступ через HTTPS к веб-интерфейсу Gopeed (как и к любому другому сайту), необходимо сначала привязать к IP-адресу сервера доменное имя. Это связано с тем, что установка TLS-сертификата возможна только при обращении к сайту по имени домена. Привязка доменного имени к IP-адресу производится при помощи специальной DNS-записи, а именно A-записи. Такую настройку можно сделать на сайте регистратора вашего домена, либо во вкладке Домены в личном кабинете RUVDS.

Для публикации сервисов, таких как Gopeed, удобно использовать веб-сервер Caddy, настроенный для работы в качестве обратного прокси. Caddy максимально автоматизирует рутину, которая у Nginx или Apache требует ручной настройки. Веб-сервер Caddy обладает встроенным ACME-клиентом. Это позволяет ему самостоятельно получать и продлевать TLS-сертификаты от Let’s Encrypt, без вызова внешних утилит вроде Certbot. У Caddy из коробки включены современные TLS-настройки, HTTP/2 и даже HTTP/3, что позволяет не тратить время на подбор параметров шифров или протоколов.
Установка Caddy
При настройке для работы по HTTPS Caddy использует порты 443 и 80. Это связано с тем, что для выпуска и продления TLS-сертификатов через ACME-протокол используется так называемый http-01 challenge. Сертификационный центр при проверке домена делает обычный HTTP-запрос на порт 80, ожидая увидеть там специальный токен. Caddy при этом автоматически поднимает обработчик на /.well-known/acme-challenge и возвращает правильный ответ. Если порт 80 закрыт, валидация владения доменом не проходит и сертификат выпустить невозможно. После получения сертификата Caddy продолжит слушать 80-й порт, но только для перенаправления трафика на HTTPS. Это упрощает доступ пользователям и одновременно обеспечивает успешное автоматическое продление сертификата. Таким образом, перед началом работ по настройке HTTPS-доступа необходимо открыть доступ к серверу через порты 80 и 443. Чтобы это сделать, создайте в брандмауэре UFW соответствующие разрешающие правила:
$ sudo ufw allow 80
$ sudo ufw allow 443Затем установите пакеты, которые понадобятся для дальнейшей работы:
$ sudo apt install curl gpgВ данном случае команда выше устанавливает:
- curl– утилиту для передачи данных по URL, которая используется для загрузки файлов по HTTP/HTTPS;
- gpg– GNU Privacy Guard, инструмент для работы с криптографией, который будет нужен для того, чтобы пакетный менеджер- aptмог проверять подлинность пакетов при установке.
Следующей командой загрузите GPG-ключ репозитория Caddy с сохранением его в бинарном формате в каталоге /usr/share/keyrings/. Это необходимо сделать для того, чтобы можно было прописать репозиторий в /etc/apt/sources.list.d/, а apt мог проверять подлинность пакетов при установке.
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpgПосле чего добавьте в систему репозиторий Caddy:
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.listЗатем обновите списки пакетов, чтобы система узнала о появлении нового репозитория:
$ sudo apt updateИ запустите установку непосредственно Caddy:
$ sudo apt install caddyЧтобы убедиться в корректности установки, выведите на экран текущее состояние службы Caddy:
$ systemctl status caddyВывод команды не должен содержать сообщений о каких-либо ошибках:

Настройка Caddy
Если вывод предыдущей команды не содержит ошибок, откройте для редактирования конфигурационный файл Caddy:
$ sudo nano /etc/caddy/CaddyfileЕсли вы планируете использовать Caddy только в качестве обратного прокси, то приведите его содержимое к следующему виду:
your-site-name.ru {
    reverse_proxy localhost:9999
}В данном случае:
- your-site-name.ru– доменное имя, по которому доступен веб-интерфейс Gopeed;
- 9999– номер порта, на который будут проксироваться все запросы, пришедшие на домен.
Сохраните внесённые изменения, закройте файл, после чего перезапустите службу Caddy:
$ sudo systemctl restart caddyЗатем откройте браузер и перейдите на веб-интерфейс Gopeed, используя для этого его доменное имя. Подключение к веб-странице должно быть осуществлено через протокол HTTPS. Об этом будет свидетельствовать надпись вида Подключение защищено в навигационной строке браузера.

С этого момента порт 9999 будет использоваться только для проксирования запросов обратным прокси. А значит, доступ к серверу через данный порт можно закрыть. Сделать это можно, удалив соответствующее правило в брандмауэре UFW:
$ sudo ufw delete allow 9999Установка парольной защиты
Gopeed не имеет встроенной авторизации, но на уровне Caddy есть возможность защитить веб-интерфейс паролем. Чтобы установить данный механизм аутентификации, необходимо внести изменения в конфигурационный файл Caddy:
$ sudo nano /etc/caddy/CaddyfileВ файл добавьте секцию route:
your-site-name.ru {
    reverse_proxy localhost:9999
    route {
        basic_auth * {
            user-for-gopeed $abR.......pG41Zm
        }
        reverse_proxy 127.0.0.1:9999
    }
}В данном блоке:
- basic_auth * { ... }– встроенный модуль Caddy, который реализует HTTP Basic Auth;
- *– данная настройка означает, что правило необходимо применять ко всем запросам;
- user-for-gopeed– имя пользователя, которое нужно будет ввести в диалоговом окне браузера;
- $abR.......pG41Zm– bcrypt-хэш пароля.
Для генерации bcrypt-хэша пароля закройте Caddy-файл с сохранением изменений и запустите команду:
$ caddy hash-passwordКоманда попросит вас дважды ввести пароль, при помощи которого вы будете подключаться к веб-интерфейсу Gopeed. После чего сгенерирует строку, похожую на запись вида:
$abR.......pG41ZmИменно эту строку и необходимо скопировать и вставить в конфигурационный файл Caddy. После сохранения всех изменений перезапустите службу Caddy:
$ sudo systemctl reload caddyВ результате при подключении к веб-интерфейсу Gopeed вам нужно будет ввести имя пользователя, указанное в конфигурационном файле, и пароль, который вы набрали при выполнении команды caddy hash-password.

