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