Обо мне Блог Контакты

Организация внешнего доступа к домашней Homelab

Предисловие

Предположим, вы создали свой домашний сервер (Homelab) и пользуетесь своими сервисами внутри локальной сети дома. Это замечательно, но... Правда ведь, вы хотели бы использовать некоторые свои сервисы, находясь вне дома? Тот же Nextcloud с файлами или Immich с фотографиями.

Представьте: вы уехали за границу на отдых, а вам понадобились сканы документов из вашего Nextcloud, или вы просто хотите полистать свои прошлые фотографии. На самом деле случаев, когда нужен доступ к Homelab, очень много. Я, например, уже не представляю, как обходиться без него.

Note

Статья рассчитана на то, что ваш Homelab работает под Debian/Ubuntu — это самый распространённый случай. Я сам использую Ubuntu. Но даже если вы работаете с другим дистрибутивом или вообще другой операционной системой, информация поможет вам разобраться в принципах.


О пробросе портов

Есть простой способ — пробросить нужные порты на домашнем роутере и купить статический внешний IP-адрес у интернет-провайдера. Далее заходим, например, в Immich, написав в адресной строке: XX.XX.XX.XX:2283 (Где XX.XX.XX.XX - это ваш статический IP адрес). Всё будет работать.

Но есть серьёзные минусы:

  • Значительно увеличивается поверхность атаки;
  • Требуется очень аккуратная настройка безопасности;
  • Вы открываете порты сервера наружу и позволяете войти в локальную сеть всем подряд;
  • Ваш IP-адрес становится публично известен.

Warning

Этот вариант возможен, но требует очень аккуратной настройки безопасности и постоянного внимания. Я не рекомендую этот вариант, так как даже если вы вкурсе всех минусов и понимаете что делаете - всегда есть очень большой шанс или ошибиться или установить "дырявое" приложение на Homelab, через которое можно будет сделать все что угодно.


Как будем делать

Вот схема, которую я использую:

  1. Покупаю доменное имя;
  2. Арендую внешний VPS-сервер;
  3. Направляю домен на VPS посредством DNS-записи;
  4. Соединяю VPS и домашний сервер через WireGuard-туннель;
  5. Организую доступ к внутренним сервисам через обратный прокси.

Звучит страшно? На самом деле всё не сложно. Дальше разберём по шагам.


Шаг 1. Покупка домена

Покупаем любое доменное имя у любого регистратора. Их очень много — просто напишите в поиске "купить домен". Дорогой не нужно — рублей за 100–200 вполне подойдёт. У меня, например, домен kvasok.xyz.

Tip

Обязательно смотрите стоимость продления через год. Бывает так: покупаете за 100 рублей, а продлить — 5000 рублей.


Шаг 2. Аренда VPS-сервера

Арендуем самый дешёвый VPS-сервер. Никакой нагрузки на нём не будет, так что подойдёт самый начальный тариф.

Рекомендации:

  • Выбирайте локацию поближе к вам (в идеале — в вашем городе), чтобы пинг был минимальным;
  • Операционная система: Ubuntu Server 24.04.

Я использую timeweb.cloud провайдера VPS серверов, но это не реклама — подойдёт любой провайдер.


Шаг 3. Настройка DNS записей домена

Добавляем к вашему домену DNS-запись типа A, содержащую IP-адрес вашего VPS-сервера. Таким образом мы связываем домен и VPS.

Вы можете связать только поддомен, например: homelab.ваш-домен.ru. Как это сделать — спросите у регистратора или загуглите (уверен найдете за два клика).

Info

После добавления записи необходимо подождать, пока DNS-серверы примут изменения. Обычно это занимает около 15 минут, но бывает и дольше.


Шаг 4. Базовая защита VPS

Заходим на VPS по SSH и делаем как минимум всё то, что описано в статье про базовую защиту VPS/VDS сервера.

На текущий момент мы имеем:

Доменное имя, при вводе которого в адресную строку мы попадаем на наш VPS-сервер. Естественно, вы ничего не увидите, так как на сервере ещё ничего не установлено. Но нам нужно попадать на Homelab — а значит идём дальше.


WireGuard-туннель

Теперь нужно связать VPS и Homelab. Делать это будем через WireGuard-туннель — по сути, это зашифрованная связь между двумя серверами, если на пальцах, или другими словами - VPN. Мы объединили наш VPS сервер и Homelab в одну виртуальную сеть.

Инициировать соединение будем из дома. Это даёт три преимущества:

  1. Не нужно открывать порты на роутере;
  2. Не требуется белый IP;
  3. Домашний IP-адрес нигде не фигурирует — даже в конфигурации VPS.

Установка WireGuard

Устанавливаем WireGuard на обоих серверах (VPS и Homelab):

sudo apt update && sudo apt install wireguard -y

Генерация ключей

У каждого сервера будет по два ключа — открытый (public) и закрытый (private).

Note

  • Открытый ключ — можно показывать кому угодно и загружать куда угодно;
  • Закрытый ключ — должен находиться только на вашем сервере с соответствующими правами доступа.

Генерируем пару ключей на каждом сервере:

sudo -i
cd /etc/wireguard
wg genkey | tee private.key | wg pubkey > public.key
chmod 600 private.key

Warning

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

В результате выполнения этих команд, в директории /etc/wireguard у нас сгенерируются пара ключей (открытый и закрытый).


Настройка WireGuard

Настройка на VPS

Открываем файл конфигурации:

sudo nano /etc/wireguard/wg0.conf

