Публикация локального сервера из дома в интернет
- Опубликовано
- //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 в локальной сети. Подставляет сертификат, управляет разрешениями.
Установка 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
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
Сохраняем полученный токен, т.к. в дальнейшем он нам понадобится.
Настройка Nginx Proxy Manager
Так выглядит главный экран NPM
Для добавления прокси хоста переходим в Hosts -> Proxy Hosts -> Add Proxy Host
Если мы сейчас сохраним хост, то сервис, размещенный на порту :3000
будет доступен по адресу, который вы указали. Но он будет доступен по протоколу HTTP
и если любой человек сделает nslookup
вашего домена, то узнает ваш IP адрес или DDNS адрес.
Выпуск SSL сертификата
Переходим в SSL Certificates -> Add SSL Cerificate -> Let's Encrypt
Вписываем ваш домен в формате *.example.com, указываем ваш email, выбираем Cloudflare в провайдерах DNS, включаем опцию DNS Challenge, вставляем ваш токен, принимаем условия и нажимаем сохранить. Ждем пока выпустится ваш сертификат, для вашего основного домена и субдоменов 3 уровня. Если вы хотите выпустить сертификат для домена 4 уровня, например best.test.example.com вам понадобится приобрести у CF платную услугу Advaced Certificate Manager.
После выпуска сертификата, переходим в список наших прокси хостов, жмем три точки напротив хоста нажимаем изменить хост переходим в раздел SSL
Выбираем наш сертификат и сохраняем, далее возвращаемся в панель управления Cloudflare и включаем опцию proxies для нашей записи. После этого ваш сервис будет доступен по защищенному протоколу HTTPS а если кто-то захочет узнать ваш адрес через nslookup
то в ответе он получит адреса CDN Cloudflare.
Dashboard для nginx proxy manager
Красивый графический вывод информации на основе логов, позволяет посмотреть статистику, оценить нагрузку. Написано на Go работает быстро, даже с большим объемом данных, не потребляет много ресурсов.
В docker-compose необходимо указать путь к логам от nginx proxy manager