6.6 KiB
Объяснение работы Gateway и localAddress
Проблема
При использовании VPN (например, WireGuard) весь интернет-трафик направляется через туннель. Однако для порт-простукивания может потребоваться использовать локальный интерфейс для обхода VPN.
Решение: localAddress
Как работает localAddress
localAddress
- это параметр в Node.js Socket API, который позволяет указать локальный IP-адрес для исходящих соединений. Это заставляет операционную систему использовать конкретный сетевой интерфейс вместо маршрута по умолчанию.
TCP соединения
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 пакеты
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
Решение:
// В настройках приложения указать:
{
"apiBase": "internal",
"gateway": "192.168.89.1"
}
// Или в строке цели:
"tcp:example.com:22:192.168.89.1"
Что происходит:
- Приложение получает gateway
192.168.89.1
- Создается сокет с
localAddress: '192.168.89.1'
- Операционная система направляет трафик через интерфейс с IP
192.168.89.1
- Трафик обходит WireGuard туннель
Технические детали
TCP (socket.connect с localAddress)
socket.connect({
port: 22,
host: '192.168.1.100',
localAddress: '192.168.89.1' // Принудительно использует этот локальный IP
});
UDP (socket.bind с localAddress)
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
Сетевая диагностика
# Проверить маршруты
ip route show
# Проверить интерфейсы
ip addr show
# Мониторинг трафика
tcpdump -i any host 192.168.1.100
Возможные проблемы
1. "EADDRNOTAVAIL" ошибка
Причина: IP-адрес не существует на локальной машине Решение: Указать корректный IP локального интерфейса
2. "ENETUNREACH" ошибка
Причина: Нет маршрута к цели через указанный интерфейс Решение: Проверить сетевую конфигурацию
3. Трафик все еще идет через VPN
Причина: Неправильно указан localAddress Решение:
# Найти локальный IP шлюза
ip route | grep default
# Использовать этот IP как gateway
Примеры конфигурации
Конфигурация для обхода WireGuard
{
"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 (системный маршрут)
Отладка
Включить подробные логи
// В настройках установить 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
Мониторинг сети
# Просмотр активных соединений
netstat -an | grep 192.168.89.1
# Мониторинг трафика
sudo tcpdump -i any -n host external-server.com
Безопасность
Ограничения
localAddress
работает только с IP-адресами, существующими на локальной машине- Необходимы соответствующие права для привязки к сетевым интерфейсам
- Подчиняется правилам файрвола операционной системы
Рекомендации
- Использовать только доверенные IP-адреса
- Проверять сетевую конфигурацию перед использованием
- Логировать все попытки обхода VPN для аудита
Важно: localAddress
- это мощный инструмент для управления сетевым трафиком, но он должен использоваться осторожно, так как может обходить сетевые политики безопасности.