Вставляем следующую конфигурацию:

[Interface]
PrivateKey = <PRIVATE_KEY_VPS>
Address = 10.0.0.1/32
ListenPort = 51820

[Peer]
PublicKey = <PUBLIC_KEY_HOMELAB>
AllowedIPs = 10.0.0.2/32

Замените:

Плейсхолдер Откуда взять
<PRIVATE_KEY_VPS> cat /etc/wireguard/private.key на VPS
<PUBLIC_KEY_HOMELAB> cat /etc/wireguard/public.key на Homelab

Tip

Поясню для тех кто не понял. Нам нужно поместить закрытый ключ VPS и открытый ключ Homelab в конфигурацию WireGuard на VPS /etc/wireguard/wg0.conf. Команда cat - просто выводит в терминал содержимое файла. Таким образом при вводе cat /etc/wireguard/private.key на VPS, мы получаем наш закрытый ключ, который нужно вставить вместо <PRIVATE_KEY_VPS>. Дальше все аналогично.

Настройка на Homelab

Аналогично открываем файл конфигурации на домашнем сервере:

sudo nano /etc/wireguard/wg0.conf

Вставляем конфигурацию:

[Interface]
PrivateKey = <PRIVATE_KEY_HOMELAB>
Address = 10.0.0.2/32

[Peer]
PublicKey = <PUBLIC_KEY_VPS>
Endpoint = <PUBLIC_IP_VPS>:51820
AllowedIPs = 10.0.0.1/32
PersistentKeepalive = 25

Замените:

Плейсхолдер Откуда взять
<PRIVATE_KEY_HOMELAB> cat /etc/wireguard/private.key на Homelab
<PUBLIC_KEY_VPS> cat /etc/wireguard/public.key на VPS
<PUBLIC_IP_VPS> Внешний IP-адрес вашего VPS

Warning

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


Настройка Firewall на VPS

В статье про базовую защиту VPS мы закрыли все входящие порты. Теперь нужно открыть порт для WireGuard:

sudo ufw allow 51820/udp

Запуск WireGuard-туннеля

Запускаем туннель на обоих серверах:

sudo wg-quick up wg0

Добавляем в автозапуск (также на обоих):

sudo systemctl enable wg-quick@wg0

Проверка соединения

Проверяем с помощью ping:

# С VPS
ping 10.0.0.2

# С Homelab
ping 10.0.0.1

Если всё пингуется — туннель установлен! ✅


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

Мы на заключительном этапе. Домен ведёт на VPS, VPS соединён с Homelab через WireGuard. Теперь нужно заставить VPS проксировать HTTP/HTTPS-запросы к Homelab. Для этого используем Nginx как обратный прокси.


Установка Nginx

На VPS выполняем:

sudo apt update && sudo apt install nginx libnginx-mod-stream -y

Конфигурация Nginx

Открываем конфигурационный файл:

sudo nano /etc/nginx/nginx.conf

Вставляем следующую конфигурацию:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
}

http {

}

stream {
	log_format proxy '$remote_addr [$time_local]' '$protocol $status $bytes_sent $bytes_received' '$session_time -> $upstream_addr';

	access_log /var/log/nginx/stream.log proxy;

	upstream home_http {
		server 10.0.0.2:80;
	}

	upstream home_https {
		server 10.0.0.2:443;
	}

	server {
		listen 80;
		proxy_pass home_http;
		proxy_protocol on;
		proxy_connect_timeout 1s;
	}

	server {
		listen 443;
		proxy_pass home_https;
		proxy_protocol on;
		proxy_connect_timeout 1s;
	}
}

Этим конфигом мы проксируем все запросы с портов 80 (HTTP) и 443 (HTTPS) через WireGuard-туннель на Homelab.

Проверяем конфигурацию и перезагружаем Nginx:

sudo nginx -t
sudo systemctl restart nginx

Warning

Так как мы используем proxy_protocol, сервисы на Homelab обязаны уметь его принимать. Если PROXY protocol не включён на стороне Homelab, HTTPS-соединения работать не будут. Настройка для обратного прокси Traefik будет разобрана в следующей статье.


Настройка Firewall

Открываем порты 80 и 443:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Warning

В некоторых конфигурациях UFW может блокировать трафик через интерфейс wg0. Если Nginx не может подключиться к Homelab, попробуйте явно разрешить трафик:

sudo ufw allow in on wg0
sudo ufw allow out on wg0

Включение маршрутизации

Так как VPS используется как Proxy-шлюз, нужно включить маршрутизацию:

sudo sysctl -w net.ipv4.ip_forward=1

Чтобы изменение сохранилось после перезагрузки, добавляем в /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Добавьте или раскоментируйте строку:

net.ipv4.ip_forward=1

Note

Без этого в некоторых сценариях проксирование может работать нестабильно.


Итоги

Что мы получили:

Преимущество Описание
✅ Нет открытых портов Домашний сервер не имеет открытых портов наружу
✅ Не требуется белый IP Работает с любым типом подключения
✅ Анонимность Домашний IP нигде не фигурирует
✅ Централизация трафика Весь внешний трафик проходит через VPS
✅ Защита от сканирования VPS принимает на себя весь шум из интернета
✅ Изоляция Внутренняя сеть Homelab изолирована

Что дальше?

На самой Homelab нам нужно слушать порты 80 (HTTP) и 443 (HTTPS) и, в зависимости от запроса, направлять трафик на нужный сервис. Это тема следующей статьи.