Привет, Хабр! Меня зовут Максим Анисимов, я главный инженер отдела технической поддержки в хостинг-провайдере SpaceWeb. В статье расскажу, как создать изолированный от внешней сети инстанс Nextcloud, который будет доступен только из-под VPN по IP-адресу. И объясню, чем именно и для кого такое решение будет полезно.

Когда стоит создавать изолированную среду

Изолированная среда пригодится, если вы планируете хранить на сервере чувствительные данные. Так как сервер не будет доступен из внешней сети, это исключает какое-либо внешнее воздействие — например, DDoS-атаки — а значит повышается и его безопасность. 

Да, использование bare-metal сервера для этих целей всё еще является лучшим решением — в этом случае у вас будет полный контроль над инфраструктурой и независимость от поставщика услуг, но при этом не будет необходимости держать собственный сервер.

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

Подготовка: создаем два сервера

Нам потребуются следующие ресурсы:

  • Сервер с OpenVPN. Дисклеймер: в примере мы будем использовать OpenVPN для настройки корпоративного доступа к локальной сети. Сервис не предполагает получение доступа к запрещенным ресурсам вне РФ;

  • Сервер с Nextcloud.

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

Для примера воспользуемся инфраструктурой SpaceWeb. Для OpenVPN и Nextcloud у нас уже есть готовые решения, которые можно выбрать при заказе услуг. 

Так выглядит страница заказа серверов в SpaceWeb
Так выглядит страница заказа серверов в SpaceWeb

Объединяем сервера в одну локальную сеть

Чтобы создать изолированную среду, нам нужно соединить оба сервера в одну локальную сеть. Включить сервера в локальную сеть в SpaceWeb можно сразу во время создании новой услуги VPS или объединить их вручную после заказа. Для нашего примера объединим сервера сразу же и не будем настраивать их вручную.

В конце панели заказа VPS в SpaceWeb есть тумблер подключения к локальной сети
В конце панели заказа VPS в SpaceWeb есть тумблер подключения к локальной сети

Настраиваем 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)


  1. GennPen
    12.04.2024 09:50

    Шаг 6. Перезагружаем сервер.

    А зачем перезагружать сервер при использовании netplan?

    netplan try - проверяем, если все нормально, то применяем конфигурацию и радуемся


  1. Zolg
    12.04.2024 09:50
    +2

    А все эти телодвижения из-за того, что не на всех платформах приложения NC поддерживают mTLS.


    1. David_Osipov
      12.04.2024 09:50

      Можно поставить посерединке nginx и через него проводить аутентификацию с использованием серта.


      1. Zolg
        12.04.2024 09:50
        +2

        Именно. И это гораздо более удобно, гибко и при этом не менее безопасно, чем огораживаться vpn.

        Печаль в том, что как минимум официальное android приложение nextcloud в клиентские сертификаты не умеет.

        Если же вы про использование nginx на стороне условного смартфона (приложение коннектится к nginx на localhost, который дальше проксирует соединение с использованием клиентского сертификата), то такой сетап конечно рабочий, но далек от удобного и обычным пользователем сложнонастраиваем.


  1. andreymal
    12.04.2024 09:50

    Комментируем все строки интерфейса по умолчанию ens3

    А приведёт ли комментирование к тому, что хостинг перестанет принимать пакеты на этот IP-адрес и перенаправлять их в VDS? Если нет, то утверждение «это исключает какое-либо внешнее воздействие» становится неверным


  1. UranusExplorer
    12.04.2024 09:50
    +2

    Сервер с OpenVPN. Дисклеймер: в примере мы будем использовать OpenVPN для настройки корпоративного доступа к локальной сети. Сервис не предполагает получение доступа к запрещенным ресурсам вне РФ;

    Но Роскомнадзор подключения к этому вашему OpenVPN-серверу рано или поздно все равно забанит, потому что откуда им знать, для чего вы его используете.


  1. rbt1428
    12.04.2024 09:50

    Почему нельзя поставить дома на сервер nextcloud и tailscale, прописать доступ по адресу VPN и заходить с телефона по этому адресу?