Files
knock-gui/desktop/VPN_BYPASS_DEBUG.md

188 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Диагностика обхода 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 или системной маршрутизации, а не в коде приложения.