Публикация локального сервера из дома в интернет

Published on
5 мин. чтения

В этой статье расскажу немного о том как как относительно просто и безопасно опубликовать свои домашние сервисы в интернет для доступа к ним извне. Допустим вы развернули Vaultwarden, NextCloud и что-нибудь еще на своем домашнем сервере и хотите получить доступ к ним находясь вне дома. Можно пойти простым путем и пробросить порт для каждого этого сервиса через роутер, но из соображений безопасности это не самая хорошая идея держать большое количество открытых портов на роутере, к тому же это не очень удобно. Можно пробросить всего два порта 80, 443 и через них получить доступ ко всем необходимым локальным сервисам, в этом нам поможет Nginx Proxy Manager.

NGINX Proxy Manager

Это Open Source проект, ссылки на Github и сайт проекта

Возможности:

  • Простой и удобный web интерфейс
  • Легкая настройка проксирования без редактирования nginx config файла
  • Управление пользователями, разрешения и журнал аудита
  • Возможность установить свои или сгенерировать SSL сертификаты
  • Контроль доступа, средства авторизации, разрешенные и запрещенные адрес листы.
  • Основное назначение это проксирование по URL домена.

Например, мы имеем 3 домена:

test.metalnikovg.ru

test1.metalnikovg.ru

test2.metalnikovg.ru

Все домены обращаются по одному внешнему IP адресу, запрос проксируется Cloudflare (ваш внешний IP адрес подменяется на адреса CDN Cloudflare - это позволяет скрыть его и защитить от DDoS атак) далее запрос приходит на маршрутизатор, он в свою очередь перенаправляет все соединения которые идут на 80 или 443 порт на NGINX Proxy Manager, NGINX в зависимости от домена перенаправляет на необходимый сервер, VM, Container в локальной сети. Подставляет сертификат, управляет разрешениями.

schema

Установка Nginx Proxy Manager

Для установки будет использоваться виртуальная машина Proxmox со следующим характеристиками:

  • OS: Ubuntu 24.04
  • CPU: 2
  • RAM: 2 Gb
  • Disk: 30 Gb

Обновляем пакеты

apt update && apt upgrade -y

Устанавливаем docker

curl -sSL https://get.docker.com | sh
sudo groupadd docker
sudo usermod -aG docker ${USER}
sudo apt install docker-compose
sudo systemctl enable docker
sudo reboot

Настройка docker-compose.yaml

С помощью этого файла будем запускать Nginx Proxy Manager и Dashboard для nginx proxy manager

docker-compose.yml
version: "3"
services:
  nginx-proxy-manager:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80' # HTTP Port
      - '443:443' # HTTPS Port
      - '81:81' # Admin Web Port
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

  npm-monitoring:
    image: xavierh/goaccess-for-nginxproxymanager:latest
    restart: always
    environment:
        - TZ=Asia/Yekaterinburg
        - SKIP_ARCHIVED_LOGS=True #optional
        - EXCLUDE_IPS=127.0.0.1 #optional
        - LOG_TYPE=NPM
    ports:
        - '82:7880'
    volumes:
        - ./data/logs:/opt/log

По умолчанию создается файловая база данных SQLite - data/database.sqlite

docker compose up -d

После запуска контейнера, подключаемся к панели администратора

http://YOUR-IP:81/

Логин и пароль по умолчанию

Email: admin@example.com

Password: changeme

При первом запуске предложит настроить учетную запись администратора и изменить пароль

Подготовка домена и статического адреса

Статический адрес

Нам понадобится белый статический IP адрес, если у вас динамический адрес, то можно использовать любой DDNS сервис на ваш вкус. В некоторых роутерах, например Mikrotik или Keenetic эта функция уже встроена.

Домен

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

Cloudflare

Регистрируемся на CloudFlare если у вас еще нет учетной записи. Нажимаем Add Site вводим наш домен и выбираем беслатный план, если в вашей зоне уже есть какие-либо записи, вам предложат их сразу перенести, так же можно добавить их вручную. Если у вас статический IP, добавляем A запись для нашего домена или субдомена, если вы планируете использовать DDNS, то используйте CNAME запись. Функцию Proxiex для записей пока отключаем. Далее нам необходимо изменить NS сервера у вашего регистратора домена, на те которые предложит CloudFlare. Внимание, этот процесс может занять до 24 часов, о чем вас сразу предупредят. После того как управление DNS зоной нашего домена перешло к CloudFlare, переходим к следующему шагу.

Получаем API ключ, для этого переходим в наш профиль, в раздел API нажимаем Create Token -> Edit zone DNS

cf_api

Сохраняем полученный токен, т.к. в дальнейшем он нам понадобится.

Настройка Nginx Proxy Manager

Так выглядит главный экран NPM

npm

Для добавления прокси хоста переходим в Hosts -> Proxy Hosts -> Add Proxy Host

new_proxy_host

Если мы сейчас сохраним хост, то сервис, размещенный на порту :3000 будет доступен по адресу, который вы указали. Но он будет доступен по протоколу HTTP и если любой человек сделает nslookup вашего домена, то узнает ваш IP адрес или DDNS адрес.

Выпуск SSL сертификата

Переходим в SSL Certificates -> Add SSL Cerificate -> Let's Encrypt

add_ssl_cert

Вписываем ваш домен в формате *.example.com, указываем ваш email, выбираем Cloudflare в провайдерах DNS, включаем опцию DNS Challenge, вставляем ваш токен, принимаем условия и нажимаем сохранить. Ждем пока выпустится ваш сертификат, для вашего основного домена и субдоменов 3 уровня. Если вы хотите выпустить сертификат для домена 4 уровня, например best.test.example.com вам понадобится приобрести у CF платную услугу Advaced Certificate Manager.

После выпуска сертификата, переходим в список наших прокси хостов, жмем три точки напротив хоста нажимаем изменить хост переходим в раздел SSL

edit_host

Выбираем наш сертификат и сохраняем, далее возвращаемся в панель управления Cloudflare и включаем опцию proxies для нашей записи. После этого ваш сервис будет доступен по защищенному протоколу HTTPS а если кто-то захочет узнать ваш адрес через nslookup то в ответе он получит адреса CDN Cloudflare.

Dashboard для nginx proxy manager

Красивый графический вывод информации на основе логов, позволяет посмотреть статистику, оценить нагрузку. Написано на Go работает быстро, даже с большим объемом данных, не потребляет много ресурсов.

В docker-compose необходимо указать путь к логам от nginx proxy manager

npm_dashboard

Cсылка на Github проекта