From ee031b09dd0d840a1c04ecfe7d1bc89f7f5b2cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=91=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=80=D0=B5=D0=B2?= Date: Sun, 26 Apr 2026 17:06:12 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B3=D0=BB=D1=8F=D0=B4=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20(=D1=81=D1=85=D0=B5=D0=BC=D1=8B=20+=20=D1=81=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D1=88=D0=BE=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- README.md | 4 +++ docs/dns-routes-test.png | Bin 0 -> 58717 bytes docs/steps.svg | 56 +++++++++++++++++++++++++++++++ docs/tunnel-diagram.svg | 69 +++++++++++++++++++++++++++++++++++++++ tunnel/README.md | 2 ++ 5 files changed, 131 insertions(+) create mode 100644 docs/dns-routes-test.png create mode 100644 docs/steps.svg create mode 100644 docs/tunnel-diagram.svg diff --git a/README.md b/README.md index 3d27650..e597eaa 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ ![Интерфейс](docs/ui.png) +![Схема туннеля (через VPS)](docs/tunnel-diagram.svg) + --- ## Самое главное (чтобы было безопасно) @@ -41,6 +43,8 @@ curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/ #### 2 команды “с нуля” (самый простой путь) +![2 шага установки (VPS → роутер)](docs/steps.svg) + **Команда 1 — на VPS (Ubuntu):** поставить туннель и сразу добавить роутер. ```sh diff --git a/docs/dns-routes-test.png b/docs/dns-routes-test.png new file mode 100644 index 0000000000000000000000000000000000000000..18d74c9cd4b2593f3b63ec633e59fb391527a73d GIT binary patch literal 58717 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 + + + + + + + + + + Установка «серый IP через VPS» — всего 2 шага + Выполняете одну команду на VPS, получаете блок — вставляете его на роутере. + + + + + Шаг 1 (на VPS) + Ставим туннель и добавляем роутер: + + + curl -fsSL https://raw.githubusercontent.com/ + andrey271192/keenetic_ssh-web/main/setup-vps.sh + | sudo bash -s -- add home --dnat 777 + + Результат: VPS печатает блок export ... для роутера. + + + + + Шаг 2 (на роутере) + Вставляем блок, который выдал VPS: + + + export VPS_ENDPOINT=... + export VPS_PUBKEY='...' + export CLIENT_IP=10.99.0.X + export DNAT_PORTS='777' + curl -fsSL .../tunnel-install.sh | sh + + Готово: открываете http://10.99.0.X:2001 + + + diff --git a/docs/tunnel-diagram.svg b/docs/tunnel-diagram.svg new file mode 100644 index 0000000..4b46c6d --- /dev/null +++ b/docs/tunnel-diagram.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + Схема работы (серый IP → доступ через VPS) + Роутер сам подключается к VPS по WireGuard, и VPS видит роутер как «локальный» IP 10.99.0.X. + + + + Ваш ПК / телефон + Открываете панель: + http://10.99.0.X:2001 + (если туннель включён) + Или дома в LAN: + http://192.168.88.1:2001 + + + + VPS (белый IP) + WireGuard сервер: + wg0 10.99.0.1 + Порт: + UDP 51820 + Проверка: + ping 10.99.0.X + + + + Роутер Keenetic (Entware) + WireGuard клиент: + wg0 10.99.0.X + + + + keenetic_ssh-web :2001 + + + + SSH :22 + + + + + + WireGuard туннель + 10.99.0.0/24 + diff --git a/tunnel/README.md b/tunnel/README.md index d5a0a3e..e0e11c1 100644 --- a/tunnel/README.md +++ b/tunnel/README.md @@ -9,6 +9,8 @@ …и т. д. ``` +![Схема (коротко)](../docs/tunnel-diagram.svg) + UDP `51820`, подсеть `10.99.0.0/24`. Параметры можно поменять через ENV. ---