Netcat с автоматическим обходом NAT, безопасным P2P и расширенными возможностями для доступа к оболочке, передачи файлов и сетевого проксирования.
README на китайском 、 английском
gonc — это инструмент netcat на основе Golang, предназначенный для облегчения одноранговой связи. Его основные возможности включают:
🔁 Автоматическое обход NAT: Нулевая конфигурация. Обеим сторонам достаточно согласовать парольную фразу. Используя параметр -p2p, узлы могут автоматически обнаруживать сетевые адреса друг друга и устанавливать соединение точка-точка через обход NAT, используя публичные сервисы STUN и MQTT для обмена адресами.
🔒 Сквозное шифрование с взаимной аутентификацией: Поддерживает TLS для TCP и DTLS для UDP шифрованной передачи, с взаимной аутентификацией идентичности на основе парольной фразы.
🧩 Гибкая конфигурация сервисов: С помощью параметра -e вы можете гибко настроить приложение для обслуживания каждого соединения. Например, -e /bin/sh может предоставить удалённую командную оболочку cmd. Вы также можете использовать встроенные виртуальные команды для удобного сервиса SOCKS5, HTTP-файлового сервиса и перенаправления трафика.
gonc: удобное кросс-устройственное, кросс-сетевое P2P-прямое соединение и безопасная передача файлов. Просто поделитесь парольной фразой (или отсканируйте QR-код); командная строка не требуется.Используйте как nc:
gonc www.baidu.com 80
gonc -tls www.baidu.com 443
может устанавливать только соединения точка-точка на основе IP и порта.
Теперь вы также можете устанавливать соединения точка-точка на основе общей парольной фразы с автоматическим обходом NAT.
На следующей диаграмме показан процесс установки P2P-соединения gonc между домашней широкополосной сетью (hard NAT) и узлом в мобильной сети (symmetric NAT). Поскольку обе стороны имеют IPv6, на обоих концах используется опция -4 для принудительного использования IPv4, чтобы продемонстрировать обход NAT.

Обе стороны согласуют одну и ту же парольную фразу. На стороне отправителя запустите HTTP-файловый сервер, чтобы предоставить доступ к файлам или каталогам для обмена. Опция -httpserver принимает несколько путей, каждый из которых может быть как отдельным файлом, так и каталогом:
gonc -p2p <passphrase> -httpserver c:/RootDir1 c:/RootDir2
На принимающей стороне есть два варианта:
Автоматически скачать весь каталог
После выполнения следующей команды все файлы будут рекурсивно загружены на локальную машину. Если процесс прервётся, повторный запуск команды автоматически возобновит загрузку с места остановки:
gonc -p2p <passphrase> -download c:/SavePath
Просмотр и выборочная загрузка через браузер
Этот вариант не запускает загрузку автоматически. Вместо этого вам нужно вручную открыть браузер и перейти по адресу http://127.0.0.1:9999, чтобы просмотреть список файлов узла и загрузить нужные файлы:
gonc -p2p <passphrase> -httplocal-port 9999
Если вам нужно скачать конкретный подкаталог, браузер становится неудобным, но вы можете сделать это так:
gonc -http-download c:/SavePath http://127.0.0.1:9999/subdir
Установите безопасную шифрованную P2P-связь между двумя разными сетями, согласовав парольную фразу (используйте gonc -psk . для генерации высокоэнтропийной парольной фразы вместо passphrase). Эта парольная фраза используется для взаимного обнаружения и вывода сертификатов, обеспечивая безопасность связи с TLS 1.3.
gonc -p2p passphrase
На другой стороне используйте те же параметры (программа автоматически попытается установить TCP- или UDP-связь (предпочтительно TCP), согласовать роли (TLS-клиент/сервер) и завершить протокол TLS):
gonc -p2p passphrase
Обратите внимание, что если другая сторона задержится с запуском, она завершится, если не сможет найти другую сторону для обмена информацией в течение примерно половины минуты. Поэтому также поддерживается механизм ожидания на основе подписки на сообщения MQTT, используя -mqtt-wait и -mqtt-hello для синхронизации времени запуска P2P обеими сторонами. Например, следующая команда использует -mqtt-wait для непрерывного ожидания,
gonc -p2p passphrase -mqtt-wait
На другой стороне,
gonc -p2p passphrase -mqtt-hello
Проверьте ваш тип NAT
gonc -nat-checker
Это проверит ваши IPv6 и IPv4 TCP и UDP NAT-адреса и проанализирует изменения портов после NAT. Если адреса TCP6 или UDP6 не указаны, это означает, что у вас нет IPv6. Каждый адрес протокола заканчивается на "(easy)", что указывает на наивысшую вероятность успеха пробивки; "(hard)" указывает на более высокую вероятность успеха; а "(symm)" — самый сложный. Symm требует, чтобы другая сторона была либо "easy", либо "hard" для работы P2P.
-keep-open, принимает только одно соединение; без аутентификации с -psk):
gonc -tls -exec ":sh /bin/bash" -l 1234
gonc -tls -pty x.x.x.x 1234
passphrase используется для аутентификации, обеспечивая безопасную связь с TLS 1.3):
gonc -exec ":sh /bin/bash" -p2p passphrase
На другой стороне:
gonc -pty -p2p passphrase
/dev/zero и /dev/urandom):
gonc.exe -send /dev/zero -P x.x.x.x 1234
Пример вывода:
IN: 76.8 MiB (80543744 bytes), 3.3 MiB/s | OUT: 0.0 B (0 bytes), 0.0 B/s | 00:00:23
На принимающей стороне:
gonc -P -l 1234 > NUL
Дождитесь установки туннеля:
gonc -p2p passphrase -linkagent
На другой стороне запустите локальный SOCKS5 / HTTP-прокси сервис на порту 3080 для доступа к удалённой сети:
# The link option controls how the local and remote proxy endpoints are created.
# Use none to indicate that no listening port is opened on that side:
gonc -p2p passphrase -link "3080;none"
Далее, например, если вы хотите подключиться к 10.0.0.1:3389 в удалённой сети, вы можете просто ввести следующий адрес в вашем локальном клиенте удалённого рабочего стола:
10.0.0.1-3389.gonc.cc:3080
Этот домен будет разрешён в IP-адрес вида 127.b.c.d. В результате клиент удалённого рабочего стола подключится к локальному SOCKS5-прокси на порту 3080, а затем gonc выполнит обратный разбор адреса 127.b.c.d, чтобы извлечь информацию 10.0.0.1-3389 из доменного имени.
Формат конфигурации link
# Based on the established tunnel, both local and remote sides listen on port 1080.
# The proxy supports both HTTP and SOCKS5 protocols, with transparent proxy capability enabled.
gonc -p2p <passphrase> -link "1080;1080"