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