6.0 KiB
Диагностика обхода 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 перехватывает трафик
Симптом: Трафик все еще идет через туннель Решение:
- Проверьте таблицу маршрутизации WireGuard
- Убедитесь, что
192.168.89.0/24
не входит в AllowedIPs WireGuard - Проверьте приоритет маршрутов
Проблема 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 или системной маршрутизации, а не в коде приложения.