Files
homelab-docs/docs/containers/container-109.md

206 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Контейнер 109 (local-vpn): локальный WireGuard VPN
Подробное описание LXC-контейнера **109** на Proxmox (192.168.1.109): локальный VPN-сервер на WireGuard для доступа к внутренней сети и сервисам (в т.ч. Vaultwarden) только через зашифрованный туннель.
---
## Общие сведения
- **Хостнейм:** local-vpn
- **ID:** 109
- **IP:** 192.168.1.109/24
- **ОС:** Debian 12 (bookworm)
- **Ресурсы:** 1 core, 256 MB RAM, 1 GB диск на `local-lvm`
- **Доступ:** с Proxmox — `ssh root@192.168.1.150``pct exec 109 -- bash`.
Назначение контейнера — поднимать локальный WireGuard, через который:
- клиенты (iOS/macOS) получают доступ к сети `192.168.1.0/24` (LAN),
- DNS внутри VPN идёт через AdGuard на CT 100 (`192.168.1.100`),
- доступ к Vaultwarden (`vault.katykhin.ru` → NPM → 192.168.1.103:8280) можно ограничить **только через этот VPN** (ограничение на уровне NPM/фаервола, см. соответствующую документацию).
---
## Создание контейнера
Контейнер создан на Proxmox командой вида (выполнено на хосте 192.168.1.150):
```bash
pct create 109 local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst \
--hostname local-vpn \
--cores 1 \
--memory 256 \
--rootfs local-lvm:1 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.1.109/24,gw=192.168.1.1,firewall=1 \
--features keyctl=1,nesting=1
pct start 109
```
---
## WireGuard (wg0) внутри контейнера
### Пакеты и подготовка
Внутри CT 109:
```bash
apt-get update
apt-get install -y wireguard-tools iptables
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-wg-forward.conf
sysctl -p /etc/sysctl.d/99-wg-forward.conf
```
### Ключи и конфиг
Ключи сервера и клиентов лежат в `/etc/wireguard/` (файлы `server.key/.pub`, `ios.key/.pub`, `macos.key/.pub`).
Основной конфиг интерфейса — `/etc/wireguard/wg0.conf`:
```ini
[Interface]
Address = 10.10.99.1/24
ListenPort = 43123
PrivateKey = <server-private-key>
# Включение форвардинга LAN <-> VPN с NAT
PostUp = iptables -A FORWARD -i wg0 -o eth0 -s 10.10.99.0/24 -d 192.168.1.0/24 -j ACCEPT; \
iptables -A FORWARD -i eth0 -o wg0 -d 10.10.99.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT; \
iptables -t nat -A POSTROUTING -s 10.10.99.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o eth0 -s 10.10.99.0/24 -d 192.168.1.0/24 -j ACCEPT; \
iptables -D FORWARD -i eth0 -o wg0 -d 10.10.99.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT; \
iptables -t nat -D POSTROUTING -s 10.10.99.0/24 -o eth0 -j MASQUERADE
[Peer]
# iOS
PublicKey = <ios-public-key>
AllowedIPs = 10.10.99.2/32
[Peer]
# macOS
PublicKey = <macos-public-key>
AllowedIPs = 10.10.99.3/32
```
- **Серверный адрес:** `10.10.99.1/24` (подсеть VPN).
- **Порт WireGuard:** `43123/UDP`.
- **NAT:** MASQUERADE на выход в `192.168.1.0/24`, чтобы не настраивать статические маршруты на роутере.
### Запуск и автозапуск
```bash
wg-quick up wg0 # ручной запуск
wg show # проверить состояние
systemctl enable wg-quick@wg0 # автозапуск при старте CT
systemctl start wg-quick@wg0
```
Проверка интерфейса:
```bash
ip a show wg0
```
Ожидаемый адрес: `10.10.99.1/24`.
**Логи и ротация:** для auth/syslog настроен logrotate `/etc/logrotate.d/homelab-vpn-ssh.conf` — 90 дней, небольшой лимит размера (10 MB, 4 архива). Базовая политика LXC: `/etc/logrotate.d/homelab-lxc.conf`. См. [Logrotate — базовая политика homelab](../maintenance/logrotate/README.md).
---
## Конфиги клиентов (split-tunnel + DNS через AdGuard)
Клиентские конфиги удобно хранить в `/etc/wireguard/clients/` внутри CT (и оттуда забирать на устройства).
### Базовые параметры для всех клиентов
- **Адрес клиента в VPN:** `10.10.99.X/32` (уникальный для каждого устройства).
- **DNS:** `192.168.1.100` (AdGuard на CT 100).
- **Endpoint сервера:** `185.35.193.144:43123` (внешний IP + порт, проброшенный на CT 109).
- **Split tunnel:**
- `AllowedIPs = 10.10.99.0/24, 192.168.1.0/24`
→ через VPN идут только:
- сама VPN-подсеть `10.10.99.0/24`,
- внутренняя сеть `192.168.1.0/24` (все домашние сервисы, в т.ч. NPM и Vaultwarden).
Весь остальной интернет идёт **напрямую** у клиента.
Пример для iOS:
```ini
[Interface]
Address = 10.10.99.2/32
PrivateKey = <ios-private-key>
DNS = 192.168.1.100
[Peer]
PublicKey = <server-public-key>
Endpoint = 185.35.193.144:43123
AllowedIPs = 10.10.99.0/24, 192.168.1.0/24
PersistentKeepalive = 25
```
Пример для macOS:
```ini
[Interface]
Address = 10.10.99.3/32
PrivateKey = <macos-private-key>
DNS = 192.168.1.100
[Peer]
PublicKey = <server-public-key>
Endpoint = 185.35.193.144:43123
AllowedIPs = 10.10.99.0/24, 192.168.1.0/24
PersistentKeepalive = 25
```
> **Важно:** реальные ключи (`PrivateKey`, `PublicKey`) хранятся только в контейнере (`/etc/wireguard/*.key/.pub`) и **не попадают** в этот репозиторий. В примерах выше использовать плейсхолдеры и заменять их актуальными значениями при выдаче конфигов на устройства.
---
## Firewall и ограничения доступа к Vaultwarden (общая схема)
Идея ограничения доступа:
- **На роутере (192.168.1.1):**
- открыть только UDP-порт `43123`,
- пробросить его на `192.168.1.109:43123` (CT 109),
- остальные порты для CT 109 снаружи не открывать.
- **На Proxmox firewall (уровень ноды / CT 109):**
- разрешить входящий `UDP 43123` к CT 109,
- разрешить ESTABLISHED/RELATED,
- разрешить исходящий трафик из CT 109 в LAN (`192.168.1.0/24`) и к нужным внешним DNS (если потребуется).
- **На уровне NPM (CT 100) / Vaultwarden (CT 103):**
- создать proxy host `vault.katykhin.ru` → upstream `192.168.1.103:8280`,
- ограничить доступ к этому хосту **только из VPN** — либо по исходному адресу (подсеть WireGuard `10.10.99.0/24`, если используется маршрутизация без NAT), либо по IP сервера VPN (`192.168.1.109`, если используется NAT в CT 109),
- отключить доступ к Vaultwarden из LAN напрямую по домену (и при желании по IP).
Точная реализация правил на роутере и в NPM описывается в соответствующих документах (`router-netcraze-speedster`, `container-100` / NPM); здесь зафиксирована лишь роль контейнера 109 и параметры WireGuard.
---
## On-Demand для iOS/macOS
Для автоматического включения VPN **вне домашнего WiFi** используется профиль `.mobileconfig` с правилами On-Demand. Подробно: [Генерация .mobileconfig для WireGuard VPN (On-Demand)](../network/vpn-mobileconfig-wireguard.md).
- если подключен WiFi с SSID из списка (например `HomeWiFi`) → VPN **отключён**;
- во всех остальных случаях (другой WiFi, сотовые данные) → VPN **включается автоматически**.
**macOS:** профиль `wireguard-macos-ondemand.mobileconfig`. Перед установкой замени `HomeWiFi` на реальный SSID домашней сети (секция `OnDemandRules``SSIDMatch`). Установка: двойной клик по файлу → «Системные настройки» → «Профили» → установить. Туннель появится в приложении WireGuard.
**iOS:** профиль `wireguard-ios-ondemand.mobileconfig`. То же правило: замени `HomeWiFi` на SSID домашней сети. Установка: отправить файл на iPhone (AirDrop, почта, файлы) → открыть → «Установить» в предложенном профиле → при необходимости «Настройки» → «Основные» → «VPN и управление устройством» → установить профиль. Туннель «Local VPN (WireGuard)» появится в приложении WireGuard; включи один раз вручную, далее On-Demand будет управлять подключением.
Оба файла содержат приватные ключи и добавлены в `.gitignore` — в репозиторий не коммитить.
---
## Связь с другими документами
- [Архитектура и подключение](../architecture/architecture.md) — общее описание хостов, IP, доменов (контейнер 109 нужно добавить как исключение ID ↔ IP при необходимости).
- [Контейнер 100 (NPM)](container-100.md) — настройка proxy host `vault.katykhin.ru` и ограничение доступа только через VPN.
- [Контейнер 103 (Vaultwarden)](container-103.md) — сам сервис Vaultwarden и доступ по `192.168.1.103:8280` из LAN/VPN.
- [Роутер Netcraze Speedster](../network/router-netcraze-speedster.md) — проброс UDP 43123 и общие правила фаервола/маршрутизации.