Ограничение доступа к панели 3X-UI

Решил написать небольшую инструкцию по ограничению доступа к панели 3X-UI. Мне запрещено создавать темы в категории Manuals and How-Tos, поэтому выложу сюда. Если модераторы посчитают нужным, то перенесут тему куда надо.

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

Глобально вижу три варианта.

1. Доступ с любого устройства (используется по умолчанию).

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

  • логин: admin;
  • пароль: admin;
  • порт: 2053.

Если панель устанавливается не через Docker, то эти параметры генерируются случайно. Вариант с Docker особо опасен, поэтому обязательно нужно (некоторые из пунктов касаются и случая без Docker):

  • поменять логин и пароль;
  • подключить сертификат (хватит и самозаверенного);
  • поменять порт (далее port);
  • придумать или сгенерировать случайный путь в адресе панели (далее path).

Если всё сделано правильно, то зайти в панель можно так, где вместо vps_ip нужно подставить адрес вашего сервера:
https://vps_ip:port/path/panel.

Чтобы безопасно настроить панель в первый раз, можно:

  • воспользоваться следующим пунктом (в этом случае не нужно ограничивать адрес, на котором слушает панель);
  • использовать команду x-ui (не работает, если установка была в Docker);
  • найти файл x-ui.db и отредактировать руками:
    # sqlite3 /etc/x-ui/x-ui.db.
    Возможное расположение файла:
    • /etc/x-ui/x-ui.db по умолчанию;
    • /db/x-ui.db, если установка была через Docker и использовалась команда sudo без дополнительных параметров;
    • .../3x-ui/db/x-ui.db, если установка была через Docker без sudo (вместо троеточия нужно подставить путь до места, куда вы клонировали репозиторий).
2. Доступ через ssh.

Панель слушает только на адресе 127.0.0.1, поэтому подключаться нужно через проброс порта по ssh. В этом случае шаги, необходимые в предыдущем пункте, можно не выполнять. Сперва вам нужно выбрать локальный порт (далее local_port), к которому вы будете обращаться.

Чтобы пробросить порт до панели, нужно использовать соответствующий флаг:
$ ssh -L local_port:localhost:port ...;
либо, если используете файл ~/.ssh/config, добавить в раздел Host:
LocalForward local_port localhost:port.

В этом случае зайти в панель можно так:
localhost:local_port/panel;
либо, если вы подключили сертификат и поменяли путь в адресе, так:
https://localhost:local_port/path/panel.

3. Доступ через ssh или прокси.

Панель слушает частный адрес, поэтому подключаться нужно либо через проброс порта по ssh, либо с включённым прокси. Компромиссный вариант, но советую всё равно поменять настройки по умолчанию, особенно если делаете не только для себя. Этот пункт требует особой настройки.

  • Выберите частный адрес (далее private_ip), который вы хотите использовать (список есть тут: Частный IP-адрес).
  • Убедитесь, что он ещё не используется в системе (например, Docker создаёт мост с частным адресом):
    $ ip -color=auto a.
  • Добавьте выбранный адрес на интерфейс lo через менеджер сети, который используете, либо вручную (будет работать до перезагрузки):
    # ip addr add private_ip/32 dev lo scope host.
  • Уберите блокировку с Private IPs в настройках панели. Возможно, потребуется ещё добавить private_ip в маршрутизацию на стороне клиента.
  • Настройте панель слушать только private_ip.

Теперь зайти в панель можно так, если включён прокси:
https://private_ip:port/path/panel.

Чтобы зайти в панель не через прокси, а через ssh, нужно пробросить порт:
$ ssh -L local_port:private_ip:port ....
После этого можно зайти по адресу:
https://localhost:local_port/path/panel.