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

10 KiB
Raw Blame History

Контейнер 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.150pct 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):

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:

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:

[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, чтобы не настраивать статические маршруты на роутере.

Запуск и автозапуск

wg-quick up wg0          # ручной запуск
wg show                  # проверить состояние

systemctl enable wg-quick@wg0   # автозапуск при старте CT
systemctl start wg-quick@wg0

Проверка интерфейса:

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.


Конфиги клиентов (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:

[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:

[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).

  • если подключен WiFi с SSID из списка (например HomeWiFi) → VPN отключён;
  • во всех остальных случаях (другой WiFi, сотовые данные) → VPN включается автоматически.

macOS: профиль wireguard-macos-ondemand.mobileconfig. Перед установкой замени HomeWiFi на реальный SSID домашней сети (секция OnDemandRulesSSIDMatch). Установка: двойной клик по файлу → «Системные настройки» → «Профили» → установить. Туннель появится в приложении WireGuard.

iOS: профиль wireguard-ios-ondemand.mobileconfig. То же правило: замени HomeWiFi на SSID домашней сети. Установка: отправить файл на iPhone (AirDrop, почта, файлы) → открыть → «Установить» в предложенном профиле → при необходимости «Настройки» → «Основные» → «VPN и управление устройством» → установить профиль. Туннель «Local VPN (WireGuard)» появится в приложении WireGuard; включи один раз вручную, далее On-Demand будет управлять подключением.

Оба файла содержат приватные ключи и добавлены в .gitignore — в репозиторий не коммитить.


Связь с другими документами