Организация внешнего доступа к домашней 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, через которое можно будет сделать все что угодно.
Как будем делать
Вот схема, которую я использую:
- Покупаю доменное имя;
- Арендую внешний VPS-сервер;
- Направляю домен на VPS посредством DNS-записи;
- Соединяю VPS и домашний сервер через WireGuard-туннель;
- Организую доступ к внутренним сервисам через обратный прокси.
Звучит страшно? На самом деле всё не сложно. Дальше разберём по шагам.
Шаг 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 в одну виртуальную сеть.
Инициировать соединение будем из дома. Это даёт три преимущества:
- Не нужно открывать порты на роутере;
- Не требуется белый IP;
- Домашний 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) и, в зависимости от запроса, направлять трафик на нужный сервис. Это тема следующей статьи.