Проброс портов между клиентами через Chisel: урезанный тоннель без L3

Когда два устройства находятся за NAT или строгими фаерволами и не могут “увидеть” друг друга напрямую, стандартным решением кажется VPN. Но полноценный L3-тоннель (вроде WireGuard или OpenVPN) часто избыточен: он требует root-прав, настройки виртуальных интерфейсов и может конфликтовать с существующими маршрутами.

В таких случаях удобно использовать Chisel — TCP/UDP тоннель, работающий поверх HTTP и использующий WebSockets для передачи данных. В этой заметке я покажу, как “прокинуть” порт от одного клиента к другому через промежуточный сервер.

Как это работает?

Представьте ситуацию: у вас есть Клиент А (например, ваш домашний сервер), Клиент Б (ваш рабочий ноутбук) и VPS с публичным IP-адресом. Клиенты А и Б могут обращаться к VPS, но не друг к другу.

Схема проброса будет выглядеть так:
1. Клиент А подключается к VPS и открывает “обратный” (reverse) порт на сервере. Теперь всё, что приходит на порт X сервера, попадает на порт Y Клиента А.
2. Клиент Б подключается к VPS и пробрасывает порт Z со своей локальной машины на порт X сервера.
3. В итоге Клиент Б обращается к localhost:Z и попадает на Клиент А:Y.

Такой подход — одно из решений в случаях, когда связь с VPS не реализует L3-слой или отсутствует возможность настройки маршрутизации между клиентами. Мы работаем исключительно на уровне приложений и портов.

Шаг 1: Запуск сервера

На вашей VPS достаточно запустить Chisel в режиме сервера. Флаг --reverse обязателен, чтобы разрешить клиентам открывать порты на стороне сервера.

chisel server --port 8080 --reverse

Шаг 2: Подключение Клиента А (Источник)

Допустим, Клиент А хочет открыть доступ к своему локальному веб-серверу на порту 3000. Он подключается к VPS и говорит: “зарезервируй на сервере порт 2000 и перенаправляй его мне на 3000”.

chisel client vps-ip:8080 R:2000:127.0.0.1:3000

Теперь порт 2000 на VPS (на loopback интерфейсе) ведет к Клиенту А.

Шаг 3: Подключение Клиента Б (Потребитель)

Теперь Клиент Б хочет получить доступ к этому ресурсу. Он подключается к той же VPS и пробрасывает свой локальный порт 8080 на порт 2000 сервера.

chisel client vps-ip:8080 8080:127.0.0.1:2000

Готово! Теперь открыв http://localhost:8080 на Клиенте Б, вы увидите сервис, запущенный на Клиенте А.

Безопасность и нюансы

Chisel поддерживает аутентификацию через флаг --auth, что крайне рекомендуется при работе через публичные сервера. Также можно использовать TLS-сертификаты для шифрования трафика.

Главное преимущество такого подхода — отсутствие необходимости в TUN/TAP устройствах и сложных таблицах маршрутизации. Это “урезанный” тоннель, который делает ровно одну вещь: связывает порты через WebSocket-соединение. Это работает даже через корпоративные прокси, если настроить Chisel на работу через 443 порт.

Вывод

Chisel — это утилита для специфических сетевых задач. Когда нужно прокинуть порты между изолированными узлами без настройки полноценного VPN, связка из прямого и обратного тоннелей через релей-сервер оказывается вполне жизнеспособным решением.

Ссылки

https://github.com/jpillora/chisel