vault backup: 2026-10-15 20:03:12
This commit is contained in:
Vendored
+7
-7
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"collapse-filter": false,
|
||||
"search": "",
|
||||
"search": "api",
|
||||
"showTags": true,
|
||||
"showAttachments": true,
|
||||
"hideUnresolved": true,
|
||||
@@ -9,14 +9,14 @@
|
||||
"colorGroups": [],
|
||||
"collapse-display": false,
|
||||
"showArrow": true,
|
||||
"textFadeMultiplier": 0,
|
||||
"nodeSizeMultiplier": 1.39824742268041,
|
||||
"lineSizeMultiplier": 1,
|
||||
"textFadeMultiplier": 0.2,
|
||||
"nodeSizeMultiplier": 1.82062647754137,
|
||||
"lineSizeMultiplier": 1.71471631205674,
|
||||
"collapse-forces": false,
|
||||
"centerStrength": 0.518713248970312,
|
||||
"repelStrength": 10,
|
||||
"centerStrength": 0.280901722391084,
|
||||
"repelStrength": 6.59067882472138,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 0.8476850695340034,
|
||||
"scale": 1.2273915140938336,
|
||||
"close": false
|
||||
}
|
||||
Vendored
+15
-30
@@ -4,39 +4,24 @@
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "6a223f6f51a2d245",
|
||||
"id": "07a826a4e91de77c",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "9d3abe0b002165bf",
|
||||
"id": "8ba21877fd5b84c6",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "HomeLab/LXC- Gitea.md",
|
||||
"file": "HomeLab/LXC - HomePage.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "LXC- Gitea"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "b3558acf9e721e10",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "HomeLab/LXC - npm_keenetic_setup.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "LXC - npm_keenetic_setup"
|
||||
"title": "LXC - HomePage"
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 1
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
@@ -70,7 +55,7 @@
|
||||
"state": {
|
||||
"type": "search",
|
||||
"state": {
|
||||
"query": "[\"tags\"]",
|
||||
"query": "",
|
||||
"matchingCase": false,
|
||||
"explainSearch": false,
|
||||
"collapseAll": false,
|
||||
@@ -203,10 +188,17 @@
|
||||
"obsidian-excalidraw-plugin:New drawing": false
|
||||
}
|
||||
},
|
||||
"active": "b3558acf9e721e10",
|
||||
"active": "8ba21877fd5b84c6",
|
||||
"lastOpenFiles": [
|
||||
"HomeLab/LXC - Nginx Proxy Manager.md",
|
||||
"Hermes/hermes_hindsight_lxc_guide.md",
|
||||
"VPN/amneziavpn-docker-guide.md",
|
||||
"VPN/amnezia-vpn-keenetic-kn1011.md",
|
||||
"VPN/Amnezia for Keenetic.md",
|
||||
"Hermes/hermes-desktop-connect-guide.md",
|
||||
"Hermes/Hermes Agent - Настройка.md",
|
||||
"HomeLab/LXC- Gitea.md",
|
||||
"HomeLab/LXC - npm_keenetic_setup.md",
|
||||
"HomeLab/LXC - Nginx Proxy Manager.md",
|
||||
"HomeLab/npm_keenetic_setup.md",
|
||||
"HomeLab/PVE - Description.md",
|
||||
"HomeLab/PVE - General - Description.md",
|
||||
@@ -216,7 +208,6 @@
|
||||
"HomeLab/Proxmox/Proxmox - settings.md",
|
||||
"HomeLab/Valtwarden.md",
|
||||
"HomeLab/Proxmox/Proxmox HA manual install.md",
|
||||
"HomeLab/LXC- Gitea.md",
|
||||
"HomeLab/LXC - PBS Proxmox Backup Server.md",
|
||||
"HomeLab/LXC - HomePage.md",
|
||||
"HomeLab/ssh config.md",
|
||||
@@ -225,15 +216,9 @@
|
||||
"HomeLab/Docker - qBittorent.md",
|
||||
"HomeLab/Docker - General.md",
|
||||
"HomeLab/wireshark.md",
|
||||
"HomeLab/VE - HAOS - HomeAssistant.md",
|
||||
"().md",
|
||||
"HomeLab/PVE Proxmox - Installation.md",
|
||||
"OMV - Guides",
|
||||
"README.md",
|
||||
"SBC - Hardware/Pasted image 20260901214038.png",
|
||||
"SBC - Hardware/Pasted image 20260517222623.png",
|
||||
"SBC - Hardware/Radxa E25.md",
|
||||
"Network/Settings.md",
|
||||
"SBC - Hardware",
|
||||
"Hermes/oled_cpu_mon.py",
|
||||
"Hermes",
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#polza #api
|
||||
Описание на Habr:
|
||||
|
||||
AI провайдер: polza.ai
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
# Настройка памяти Hindsight для ИИ-агента Hermes в LXC
|
||||
|
||||
Это руководство содержит инструкции по установке, конфигурированию и запуску долгосрочной памяти **Hindsight** (от Vectorize.io) для ИИ-агента **Hermes Agent** (от Nous Research) внутри изолированного контейнера LXC с использованием API-провайдера **Polza AI**.
|
||||
|
||||
---
|
||||
|
||||
## 1. Ресурсная сетка для LXC (Polza AI Оптимизация)
|
||||
|
||||
Так как инференс LLM и вычисление эмбеддингов полностью делегированы на сервера [Polza AI](https://polza.ai/), локальные требования к контейнеру минимальны:
|
||||
|
||||
* **Процессор (CPU):** 2 ядра (vCPU) — достаточно для работы PostgreSQL и маршрутизации запросов.
|
||||
* **Оперативная память (RAM):** 2 ГБ — около 1 ГБ займет ОС и Hermes, еще 1 ГБ зарезервирует PostgreSQL для кэширования векторных индексов.
|
||||
* **Дисковая подсистема (Storage):** 10–15 ГБ (желательно на NVMe/SSD для быстрого I/O при поиске по индексам `pgvector`).
|
||||
* **Сеть:** Обязателен исходящий доступ в интернет для выполнения API-запросов к эндпоинтам Polza AI.
|
||||
|
||||
---
|
||||
|
||||
## 2. Пошаговая установка в контейнере
|
||||
|
||||
Зайдите в консоль вашего LXC-контейнера и выполните следующие шаги:
|
||||
|
||||
```bash
|
||||
# 1. Обновление системы и установка зависимостей
|
||||
apt update && apt upgrade -y
|
||||
apt install -y python3 python3-pip postgresql postgresql-contrib git curl
|
||||
|
||||
# 2. Установка расширения pgvector для PostgreSQL
|
||||
# (Необходимо для хранения долгосрочной векторной памяти)
|
||||
apt install -y postgresql-15-pgvector || apt install -y postgresql-16-pgvector
|
||||
|
||||
# 3. Настройка базы данных
|
||||
su - postgres -c "psql -c "CREATE USER hindsight_user WITH PASSWORD 'secure_password_here';""
|
||||
su - postgres -c "psql -c "CREATE DATABASE hindsight_memory OWNER hindsight_user;""
|
||||
su - postgres -c "psql -d hindsight_memory -c "CREATE EXTENSION IF NOT EXISTS vector;""
|
||||
|
||||
# 4. Установка Hermes Agent и плагина Hindsight
|
||||
pip3 install hermes-agent-cli
|
||||
hermes plugins install hindsight
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Конфигурация (~/.hermes/hindsight/config.json)
|
||||
|
||||
Создайте или отредактируйте конфигурационный файл плагина. Замените `sk-polza-ВАШ_КЛЮЧ_ИЗ_КОНСОЛИ` на ваш реальный токен из личного кабинета Polza AI.
|
||||
|
||||
```json
|
||||
{
|
||||
"memory_enabled": false,
|
||||
"hindsight": {
|
||||
"mode": "local_embedded",
|
||||
"database": {
|
||||
"host": "127.0.0.1",
|
||||
"port": 5432,
|
||||
"user": "hindsight_user",
|
||||
"password": "secure_password_here",
|
||||
"dbname": "hindsight_memory"
|
||||
},
|
||||
"llm_provider": {
|
||||
"type": "openai_compatible",
|
||||
"base_url": "https://polza.ai/api/v1",
|
||||
"api_key": "sk-polza-ВАШ_КЛЮЧ_ИЗ_КОНСОЛИ",
|
||||
"model": "nousresearch/hermes-3-llama-3.1-70b"
|
||||
},
|
||||
"embedding_provider": {
|
||||
"type": "openai_compatible",
|
||||
"base_url": "https://polza.ai/api/v1",
|
||||
"api_key": "sk-polza-ВАШ_КЛЮЧ_ИЗ_КОНСОЛИ",
|
||||
"model": "openai/text-embedding-3-small"
|
||||
},
|
||||
"auto_recall": true,
|
||||
"auto_retain": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
*Отключение стандартной памяти:* Команда `hermes tools disable memory` предотвратит дублирование контекста и сэкономит входящие токены.
|
||||
|
||||
---
|
||||
|
||||
## 4. Настройка автозапуска через systemd
|
||||
|
||||
Чтобы демон памяти автоматически поднимался при перезапуске LXC-контейнера, создайте системную службу.
|
||||
|
||||
Создайте файл `/etc/systemd/system/hindsight-daemon.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Hindsight Memory Daemon for Hermes Agent
|
||||
After=postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
ExecStart=/usr/local/bin/hermes memory daemon start
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user-target
|
||||
```
|
||||
|
||||
Активируйте и запустите службу:
|
||||
```bash
|
||||
systemctl daemon-reload
|
||||
systemctl enable hindsight-daemon.service
|
||||
systemctl start hindsight-daemon.service
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Использование и команды ИИ-агента
|
||||
|
||||
При включенных параметрах `auto_recall` и `auto_retain` Hermes работает полностью автономно. Но вы можете управлять памятью и вручную в окне чата:
|
||||
|
||||
* **Ручное сохранение факта:**
|
||||
> *"Запомни, что тестовый сервер развернут на порту 8080 с конфигурацией дебага."*
|
||||
*(Hermes вызовет инструмент `hindsight_retain`)*
|
||||
|
||||
* **Извлечение контекста:**
|
||||
> *"На каком порту мы тестировали сервер?"*
|
||||
*(Hermes выполнит поиск через `hindsight_recall`)*
|
||||
|
||||
* **Синтез знаний (Рефлексия):**
|
||||
Периодически запускайте процесс консолидации памяти, чтобы объединить разрозненные факты и очистить базу от устаревшего "шума":
|
||||
```bash
|
||||
hermes memory reflect --force
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Логи и Диагностика в LXC
|
||||
|
||||
Если агент теряет контекст, проверьте следующие точки отказа внутри контейнера:
|
||||
|
||||
* **Статус демона памяти:** `systemctl status hindsight-daemon.service`
|
||||
* **Просмотр логов Hindsight:** `tail -f ~/.hermes/logs/hindsight-embed.log`
|
||||
* **Проверка подключения к PostgreSQL:** `psql -U hindsight_user -d hindsight_memory -h 127.0.0.1`
|
||||
* **Проверка доступности шлюза Polza AI:** `curl -I https://polza.ai/api/v1/models`
|
||||
@@ -14,6 +14,9 @@ https://github.com/homarr-labs/dashboard-icons
|
||||
|
||||
Настройки находятся в `/opt/homepage/config/`
|
||||
|
||||
PVE: token-id `homepage@pve!monitor`
|
||||
`0fe6ef73-380b-4f4e-a403-7ac07c4cd021`
|
||||
|
||||
#filesystem #linux
|
||||
Директория `/opt` в Linux, сокращение от *optional* - аналог `Programm Files` установка стороннего ПО.
|
||||
|
||||
|
||||
@@ -0,0 +1,406 @@
|
||||
# AmneziaVPN в Docker: полный гайд
|
||||
|
||||
**Цель:** поднять в Docker контейнере клиент AmneziaVPN (AmneziaWG 3.1), подключить его по пользовательскому `.conf` от Amnezia Premium и сделать его VPN-шлюзом для домашней сети.
|
||||
|
||||
**Автор:** Hermes Agent • Среда: LXC-контейнер (Docker 29.4.1, ядро Proxmox 6.17.13-2-pve)
|
||||
|
||||
---
|
||||
|
||||
## 1. Что потребуется
|
||||
|
||||
| Компонент | Значение |
|
||||
|-----------|----------|
|
||||
| Хост | Linux с Docker 20.10+ (тестировалось: LXC 29.4.1) |
|
||||
| `/dev/net/tun` | Должен существовать и быть открыт |
|
||||
| `ip_forward` | `1` |
|
||||
| `.conf` файл | Amnezia Premium / AmneziaWG 3.1 конфиг |
|
||||
| Версии | `amneziawg-go` v3.1.20260828, `amneziawg-tools` v3.1.20260812 |
|
||||
|
||||
Пример `.conf` (Amnezia Premium, конфиг 3.1):
|
||||
```ini
|
||||
[Interface]
|
||||
Address = 100.85.175.118/32
|
||||
DNS = 100.64.0.1, 8.8.4.4
|
||||
PrivateKey = fSdjHMi8tAzL2wbNxsylQW1FAIXdn2/ODPGWr569J/w=
|
||||
Jc = 5
|
||||
Jmin = 10
|
||||
Jmax = 80
|
||||
H1 = 1
|
||||
H2 = 2
|
||||
H3 = 3
|
||||
H4 = 4
|
||||
HeaderProtectionKey = 8H1SggRhZ8iT8ZYZlS/RPf6SItoxb8OeXX2rNwMgc3M=
|
||||
RekeyAfterTime = 100-120
|
||||
RekeyTimeout = 3-8
|
||||
RejectAfterTime = 150-180
|
||||
KeepaliveTimeout = 7-13
|
||||
MaxHandshakeAttempts = 15-20
|
||||
ContentPaddingAddition = 10-100
|
||||
[Peer]
|
||||
PublicKey = FfgUO6z0plGUntTW3T8fsFsZ250GcQZEKlCgj1fkRFc=
|
||||
PresharedKey = +Is1eWUUQ5UXYD8E7zigG32KaThcGC/YolOVS7LeDGU=
|
||||
AllowedIPs = 0.0.0.0/0, ::/0
|
||||
Endpoint = 78.17.149.78:8344
|
||||
PersistentKeepalive = 25-35
|
||||
```
|
||||
|
||||
> ⚠️ **НЕ** выкладывай `.conf` ни в чат, ни на сторонние сайты. Его приватный ключ — твой доступ. Файл копируется только на сервер.
|
||||
|
||||
---
|
||||
|
||||
## 2. Подготовка хоста
|
||||
|
||||
```bash
|
||||
# Проверить Tun-устройство и форвардинг
|
||||
ls -la /dev/net/tun
|
||||
cat /proc/sys/net/ipv4/ip_forward # должно быть 1
|
||||
|
||||
# Включить форвардинг (если 0)
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
|
||||
# Проверить Docker
|
||||
docker --version
|
||||
```
|
||||
|
||||
**На LXC (виртуальном контейнере Proxmox)** убедись, что:
|
||||
- `/dev/net/tun` существует (создаётся через настройки LXC)
|
||||
- `net.ipv4.ip_forward=1` установлен (в Proxmox: LXC → Options → Features)
|
||||
|
||||
---
|
||||
|
||||
## 3. Скачивание репозиториев
|
||||
> ⚠️ Сборку ведём из **локальных** копий репозиториев (COPY в Dockerfile), так как DNS внутри build-контейнера нестабилен.
|
||||
|
||||
```bash
|
||||
mkdir -p /root/awg-src
|
||||
cd /root/awg-src
|
||||
|
||||
# Правильный DNS на хосте LXC
|
||||
echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
||||
|
||||
git clone --depth 1 --branch v3.1.20260828 https://github.com/amnezia-vpn/amneziawg-go.git
|
||||
git clone --depth 1 --branch v3.1.20260812 https://github.com/amnezia-vpn/amneziawg-tools.git
|
||||
```
|
||||
|
||||
**Проверка тегов** (актуальные на момент сборки):
|
||||
```bash
|
||||
git ls-remote --tags https://github.com/amnezia-vpn/amneziawg-go.git | tail
|
||||
# v3.1.20260813, v3.1.20260814, v3.1.20260828
|
||||
git ls-remote --tags https://github.com/amnezia-vpn/amneziawg-tools.git | tail
|
||||
# v3.0.20260805, v3.1.20260812
|
||||
```
|
||||
|
||||
> Найдите **последний** тег v3.1.* — они выходят часто и содержат исправления DPI-обхода.
|
||||
|
||||
---
|
||||
|
||||
## 4. Директория сборки
|
||||
```bash
|
||||
mkdir -p /root/awg-builder
|
||||
cp -r /root/awg-src/amneziawg-go /root/awg-builder/
|
||||
cp -r /root/awg-src/amneziawg-tools /root/awg-builder/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Dockerfile
|
||||
**`/root/awg-builder/Dockerfile`**
|
||||
```dockerfile
|
||||
# syntax=docker/dockerfile:1
|
||||
|
||||
FROM golang:alpine AS go-build
|
||||
|
||||
RUN apk add --no-cache make gcc musl-dev linux-headers
|
||||
|
||||
COPY amneziawg-go /src/amneziawg-go
|
||||
RUN cd /src/amneziawg-go && make && cp amneziawg-go /go/bin/
|
||||
|
||||
COPY amneziawg-tools /src/amneziawg-tools
|
||||
RUN cd /src/amneziawg-tools/src && make && cp wg /go/bin/awg
|
||||
|
||||
FROM alpine:3.21
|
||||
|
||||
RUN apk add --no-cache iptables ip6tables iproute2 bash openresolv
|
||||
|
||||
COPY --from=go-build /go/bin/amneziawg-go /usr/bin/
|
||||
COPY --from=go-build /go/bin/awg /usr/bin/
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
```
|
||||
|
||||
> **Почему `cp wg /go/bin/awg`**: в `amneziawg-tools` бинарь надёжнее назвать `awg`. Это клиентская утилита управления интерфейсом.
|
||||
|
||||
**Healthcheck** (необязателен): добавить в Dockerfile ```HEALTHCHECK``` — можно пропустить, статус смотрим через `awg show`.
|
||||
|
||||
---
|
||||
|
||||
## 6. entrypoint.sh
|
||||
Скрипт: поднимает интерфейс, загружает конфиг (с фолбэком на минимальный), настраивает policy routing и NAT.
|
||||
|
||||
**`/root/awg-builder/entrypoint.sh`**
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
CONFIG_DIR=/config
|
||||
|
||||
for f in "${CONFIG_DIR}"/*.conf; do
|
||||
[ -f "$f" ] || continue
|
||||
IFACE=$(basename "$f" .conf)
|
||||
echo "Starting AmneziaWG interface: ${IFACE}"
|
||||
|
||||
modprobe amneziawg 2>/dev/null || true
|
||||
if ! ip link show "${IFACE}" 2>/dev/null | grep -q UP; then
|
||||
ip link add "${IFACE}" type amneziawg 2>/dev/null || {
|
||||
echo "[*] Using userspace amneziawg-go"
|
||||
amneziawg-go "${IFACE}" 2>/dev/null || true
|
||||
sleep 1
|
||||
}
|
||||
fi
|
||||
|
||||
TMPF=$(mktemp)
|
||||
grep -v -E '^(Address|DNS)' "$f" > "$TMPF"
|
||||
|
||||
if ! awg setconf "${IFACE}" "$TMPF" 2>/dev/null; then
|
||||
echo "[!] Trying minimal config"
|
||||
{
|
||||
echo "[Interface]"
|
||||
grep -E '^PrivateKey' "$f"
|
||||
echo "ListenPort = 51820"
|
||||
echo ""
|
||||
echo "[Peer]"
|
||||
grep -E '^(PublicKey|PresharedKey|AllowedIPs|Endpoint|PersistentKeepalive)' "$f"
|
||||
} | awg setconf "${IFACE}" /dev/stdin 2>/dev/null || {
|
||||
echo "[!] FATAL: cannot parse config"
|
||||
rm -f "$TMPF"
|
||||
continue
|
||||
}
|
||||
fi
|
||||
rm -f "$TMPF"
|
||||
|
||||
IP=$(grep ^Address "$f" | head -1 | cut -d= -f2 | tr -d ' ' | cut -d, -f1)
|
||||
[ -n "$IP" ] && ip addr add "$IP" dev "${IFACE}" 2>/dev/null || true
|
||||
ip link set "${IFACE}" up
|
||||
echo "[*] ${IFACE} UP: ${IP}"
|
||||
done
|
||||
|
||||
# --- Policy routing: только forwarded LAN-трафик через VPN ---
|
||||
mkdir -p /etc/iproute2
|
||||
if ! grep -q "awg-vpn" /etc/iproute2/rt_tables 2>/dev/null; then
|
||||
echo "100 awg-vpn" >> /etc/iproute2/rt_tables 2>/dev/null || true
|
||||
fi
|
||||
|
||||
ip route add 0.0.0.0/0 dev awg0 table 100 2>/dev/null || true
|
||||
|
||||
# Пометить forwarded LAN-трафик (не на LAN) меткой 100
|
||||
iptables -t mangle -C PREROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MARK --set-mark 100 2>/dev/null || \
|
||||
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MARK --set-mark 100 2>/dev/null || true
|
||||
|
||||
# Пакеты с меткой 100 → таблица awg-vpn (через awg0)
|
||||
ip rule add fwmark 100 lookup 100 priority 5000 2>/dev/null || true
|
||||
|
||||
# NAT для LAN через туннель
|
||||
iptables -t nat -C POSTROUTING -s 192.168.1.0/24 -o awg0 -j MASQUERADE 2>/dev/null || \
|
||||
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o awg0 -j MASQUERADE 2>/dev/null || true
|
||||
|
||||
echo 1 > /proc/sys/net/ipv4/ip_forward 2>/dev/null || true
|
||||
|
||||
echo "[*] AmneziaWG client running"
|
||||
awg show 2>/dev/null || true
|
||||
|
||||
sleep infinity
|
||||
```
|
||||
|
||||
> **Как работает policy routing**:
|
||||
> - Локальный (исходящий) трафик **самого LXC** (SSH и т.д.) → идёт напрямую через `eth0`
|
||||
> - Только **forwarded** трафик из LAN → помечается меткой → направляется в таблицу `awg-vpn` → уходит через `awg0`
|
||||
> - Это сохраняет доступ к управлению LXC, не ломая VPN-шлюз
|
||||
|
||||
---
|
||||
|
||||
## 7. Редактирование сети под свою подсеть
|
||||
|
||||
В скрипте выше я использовал `192.168.1.0/24` — это **основной LAN сегмент**, который пойдёт через VPN.
|
||||
|
||||
**Если нужна отдельная VPN-подсеть** (например `192.168.2.0/24`), замени в двух местах:
|
||||
- `iptables -t mangle ... -s 192.168.1.0/24` → `-s 192.168.2.0/24`
|
||||
- `iptables -t nat ... -s 192.168.1.0/24 ... -o awg0` → `-s 192.168.2.0/24`
|
||||
|
||||
Подробнее про отдельную подсеть см. раздел «Расширенный сценарий» ниже.
|
||||
|
||||
---
|
||||
|
||||
## 8. Запуск
|
||||
|
||||
1. **Создай директорию конфига** и положи туда `.conf`:
|
||||
```bash
|
||||
mkdir -p /root/awg-config
|
||||
cp /путь/к/de.conf /root/awg-config/awg0.conf
|
||||
# ↑ имя файла = имя интерфейса (awg0)
|
||||
```
|
||||
|
||||
2. **Собери образ:**
|
||||
```bash
|
||||
cd /root/awg-builder
|
||||
docker build -t amneziawg-client:latest .
|
||||
```
|
||||
|
||||
3. **Запусти контейнер:**
|
||||
```bash
|
||||
docker run -dit \
|
||||
--name=amneziawg-client \
|
||||
-v /root/awg-config:/config \
|
||||
--network=host \
|
||||
--device=/dev/net/tun:/dev/net/tun \
|
||||
--cap-add=NET_ADMIN \
|
||||
--cap-add=SYS_MODULE \
|
||||
--restart always \
|
||||
amneziawg-client:latest
|
||||
```
|
||||
|
||||
4. **Проверь:**
|
||||
```bash
|
||||
docker ps --filter name=amneziawg-client # Up, restart always
|
||||
docker logs amneziawg-client # интерфейс UP, handshake
|
||||
docker exec amneziawg-client awg show # самый наглядный статус
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. Проверка работоспособности
|
||||
|
||||
```bash
|
||||
# Статус интерфейса и handshake (главное)
|
||||
docker exec amneziawg-client awg show
|
||||
# Должно быть: "latest handshake: N seconds ago" и ненулевые transfer
|
||||
|
||||
# Внешний IP с самого LXC (через awg0):
|
||||
curl -s ifconfig.me
|
||||
# Это будет IP VPN-провайдера
|
||||
|
||||
# Статус NAT/маршрутизации
|
||||
docker exec amneziawg-client iptables -t mangle -L PREROUTING -n -v
|
||||
docker exec amneziawg-client iptables -t nat -L POSTROUTING -n -v
|
||||
|
||||
# Проверка forwarded трафика из LAN:
|
||||
# с устройства в 192.168.1.0/24, у которого шлюз = 192.168.1.147
|
||||
curl -s ifconfig.me
|
||||
# Тоже IP VPN-провайдера
|
||||
```
|
||||
|
||||
**Полезный признак нормальной работы:**
|
||||
```
|
||||
peer: FfgUO6z0plGUntTW3T8fsFsZ250GcQZEKlCgj1fkRFc=
|
||||
latest handshake: 42 seconds ago ← периодически обновляется
|
||||
transfer: 1.24 MiB received, 3.2 MiB sent ← данные идут
|
||||
```
|
||||
|
||||
Если `latest handshake` отсутствует и `received = 0` — пакеты не доходят до сервера. Причины: файрвол роутера блокирует UDP, неверный Endpoint в `.conf`, фильтрация DPI.
|
||||
|
||||
---
|
||||
|
||||
## 10. Включение шлюза для LAN
|
||||
|
||||
Когда туннель поднят, чтобы устройства LAN пошли через VPN, на **роутере** меняют шлюз по умолчанию или статический маршрут:
|
||||
|
||||
**Keenetic (веб-интерфейс):**
|
||||
1. `Интернет-центр → Маршрутизация → Статические маршруты`
|
||||
2. Добавить:
|
||||
- Сеть назначения: `0.0.0.0`
|
||||
- Маска: `0.0.0.0`
|
||||
- Шлюз: `192.168.1.147`
|
||||
- (или конкретная VPN-подсеть, если не вся LAN)
|
||||
|
||||
**На телефоне (временная проверка):**
|
||||
- Wi-Fi → IP-настройки → Статический → Маршрутизатор = `192.168.1.147`
|
||||
|
||||
---
|
||||
|
||||
## 11. Питфоллы и их решение
|
||||
|
||||
| Проблема | Причина | Решение |
|
||||
|----------|---------|---------|
|
||||
| `Unknown device type. Falling back to userspace` | Нет модуля ядра amneziawg | Нормально; userspace (amneziawg-go) работает |
|
||||
| `Line unrecognized: S3=145` | Старая версия `awg`, не знает v3.1 параметры | Собрать свежую amneziawg-tools v3.1.x (п.3) |
|
||||
| `Address=/DNS=` line error | `awg setconf` не понимает `wg-quick` директивы | Убрать `Address`/`DNS` из `setconf` (см. entrypoint) |
|
||||
| `/proc/sys/...ip_forward: Read-only` | Ограничение LXC / контейнера | Включить заранее на хосте (п.2) |
|
||||
| Диск забит (`no space left on device`) | Сборки и образы жрут место | `docker system prune`, расширить диск |
|
||||
| `gcc not found` при сборке tools | Нет компилятора | `apk add gcc musl-dev` в Dockerfile |
|
||||
| `linux/types.h` нет | Нужны linux-headers | `apk add linux-headers` |
|
||||
| `cockpit`/быстрые списки GitHub таймаут | DNS внутри build-контейнера | Клонировать на хосте, `COPY` в Dockerfile |
|
||||
|
||||
---
|
||||
|
||||
## 12. Расширенный сценарий: отдельная VPN-подсеть (вариант B)
|
||||
|
||||
Нужно, чтобы не вся LAN уходила в VPN, а только отдельные устройства в своей подсети (`192.168.2.0/24`).
|
||||
|
||||
**На LXC добавить alias-IP шлюза:**
|
||||
```bash
|
||||
ip addr add 192.168.2.1/32 dev eth0
|
||||
# persistence: netplan / LXC interface
|
||||
```
|
||||
|
||||
**entrypoint.sh — расширить маршрутизацию:**
|
||||
```bash
|
||||
# Вторая подсеть → тоже через VPN
|
||||
iptables -t mangle -A PREROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -j MARK --set-mark 100
|
||||
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o awg0 -j MASQUERADE
|
||||
```
|
||||
|
||||
**DHCP сервер для 192.168.2.0/24** (dnsmasq на LXC или Docker):
|
||||
```
|
||||
interface=eth0
|
||||
dhcp-range=192.168.2.100,192.168.2.200,255.255.255.0,24h
|
||||
dhcp-option=3,192.168.2.1
|
||||
dhcp-option=6,100.64.0.1,8.8.8.8
|
||||
```
|
||||
|
||||
**Keenetic — статический маршрут:**
|
||||
- Сеть: `192.168.2.0`, маска `255.255.255.0`, шлюз `192.168.1.147`
|
||||
|
||||
**Keenetic — гостевая сеть с другой подсетью:**
|
||||
- Создать вторую SSID, IP `192.168.2.1/24`, DHCP `192.168.2.x`
|
||||
|
||||
---
|
||||
|
||||
## 13. Обновление версий AWG
|
||||
|
||||
Поскольку AmneziaWG 3.x развивается быстро (новые теги), при проблемах с DPI-блокировками:
|
||||
|
||||
```bash
|
||||
# Узнать свежие теги
|
||||
git ls-remote --tags https://github.com/amnezia-vpn/amneziawg-go.git | tail
|
||||
git ls-remote --tags https://github.com/amnezia-vpn/amneziawg-tools.git | tail
|
||||
|
||||
# Пересобрать из свежих копий
|
||||
cd /root/awg-src/amneziawg-go && git fetch --tags && git checkout v3.1.XXXXXXX
|
||||
cd /root/awg-src/amneziawg-tools && git fetch --tags && git checkout v3.1.XXXXXXX
|
||||
cp -r /root/awg-src/amneziawg-*/* /root/awg-builder/
|
||||
docker build -t amneziawg-client:latest /root/awg-builder/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 14. Безопасность и данные
|
||||
|
||||
- **Приватный ключ** в `.conf` не попадает в логи/память ассистента — только в файл на сервере.
|
||||
- Не выкладывай `.conf` в чат, репозитории, скриншоты.
|
||||
- `.conf` читается из `/root/awg-config/awg0.conf` только контейнером.
|
||||
- Права: `chmod 600 /root/awg-config/awg0.conf`.
|
||||
|
||||
---
|
||||
|
||||
## Итоговая структура файлов
|
||||
|
||||
```
|
||||
/root/awg-config/awg0.conf ← твой .conf (private)
|
||||
/root/awg-builder/Dockerfile
|
||||
/root/awg-builder/entrypoint.sh
|
||||
/root/awg-builder/amneziawg-go/ ← исходники (3.1.20260828)
|
||||
/root/awg-builder/amneziawg-tools/ ← исходники (3.1.20260812)
|
||||
/root/awg-src/ ← свежие клоны (для апдейтов)
|
||||
```
|
||||
|
||||
**Контейнер:** `amneziawg-client` = полностью автономный AWG-шлюз, ставится как `--restart always`, не зависит от остальных Docker-сервисов.
|
||||
Reference in New Issue
Block a user