commit 6b74cf61dfb320f3da4c3a4c77897878c2245a5d Author: Maxim Date: Tue Jul 7 11:37:23 2026 +0300 Первые наброски конфигураций WireGuard + udp2raw - Конфиги сервера (Ubuntu) и клиента (Raspberry Pi 4): wg0.conf, systemd-сервисы udp2raw, nftables - README с инструкцией по развёртыванию и генерации ключей - .gitignore: исключены бинарный архив udp2raw и генерируемые *.key - .gitattributes: LF для всех Linux-конфигов (.conf/.service/.sh) diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2d16f46 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +# Нормализация переводов строк. +# По умолчанию Git сам определяет текстовые файлы и хранит их с LF. +* text=auto eol=lf + +# Конфигурации Linux (WireGuard, systemd, nftables) должны быть строго с LF, +# иначе на целевом хосте сервисы могут не подняться. +*.conf text eol=lf +*.service text eol=lf +*.sh text eol=lf +Makefile text eol=lf +*.md text eol=lf + +# Бинарные файлы — без нормализации. +*.tar.gz binary +*.gz binary +*.png binary +*.jpg binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9d86240 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# --- Секреты и ключи (никогда не коммитим) --- +*.key +*_private.key +*_public.key +*.pem + +# --- Бинарные архивы / скачанные релизы udp2raw --- +udp2raw_binaries.tar.gz +udp2raw_* +!udp2raw-*.service + +# --- Локальные / персональные конфиги (перед деплоем копируются вручную) --- +*.local +*.local.conf +secrets.env +.env + +# --- ОС --- +# Windows +Thumbs.db +Desktop.ini +$RECYCLE.BIN/ +# macOS +.DS_Store +# Linux +*~ + +# --- Редакторы --- +.vscode/ +.idea/ +*.swp +*.swo +*.bak diff --git a/README.md b/README.md new file mode 100644 index 0000000..44404c8 --- /dev/null +++ b/README.md @@ -0,0 +1,148 @@ +Файл документации (README.md) +# Схема WireGuard + udp2raw + +Данный проект содержит готовые конфигурации для развертывания отказоустойчивого VPN-туннеля между **Удаленным сервером (Ubuntu)** и **Raspberry Pi 4**. + +Решение маскирует UDP-трафик WireGuard под стандартные TCP-пакеты (рукопожатие HTTPS на порт 443), что позволяет успешно обходить ограничения провайдеров, блокирующих или урезающих UDP-протокол на интерфейсе `usbnet`. + +--- + +## Аутентификационные данные проекта + +Для развертывания используются предварительно сгенерированные и проверенные ключи: + +* **Сервер (`95.174.102.77`):** + * Public Key: `dVIwnwxkjan/K278vzhOjp5A79N98j0O1zsYqT24qzs=` + * Private Key: `KMcPBI6LAY/NC1zFNYopsvNXqQ8w8ssluDj4yOh3skk=` +* **Клиент (Raspberry Pi 4):** + * Public Key: `WWFhoYfIgIhGOsvdJ/F9eWx7hPksrV6riiqo5lFPExI=` + * Private Key: `eKiGDY62/9pgFrwzoNIb7URRLPgEHC1W7zHwIIDYQVw=` + +> **Внимание:** Перед запуском обязательно измените значение `"MY_CONFIDENTIAL_PASS"` в аргументе `-k` системных сервисов `udp2raw` на сервере и клиенте на ваш собственный секретный пароль. + +Проверка соответствия ключей: + +``` + echo "--- SERVER PUBLIC KEY ---" && sudo cat server_public.key + echo "--- SERVER PRIVATE KEY ---" && sudo cat server_private.key +``` + +--- + +## Подготовка и генерация ключей + +Перед началом настройки зайдите на любое устройство и сгенерируйте две пары ключей (для сервера и для клиента): + +```bash +# Ключи Сервера +wg genkey | tee server_private.key | wg pubkey > server_public.key + +# Ключи Клиента (Raspberry Pi) +wg genkey | tee client_private.key | wg pubkey > client_public.key +``` + +Важно: Замените плейсхолдеры _KEY_HERE во всех файлах конфигурации на сгенерированные строки. Также замените "SUPER_SECRET_PASSWORD" в сервисах udp2raw на ваш собственный секретный общий пароль. + +Инструкция по развертыванию на СЕРВЕРЕ (Ubuntu) + + +Установите WireGuard: + +```Bash +sudo apt update && sudo apt install wireguard -y +``` + +Установите udp2raw: +Скачайте бинарный файл udp2raw_amd64 со страницы релизов проекта wangyu/udp2raw. + +```Bash +sudo wget [https://github.com/wangyu/udp2raw/releases/download/20230206.0/udp2raw_binaries.tar.gz](https://github.com/wangyu/udp2raw/releases/download/20230206.0/udp2raw_binaries.tar.gz) +tar -xvf udp2raw_binaries.tar.gz +sudo cp udp2raw_amd64 /usr/local/bin/udp2raw +sudo chmod +x /usr/local/bin/udp2raw +``` + +Копирование конфигураций: + +Перенесите файл server/wg0.conf в папку /etc/wireguard/wg0.conf. + +Перенесите файл server/udp2raw-server.service в папку /etc/systemd/system/udp2raw-server.service. + +Запуск сервисов: + +```Bash +sudo systemctl daemon-reload +sudo systemctl enable --now udp2raw-server +sudo systemctl enable --now wg-quick@wg0 +``` +Инструкция по развертыванию на КЛИЕНТЕ (Raspberry Pi 4) +Установите WireGuard: + +```Bash +sudo apt update && sudo apt install wireguard -y +``` + +Установите udp2raw (Архитектура ARM64): +```Bash +# Используйте бинарник udp2raw_arm64 из того же архива релизов +sudo cp udp2raw_arm64 /usr/local/bin/udp2raw +sudo chmod +x /usr/local/bin/udp2raw +``` +Настройка межсетевого экрана (nftables): +Откройте ваш рабочий конфиг /etc/nftables.conf и интегрируйте в него правила из файла client/nftables.conf.append. +Примените изменения: + +```Bash +sudo nft -f /etc/nftables.conf +``` +Копирование конфигураций: + +Перенесите файл client/wg0.conf в папку /etc/wireguard/wg0.conf. + +Перенесите файл client/udp2raw-client.service в папку /etc/systemd/system/udp2raw-client.service. + +Запуск сервисов: + +```Bash +sudo systemctl daemon-reload +sudo systemctl enable --now udp2raw-client +sudo systemctl enable --now wg-quick@wg0 +``` + +--- + +## Документация релиза и файлов udp2rawАктуальная ссылка для скачивания: +https://github.com/wangyu-/udp2raw/releases/download/20230206.0/udp2raw_binaries.tar.gz + +Версия (из version.txt): 20230206.0 +Спецификация распакованных файлов +Файл Назначение и Архитектура Куда устанавливаем +udp2raw_amd64 Стандартная 64-битная архитектура x86. Удаленный Сервер (Ubuntu) +udp2raw_amd64_hw_aes 64-битная x86 с аппаратным ускорением AES (если процессор сервера поддерживает). Альтернатива для сервера +udp2raw_arm 32-битная архитектура ARM (подходит для старых Raspberry Pi или 32-битных ОС). Raspberry Pi 4 (если ОС 32-bit) +udp2raw_arm_asm_aes ARM архитектура с ускорением AES на ассемблере. Raspberry Pi 4 (Оптимально) +udp2raw_x86 / _x86_asm_aes Старые 32-битные процессоры Intel/AMD. Не используется +udp2raw_mips24kc_... Архитектуры для домашних роутеров (OpenWrt). Не используется +--- + + +Диагностика и проверка статуса +В случае проблем проверяйте работу цепочки поочередно: + +Проверка TCP-туннеля (udp2raw): + +На клиенте: sudo systemctl status udp2raw-client + +На сервере: sudo systemctl status udp2raw-server + +В логах должно быть состояние [ready] и успешные хэндшейки. + +Проверка WireGuard туннеля: + +Выполните команду: sudo wg show + +Должна появиться строчка latest handshake: ... секунд назад и идти обмен данными. + +Проверка пинга: + +С малинки: ping 10.66.66.1 \ No newline at end of file diff --git a/client/nftables.conf b/client/nftables.conf new file mode 100644 index 0000000..df2fd8c --- /dev/null +++ b/client/nftables.conf @@ -0,0 +1,53 @@ +# RASPBERRY PI 4: /etc/nftables.conf + +table ip nat { + chain postrouting { + type nat hook postrouting priority srcnat; policy accept; + ip saddr 192.168.77.0/24 oifname "usbnet" masquerade + + ip saddr 192.168.77.0/24 oifname "wg0" masquerade + } +} +table inet filter { + chain input { + type filter hook input priority filter; policy drop; + ct state established,related accept + iifname "lo" accept + ip protocol icmp accept + ip6 nexthdr ipv6-icmp accept + tcp dport 22 accept + iifname "wlan0" udp dport { 67, 68 } accept + iifname "wlan0" udp dport 53 accept + tcp dport 8080 accept + + iifname "wg0" accept + } + + chain forward { + type filter hook forward priority filter; policy drop; + iifname "wlan0" oifname "usbnet" accept + iifname "usbnet" oifname "wlan0" ct state established,related accept + + iifname "wlan0" oifname "wg0" accept + iifname "wg0" oifname "wlan0" ct state established,related accept + } + + chain output { + type filter hook output priority filter; policy accept; + } +} +table ip nm-shared-wlan0 { + chain nat_postrouting { + type nat hook postrouting priority srcnat; policy accept; + ip saddr 192.168.77.0/24 ip daddr != 192.168.77.0/24 masquerade + } + + chain filter_forward { + type filter hook forward priority filter; policy accept; + ip daddr 192.168.77.0/24 oifname "wlan0" ct state { established, related } accept + ip saddr 192.168.77.0/24 iifname "wlan0" accept + iifname "wlan0" oifname "wlan0" accept + iifname "wlan0" reject + oifname "wlan0" reject + } +} \ No newline at end of file diff --git a/client/udp2raw-client.service b/client/udp2raw-client.service new file mode 100644 index 0000000..943a1a9 --- /dev/null +++ b/client/udp2raw-client.service @@ -0,0 +1,15 @@ +[Unit] +Description=udp2raw Client (FakeTCP) +After=network.target + +[Service] +Type=simple +User=root +# Слушает локальный UDP-порт 51821 и транслирует в TCP на внешний IP сервера 95.174.102.77:443 +# ВАЖНО: Пароль в параметре -k должен строго совпадать с паролем на сервере! +ExecStart=/usr/local/bin/udp2raw -c -l 127.0.0.1:51821 -r 95.174.102.77:443 -k "MY_CONFIDENTIAL_PASS" --raw-mode faketcp -a +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/client/wg0.conf b/client/wg0.conf new file mode 100644 index 0000000..1a1f2a8 --- /dev/null +++ b/client/wg0.conf @@ -0,0 +1,18 @@ +# RASPBERRY PI 4: + +[Interface] +Address = 10.66.66.2/24 +# Приватный ключ Raspberry Pi (из файла client_private.key) +PrivateKey = eKiGDY62/9pgFrwzoNIb7URRLPgEHC1W7zHwIIDYQVw= +# Уменьшенный MTU для компенсации оверхеда фейковых заголовков TCP +MTU = 1200 + +[Peer] +# Публичный ключ Сервера (из файла server_public.key) +PublicKey = dVIwnwxkjan/K278vzhOjp5A79N98j0O1zsYqT24qzs= +# Стучимся в локальный порт udp2raw, запущенный прямо на Малинке +Endpoint = 127.0.0.1:51821 +# Маршрутизируем абсолютно весь трафик через VPN туннель +AllowedIPs = 0.0.0.0/0 +# Пакет удержания сессии через NAT провайдера +PersistentKeepalive = 25 \ No newline at end of file diff --git a/server/udp2raw-server.service b/server/udp2raw-server.service new file mode 100644 index 0000000..24e2740 --- /dev/null +++ b/server/udp2raw-server.service @@ -0,0 +1,15 @@ +[Unit] +Description=udp2raw Server (FakeTCP) +After=network.target + +[Service] +Type=simple +User=root +# Слушает внешние TCP подключения на порту 443 и перенаправляет в локальный WireGuard +# ВАЖНО: Замените "MY_CONFIDENTIAL_PASS" на ваш секретный пароль для udp2raw +ExecStart=/usr/local/bin/udp2raw -s -l 0.0.0.0:443 -r 127.0.0.1:51820 -k "MY_CONFIDENTIAL_PASS" --raw-mode faketcp -a +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/server/wg0.conf b/server/wg0.conf new file mode 100644 index 0000000..07e8ce2 --- /dev/null +++ b/server/wg0.conf @@ -0,0 +1,16 @@ + + +[Interface] +Address = 10.66.66.1/24 +ListenPort = 51820 +# Приватный ключ Сервера (из файла server_private.key) +PrivateKey = KMcPBI6LAY/NC1zFNYopsvNXqQ8w8ssluDj4yOh3skk= + +# Автоматический NAT для выхода клиентов в интернет через основной интерфейс enp2s0 +PostUp = nft add table ip wg_nat; nft add chain ip wg_nat post { type nat hook postrouting priority srcnat\; policy accept\; }; nft add rule ip wg_nat post oifname "enp2s0" masquerade +PostDown = nft delete table ip wg_nat + +[Peer] +# Публичный ключ Raspberry Pi (из файла client_public.key) +PublicKey = WWFhoYfIgIhGOsvdJ/F9eWx7hPksrV6riiqo5lFPExI= +AllowedIPs = 10.66.66.2/32 \ No newline at end of file