HeadlinesBriefing favicon HeadlinesBriefing.com

Tailcat: netcat поверх Tailscale

Hacker News •
×

Tailcat — это ремикс компонентов Tailscale с открытым исходным кодом, работающий как netcat, но поверх плоскости данных Tailscale, без плоскости управления. Плоскость данных Tailscale (внутри называемая magicsock) обеспечивает туннели с шифрованием Wire Guard® между двумя машинами, с DERP в качестве бокового канала связи для пробивания NAT и в качестве последнего ретранслятора, если NAT traversal не удается. Вместо использования плоскости управления Tailscale все метаданные соединения tailcat обмениваются вне полосы, как вы хотите. CLI tailcat (в cmd/tailcat) построен на библиотеке Go tailcat (импортируемой как github.com/tailscale/tailcat).

Используете ли вы tailcat как CLI-инструмент или библиотеку, одна сторона запускает сервер tailcat (слушатель) и получает короткий токен соединения. Другая сторона передает этот токен клиентской стороне tailcat для подключения. Весь трафик между ними зашифрован сквозным шифрованием Wire Guard. Начальное соединение инициируется через сеть ретрансляторов DERP Tailscale, а затем magicsock выполняет NAT traversal для перехода на прямое одноранговое UDP-соединение, когда это возможно (обычно!).

Вам не нужна учетная запись Tailscale, root/административный доступ на машине (он не изменяет таблицы маршрутизации, DNS и т. д.). Это просто библиотека пользовательского пространства и CLI-инструмент. И все это с открытым исходным кодом. Вы можете использовать наши бесплатные ретрансляторы DERP с ограничением скорости (карта DERP по умолчанию: https://tailcat.dev/derpmap.json) или запустить свои собственные.

Использование: Передавайте stdin/stdout между двумя машинами. Сервер запускается, выводя свой эфемерный адрес: $ tailcat # Выбран регион начального ретранслятора 302, Сан-Франциско # Сервер слушает новый адрес: tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu (висит, ожидая...) Затем клиент может: $ echo hello | tailcat tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu $ Затем сервер разблокируется: $ tailcat # Выбран регион начального ретранслятора 302, Сан-Франциско # Сервер слушает новый адрес: tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu hello $ Открытие локальных портов через туннель Или вы можете обслуживать локальный TCP-порт, перенаправляемый на localhost: $ tailcat --serve=8080,8443 # или --serve=all # Сервер слушает новый адрес: tc XXXXXXXXX Затем клиент: $ tailcat tc XXXXXXXXX 8080 GET / HTTP/1.1 Host: foo HTTP/1.1 200 OK.... SSH-сервер без аутентификации На Linux и macOS вы также можете запустить SSH-сервер без аутентификации. (Если вам нужна аутентификация, вы можете просто tailcat --serve=22 и проксировать на ваш системный SSH-сервер) $ tailcat --serve=no-auth-ssh # Сервер слушает новый адрес: tc XXXXXXXXX И на стороне клиента: $ tailcat ssh tc XXXXXXXXX $ tailcat ssh tc XXXXXXXXX ls -la Прочие команды Ping для проверки связи; каждый pong сообщает, прибыл ли он через ретранслятор DERP или прямой путь. --until-direct продолжает пинговать (до --timeout, по умолчанию 10 с), пока прямой путь не заработает, выходя с ненулевым кодом, если нет: $ tailcat ping --until-direct <token> pong in 42.1ms via DERP(sfo) pong in 1.2ms via 203.0.113.7:41641 Выполнение команды через прокси SOCKS5, маршрутизируемый через туннель: $ tailcat socks <token> curl http://server.tailcat:8081/ Токены также работают напрямую как URL-хосты: SOCKS-прокси распознает их и набирает, поэтому аргумент токена необязателен. (Токены чувствительны к регистру; это работает с curl и большинством CLI-инструментов, но не с браузерами, которые преобразуют имена хостов в нижний регистр.) $ tailcat socks curl http://<token>:8081/ Действовать как выходной узел, чтобы клиент мог достичь сети сервера: $ tailcat --serve=exit-node Разобрать токен соединения и вывести его содержимое (открытый ключ Wire Guard сервера и информацию DERP) в формате JSON, ничего не подключая: $ tailcat parse tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu {"Server Public": "nodekey:9c8d2e6728da80a1dd37e275a82595b42d9a838610bc53f74a7670d1610f2e34","Region ID": 302} Разрешить короткий токен (который ссылается на регион DERP по ID, требуя от клиентов получения карты DERP) в более длинный самодостаточный токен с встроенной информацией о сервере DERP...