Привет, Хабр! Меня зовут Максим Анисимов, я главный инженер отдела технической поддержки в хостинг-провайдере SpaceWeb. В статье расскажу, как создать изолированный от внешней сети инстанс Nextcloud, который будет доступен только из-под VPN по IP-адресу. И объясню, чем именно и для кого такое решение будет полезно.
Когда стоит создавать изолированную среду
Изолированная среда пригодится, если вы планируете хранить на сервере чувствительные данные. Так как сервер не будет доступен из внешней сети, это исключает какое-либо внешнее воздействие — например, DDoS-атаки — а значит повышается и его безопасность.
Да, использование bare-metal сервера для этих целей всё еще является лучшим решением — в этом случае у вас будет полный контроль над инфраструктурой и независимость от поставщика услуг, но при этом не будет необходимости держать собственный сервер.
Если никакие чувствительные данные храниться не будут, или данных будет немного, то большого смысла от изоляции не будет. Также изоляция не требуется, если к хранилищу потребуется предоставлять общий доступ.
Подготовка: создаем два сервера
Нам потребуются следующие ресурсы:
Сервер с OpenVPN. Дисклеймер: в примере мы будем использовать OpenVPN для настройки корпоративного доступа к локальной сети. Сервис не предполагает получение доступа к запрещенным ресурсам вне РФ;
Сервер с Nextcloud.
Можно как купить чистый сервер и установить на него ПО самостоятельно, так и выбрать готовый вариант у провайдера.
Для примера воспользуемся инфраструктурой SpaceWeb. Для OpenVPN и Nextcloud у нас уже есть готовые решения, которые можно выбрать при заказе услуг.
Объединяем сервера в одну локальную сеть
Чтобы создать изолированную среду, нам нужно соединить оба сервера в одну локальную сеть. Включить сервера в локальную сеть в SpaceWeb можно сразу во время создании новой услуги VPS или объединить их вручную после заказа. Для нашего примера объединим сервера сразу же и не будем настраивать их вручную.
Настраиваем OpenVPN
Поскольку мы используем наш сервер с предустановленным OpenVPN, дополнительная настройка не нужна. Но если вы решите использовать чистый сервер или сервер у другого провайдера, там может потребоваться настройка. Обычно с этим не возникает проблем, а подробных инструкций в открытом доступе очень много.
Настраиваем Nextcloud
Шаг 1. Выпускаем самоподписанный сертификат для Nextcloud.
Подключаемся к серверу по SSH и выполняем команду:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/nextcloud-selfsigned.key -out /etc/ssl/certs/nextcloud-selfsigned.crt
Данные могут указываться любые, но в Common Name нам нужно указать локальный IP-адрес сервера.
Шаг 2. Убираем упоминание домена по умолчанию.
Если вы самостоятельно устанавливаете и настраиваете ПО, скорее всего, у вас уже указан публичный IP-сервера. Тогда вам нужно будет вместо публичного IP-адреса указывать адрес локальной сети.
А вот при использовании решений SpaceWeb для Nextcloud автоматически подставляется технический домен. Он нам больше не пригодится — уберем его, оставив доступ по локальному IP. Для этого сначала нам нужно удалить символьную ссылку /etc/nginx/sites-enabled/default
unlink /etc/nginx/sites-enabled/default
В файле виртуального хоста nginx по пути /etc/nginx/sites-available/nextcloud вносим изменения:
во всех директивах server_name заменяем тестовый домен на локальный IP-адрес сервера;
в директивах ssl_certificate и ssl_certificate_key прописываем пути до ранее сгенерированных сертификатов:
ssl_certificate /etc/ssl/certs/nextcloud-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nextcloud-selfsigned.key;
В директивах перенаправления на https версию сайта заменяем указанный домен на локальный IP-адрес сервера:
if ($host = 10.0.0.99)
{return 301 https://$host$request_uri;
}
Шаг 3. Прописываем локальный IP-адрес вашего сервера.
Сделать это нужно в конфигурационном файле самого Nextcloud по пути /var/www/nextcloud/config/config.php. В Trusted Domains заменяем технический домен на локальный IP-адрес сервера.
Шаг 4. Отключаем сервер Nextcloud от внешней сети.
Делаем это в настройках сетевой карты. В ОС Ubuntu это делается в файле /etc/netplan/50-cloud-init.yaml
Комментируем все строки интерфейса по умолчанию ens3, оставив только локальный интерфейс ens4:
network:
ethernets:
# ens3:
# addresses:
# - 77.222.60.8/24
# - 2a02:408:7722:54:77:222:60:8/64
# gateway4: 77.222.60.1
# gateway6: 2a02:408:7722:54::1
# nameservers:
# addresses:
# - 8.8.8.8
# - 8.8.4.4
# - 2001:4860:4860::8888
# - 2001:4860:4860::8844
# search: []
# optional: true
ens4:
addresses:
- 10.0.0.99/27
Шаг 5. Сохраняем файл и выполняем команду:
netplan generate
Шаг 6. Перезагружаем сервер.
Готово! Теперь сервер доступен по локальному IP-адресу. Чтобы получить к нему доступ, пользователям нужно предварительно подключиться к серверу OpenVPN.
Использование домена вместо IP-адреса для подключения к Nextcloud
Если нужно, чтобы доступ к Nextcloud был по определенному домену (например, nextcloud.example.ru), то вместо локального IP-адреса при настройке потребуется везде указывать этот домен.
Чтобы работал резолвинг домена внутри сети, нужно на обоих серверах добавить следующую запись в файл /etc/hosts:
10.0.0.99 nextcloud.example.ru
При этом вместо 10.0.0.99 нужно указать локальный IP-адрес сервера Nextcloud, а вместо nextcloud.example.ru — ваш домен.
Этот домен не обязательно должен существовать, так как резолвинг будет происходить локально.
Комментарии (7)
Zolg
12.04.2024 09:50+2А все эти телодвижения из-за того, что не на всех платформах приложения NC поддерживают mTLS.
David_Osipov
12.04.2024 09:50Можно поставить посерединке nginx и через него проводить аутентификацию с использованием серта.
Zolg
12.04.2024 09:50+2Именно. И это гораздо более удобно, гибко и при этом не менее безопасно, чем огораживаться vpn.
Печаль в том, что как минимум официальное android приложение nextcloud в клиентские сертификаты не умеет.
Если же вы про использование nginx на стороне условного смартфона (приложение коннектится к nginx на localhost, который дальше проксирует соединение с использованием клиентского сертификата), то такой сетап конечно рабочий, но далек от удобного и обычным пользователем сложнонастраиваем.
andreymal
12.04.2024 09:50Комментируем все строки интерфейса по умолчанию ens3
А приведёт ли комментирование к тому, что хостинг перестанет принимать пакеты на этот IP-адрес и перенаправлять их в VDS? Если нет, то утверждение «это исключает какое-либо внешнее воздействие» становится неверным
UranusExplorer
12.04.2024 09:50+2Сервер с OpenVPN. Дисклеймер: в примере мы будем использовать OpenVPN для настройки корпоративного доступа к локальной сети. Сервис не предполагает получение доступа к запрещенным ресурсам вне РФ;
Но Роскомнадзор подключения к этому вашему OpenVPN-серверу рано или поздно все равно забанит, потому что откуда им знать, для чего вы его используете.
rbt1428
12.04.2024 09:50Почему нельзя поставить дома на сервер nextcloud и tailscale, прописать доступ по адресу VPN и заходить с телефона по этому адресу?
GennPen
А зачем перезагружать сервер при использовании netplan?
netplan try - проверяем, если все нормально, то применяем конфигурацию и радуемся