Первые наброски конфигураций WireGuard + udp2raw
- Конфиги сервера (Ubuntu) и клиента (Raspberry Pi 4): wg0.conf, systemd-сервисы udp2raw, nftables - README с инструкцией по развёртыванию и генерации ключей - .gitignore: исключены бинарный архив udp2raw и генерируемые *.key - .gitattributes: LF для всех Linux-конфигов (.conf/.service/.sh)
This commit is contained in:
17
.gitattributes
vendored
Normal file
17
.gitattributes
vendored
Normal file
@@ -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
|
||||
33
.gitignore
vendored
Normal file
33
.gitignore
vendored
Normal file
@@ -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
|
||||
148
README.md
Normal file
148
README.md
Normal file
@@ -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
|
||||
53
client/nftables.conf
Normal file
53
client/nftables.conf
Normal file
@@ -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
|
||||
}
|
||||
}
|
||||
15
client/udp2raw-client.service
Normal file
15
client/udp2raw-client.service
Normal file
@@ -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
|
||||
18
client/wg0.conf
Normal file
18
client/wg0.conf
Normal file
@@ -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
|
||||
15
server/udp2raw-server.service
Normal file
15
server/udp2raw-server.service
Normal file
@@ -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
|
||||
16
server/wg0.conf
Normal file
16
server/wg0.conf
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user