added desktop and rust version

This commit is contained in:
2025-09-25 15:32:49 +06:00
parent 10af1a9a63
commit 2c2725cd19
29 changed files with 12835 additions and 1589 deletions

View File

@@ -0,0 +1,186 @@
# Объяснение работы Gateway и localAddress
## Проблема
При использовании VPN (например, WireGuard) весь интернет-трафик направляется через туннель. Однако для порт-простукивания может потребоваться использовать локальный интерфейс для обхода VPN.
## Решение: localAddress
### Как работает localAddress
`localAddress` - это параметр в Node.js Socket API, который позволяет указать локальный IP-адрес для исходящих соединений. Это заставляет операционную систему использовать конкретный сетевой интерфейс вместо маршрута по умолчанию.
### TCP соединения
```javascript
const socket = new net.Socket();
// Обычное соединение (через маршрут по умолчанию, может идти через VPN)
socket.connect(80, 'example.com');
// Соединение через конкретный локальный IP (обходит VPN)
socket.connect({
port: 80,
host: 'example.com',
localAddress: '192.168.89.1' // Ваш локальный шлюз
});
```
**Важно**: TCP сокеты НЕ поддерживают `socket.bind()`. Используйте `localAddress` в `socket.connect()`.
### UDP пакеты
```javascript
const socket = dgram.createSocket('udp4');
// Привязка к конкретному локальному IP (работает для UDP)
socket.bind(0, '192.168.89.1');
// Отправка пакета через этот интерфейс
socket.send(message, 0, message.length, 53, '8.8.8.8');
```
**Важно**: UDP сокеты поддерживают `socket.bind()` для привязки к локальному IP.
## Ваш случай с WireGuard
### Текущая ситуация:
- WireGuard активен
- Весь трафик идет через туннель
- Нужно простучать порт через локальный шлюз `192.168.89.1`
### Решение:
```javascript
// В настройках приложения указать:
{
"apiBase": "internal",
"gateway": "192.168.89.1"
}
// Или в строке цели:
"tcp:example.com:22:192.168.89.1"
```
### Что происходит:
1. Приложение получает gateway `192.168.89.1`
2. Создается сокет с `localAddress: '192.168.89.1'`
3. Операционная система направляет трафик через интерфейс с IP `192.168.89.1`
4. Трафик обходит WireGuard туннель
## Технические детали
### TCP (socket.connect с localAddress)
```javascript
socket.connect({
port: 22,
host: '192.168.1.100',
localAddress: '192.168.89.1' // Принудительно использует этот локальный IP
});
```
### UDP (socket.bind с localAddress)
```javascript
socket.bind(0, '192.168.89.1'); // Привязка к локальному IP
socket.send(message, port, host); // Отправка через этот интерфейс
```
## Проверка работы
### Логи в консоли
```
Using localAddress 192.168.89.1 to bypass VPN/tunnel
TCP connection to 192.168.1.100:22 via 192.168.89.1 successful
```
### Сетевая диагностика
```bash
# Проверить маршруты
ip route show
# Проверить интерфейсы
ip addr show
# Мониторинг трафика
tcpdump -i any host 192.168.1.100
```
## Возможные проблемы
### 1. "EADDRNOTAVAIL" ошибка
**Причина**: IP-адрес не существует на локальной машине
**Решение**: Указать корректный IP локального интерфейса
### 2. "ENETUNREACH" ошибка
**Причина**: Нет маршрута к цели через указанный интерфейс
**Решение**: Проверить сетевую конфигурацию
### 3. Трафик все еще идет через VPN
**Причина**: Неправильно указан localAddress
**Решение**:
```bash
# Найти локальный IP шлюза
ip route | grep default
# Использовать этот IP как gateway
```
## Примеры конфигурации
### Конфигурация для обхода WireGuard
```json
{
"apiBase": "internal",
"gateway": "192.168.89.1",
"inlineTargets": "tcp:external-server.com:22",
"delay": "1s"
}
```
### Смешанное использование
```
tcp:127.0.0.1:22;tcp:external-server.com:22:192.168.89.1;udp:local-dns.com:53
```
- Первая цель: через VPN (системный маршрут)
- Вторая цель: через локальный шлюз (обход VPN)
- Третья цель: через VPN (системный маршрут)
## Отладка
### Включить подробные логи
```javascript
// В настройках установить verbose: true
{
"verbose": true
}
```
### Проверить в консоли main процесса
```
Knocking TCP external-server.com:22 via 192.168.89.1
Using localAddress 192.168.89.1 to bypass VPN/tunnel
TCP connection to external-server.com:22 via 192.168.89.1 successful
```
### Мониторинг сети
```bash
# Просмотр активных соединений
netstat -an | grep 192.168.89.1
# Мониторинг трафика
sudo tcpdump -i any -n host external-server.com
```
## Безопасность
### Ограничения
- `localAddress` работает только с IP-адресами, существующими на локальной машине
- Необходимы соответствующие права для привязки к сетевым интерфейсам
- Подчиняется правилам файрвола операционной системы
### Рекомендации
- Использовать только доверенные IP-адреса
- Проверять сетевую конфигурацию перед использованием
- Логировать все попытки обхода VPN для аудита
---
**Важно**: `localAddress` - это мощный инструмент для управления сетевым трафиком, но он должен использоваться осторожно, так как может обходить сетевые политики безопасности.