Files
knock-gui/desktop/VPN_BYPASS_DEBUG.md

6.0 KiB
Raw Blame History

Диагностика обхода VPN для Gateway

Проблема

Gateway не работает - пакеты все еще идут через WireGuard туннель вместо локального шлюза.

Диагностика

1. Проверьте сетевые интерфейсы

Откройте DevTools (F12) и выполните:

window.testNetworkInterfaces()

Это покажет все сетевые интерфейсы и их IP-адреса. Убедитесь, что 192.168.89.18 действительно существует.

2. Проверьте тестовое подключение

В DevTools выполните:

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. Проверьте системные маршруты

Выполните в терминале:

# Показать все маршруты
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():

// Неправильно (для TCP):
socket.bind(0, gateway);
socket.connect(port, host);

// Правильно (для TCP):
socket.connect({
  port: port,
  host: host,
  localAddress: gateway
});

Альтернативные подходы

1. Использование SO_BINDTODEVICE (Linux)

Если доступно, можно привязать сокет к конкретному интерфейсу:

// Требует root права
socket.bind(0, '192.168.89.18');
socket._handle.setsockopt(socket._handle.constructor.SOL_SOCKET, 25, 'eth0'); // SO_BINDTODEVICE

2. Использование netstat для проверки

# Мониторинг активных соединений
netstat -an | grep 192.168.89.1

# Мониторинг с tcpdump
sudo tcpdump -i any -n host 192.168.89.1

3. Проверка через ss

# Показать активные соединения
ss -tuln | grep 192.168.89.1

# Показать соединения с конкретным локальным IP
ss -tuln src 192.168.89.18

Тестирование

Шаг 1: Проверьте интерфейсы

window.testNetworkInterfaces()

Шаг 2: Проверьте тестовое подключение

window.testConnection()

Шаг 3: Выполните реальное простукивание

{
  "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 конфигурации

# Показать статус WireGuard
sudo wg show

# Показать маршруты WireGuard
ip route show table 51820  # или другой номер таблицы

Проверка таблицы маршрутизации

# Показать все таблицы маршрутизации
ip rule show

# Показать маршруты в конкретной таблице
ip route show table main
ip route show table local

Важно: Если диагностика показывает, что bind() работает, но трафик все еще идет через VPN, проблема может быть в настройках WireGuard или системной маршрутизации, а не в коде приложения.