added desktop and rust version

This commit is contained in:
2025-09-25 15:32:49 +06:00
parent 10af1a9a63
commit 2c2725cd19
29 changed files with 12835 additions and 1589 deletions

187
desktop/VPN_BYPASS_DEBUG.md Normal file
View File

@@ -0,0 +1,187 @@
# Диагностика обхода VPN для Gateway
## Проблема
Gateway не работает - пакеты все еще идут через WireGuard туннель вместо локального шлюза.
## Диагностика
### 1. Проверьте сетевые интерфейсы
Откройте DevTools (F12) и выполните:
```javascript
window.testNetworkInterfaces()
```
Это покажет все сетевые интерфейсы и их IP-адреса. Убедитесь, что `192.168.89.18` действительно существует.
### 2. Проверьте тестовое подключение
В DevTools выполните:
```javascript
window.testConnection()
```
Это протестирует подключение к `192.168.89.1:2655` с использованием gateway `192.168.89.18`.
### 3. Проверьте логи в консоли main процесса
При выполнении простукивания должны появиться логи:
```
Binding socket to localAddress 192.168.89.18 to bypass VPN/tunnel
TCP connected from 192.168.89.18:XXXXX to 192.168.89.1:2655
```
### 4. Проверьте системные маршруты
Выполните в терминале:
```bash
# Показать все маршруты
ip route show
# Показать маршрут к конкретной цели
ip route get 192.168.89.1
# Показать интерфейсы
ip addr show
```
## Возможные проблемы и решения
### Проблема 1: IP-адрес не существует
**Симптом**: Ошибка "EADDRNOTAVAIL"
**Решение**: Убедитесь, что `192.168.89.18` действительно привязан к интерфейсу
### Проблема 2: Нет маршрута к цели
**Симптом**: Ошибка "ENETUNREACH" или таймаут
**Решение**: Проверьте, что есть маршрут к `192.168.89.1` через интерфейс с IP `192.168.89.18`
### Проблема 3: WireGuard перехватывает трафик
**Симптом**: Трафик все еще идет через туннель
**Решение**:
1. Проверьте таблицу маршрутизации WireGuard
2. Убедитесь, что `192.168.89.0/24` не входит в AllowedIPs WireGuard
3. Проверьте приоритет маршрутов
### Проблема 4: Неправильное использование bind() для TCP
**Симптом**: Ошибка "socket.bind is not a function"
**Решение**: TCP сокеты НЕ поддерживают `bind()`. Используйте `localAddress` в `connect()`:
```javascript
// Неправильно (для TCP):
socket.bind(0, gateway);
socket.connect(port, host);
// Правильно (для TCP):
socket.connect({
port: port,
host: host,
localAddress: gateway
});
```
## Альтернативные подходы
### 1. Использование SO_BINDTODEVICE (Linux)
Если доступно, можно привязать сокет к конкретному интерфейсу:
```javascript
// Требует root права
socket.bind(0, '192.168.89.18');
socket._handle.setsockopt(socket._handle.constructor.SOL_SOCKET, 25, 'eth0'); // SO_BINDTODEVICE
```
### 2. Использование netstat для проверки
```bash
# Мониторинг активных соединений
netstat -an | grep 192.168.89.1
# Мониторинг с tcpdump
sudo tcpdump -i any -n host 192.168.89.1
```
### 3. Проверка через ss
```bash
# Показать активные соединения
ss -tuln | grep 192.168.89.1
# Показать соединения с конкретным локальным IP
ss -tuln src 192.168.89.18
```
## Тестирование
### Шаг 1: Проверьте интерфейсы
```javascript
window.testNetworkInterfaces()
```
### Шаг 2: Проверьте тестовое подключение
```javascript
window.testConnection()
```
### Шаг 3: Выполните реальное простукивание
```json
{
"apiBase": "internal",
"gateway": "192.168.89.18",
"inlineTargets": "tcp:192.168.89.1:2655",
"delay": "2s"
}
```
### Шаг 4: Проверьте логи
В консоли main процесса должны быть:
```
Using localAddress 192.168.89.18 to bypass VPN/tunnel
Knocking TCP 192.168.89.1:2655 via 192.168.89.18
TCP connected from 192.168.89.18:XXXXX to 192.168.89.1:2655
```
## Ожидаемые результаты
### Успешный обход VPN:
- Локальный IP в логах: `192.168.89.18`
- Подключение успешно
- На шлюзе `192.168.89.1` видны пакеты от `192.168.89.18`
### Неуспешный обход VPN:
- Локальный IP в логах: IP туннеля WireGuard
- Подключение может быть успешным, но через туннель
- На шлюзе `192.168.89.1` НЕ видны пакеты от `192.168.89.18`
## Дополнительная диагностика
### Проверка WireGuard конфигурации
```bash
# Показать статус WireGuard
sudo wg show
# Показать маршруты WireGuard
ip route show table 51820 # или другой номер таблицы
```
### Проверка таблицы маршрутизации
```bash
# Показать все таблицы маршрутизации
ip rule show
# Показать маршруты в конкретной таблице
ip route show table main
ip route show table local
```
---
**Важно**: Если диагностика показывает, что `bind()` работает, но трафик все еще идет через VPN, проблема может быть в настройках WireGuard или системной маршрутизации, а не в коде приложения.