# TCP туннель

## Обзор

TCP туннель позволяет предоставить доступ к любому сервису, использующему TCP-протокол, наиболее популярные примеры:

* Базы данных ([mySQL](https://tuna.am/docs/tunnels/examples/mysql.md), [PostgreSQL](https://tuna.am/docs/tunnels/examples/postgresql.md), [MSSQL](https://tuna.am/docs/tunnels/examples/mssql.md))
* ПО для удаленного доступа ([SSH](https://tuna.am/docs/tunnels/examples/ssh.md), [RDP](https://tuna.am/docs/tunnels/examples/rdp.md))
* Игровые серверы ([Minecraft](https://tuna.am/docs/tunnels/examples/minecraft.md))

Начиная с версии **0.36.0** tuna показывает в терминале [полноэкранный интерфейс](https://tuna.am/docs/tunnels/tui.md).

> **К сведению.** Создание TCP туннеля доступно только по [подписке](https://tuna.am/#pricing).

## Примеры

> **Примечание.** Все актуальные флаги, подсказки и примеры можно посмотреть вызвав справку:
>
> ```shell
> tuna tcp --help
>
> ```
>
> Почти для всех флагов есть аналогичные [переменные окружения](https://tuna.am/docs/guides/environment-variables.md).

### Базовый пример

```shell
tuna tcp 5432

```

### С передачей IP-адреса

```shell
tuna tcp 10.0.0.1:5432

```

### Unix-сокет

Вместо порта можно указать unix-сокет, байты из туннеля передаются в него как есть. Путь указывается с префиксом `unix://` и должен быть абсолютным:

```shell
tuna tcp unix:///var/run/app.sock

```

* Путь без префикса (`/var/run/app.sock`), относительный (`unix://tmp/app.sock`) или пустой (`unix://`) не принимается.
* Флаги `--cidr-allow`, `--cidr-deny` и `--proxy-protocol` работают так же, как с портом.
* Если сокета нет при запуске, tuna выведет предупреждение и продолжит работу. К сокету она подключается на каждое входящее соединение, поэтому сокет может появиться позже, перезапускать туннель не нужно.
* tuna подключается к сокету от имени пользователя, который её запустил. У него должны быть права на запись в сокет, иначе подключение завершится ошибкой `permission denied`.
* Unix-сокеты поддерживают только `tuna tcp` и [`tuna http`](https://tuna.am/docs/tunnels/http.md#unix-socket), специализированные команды вроде `tuna ssh`, `tuna postgres` и `tuna redis` — нет.
* На Windows работа не гарантируется, именованные каналы (`npipe://` в Docker Desktop) не поддерживаются.

#### Доступ к Docker API

> **Осторожно.** Доступ к `docker.sock` равнозначен root-доступу к хосту: через Docker API можно запустить контейнер с примонтированной корневой файловой системой. Не публикуйте сокет без `--cidr-allow`, ограничьте доступ своим IP-адресом.

```shell
tuna tcp unix:///var/run/docker.sock --cidr-allow="203.0.113.10/32"

```

Пользователь, от имени которого запущена tuna, должен состоять в группе `docker`, иначе подключение к сокету завершится ошибкой `permission denied`.

На своей машине укажите адрес туннеля из вывода tuna:

```shell
docker -H tcp://ru.tuna.am:12345 ps

```

### С указанием токена

Можно указать специфичный токен через флаг `--token` или переменную окружения `TUNA_TOKEN`. Переопределение происходит в соответствии с политикой [очерёдности конфигурации](https://tuna.am/docs/guides/config-ordering.md).

```shell
tuna tcp 8080 --token=tt_***

```

### С указанием региона для подключения

Можно указать специфичный [регион](https://tuna.am/docs/tunnels/guides/locations.md) через флаг `--location`/`-l` или переменную окружения `TUNA_LOCATION`. Переопределение происходит в соответствии с политикой [очерёдности конфигурации](https://tuna.am/docs/guides/config-ordering.md).

```shell
tuna tcp 8080 --location=nl

```

### Генерация QR кода с ссылкой

При добавлении флага `--qr` для ссылки будет сгенерирован QR код и напечатан в консоли. Это может быть удобно если вы тестируете сайт на мобильном устройстве.

![](/docs/img/examples/qr.png)

### Статичный порт

В качестве значения флага `--port`/`-p` может выступать алиас или назначенный порт. Порты можно резервировать в [личном кабинете](https://my.tuna.am/tcp_ports) и после перезапуска туннеля адрес останется прежним. Подробнее о портах читайте в отдельной [инструкции](https://tuna.am/docs/tunnels/ports.md).

```shell
tuna tcp 5432 --port=postgres
tuna tcp 5432 --port=35000

```

### Ограничение доступа по подсетям IP

Вы можете определить белый список [подсетей](https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B4%D1%81%D0%B5%D1%82%D1%8C) в CIDR-формате:

```shell
tuna tcp 3389 --cidr-allow="10.0.0.1/32"

```

Либо запретить доступ из определенных подсетей:

```shell
tuna tcp 3389 --cidr-deny="10.0.0.1/32"

```

Можно комбинировать, например указать широкую сеть и вычесть частные IP:

```shell
tuna tcp 3389 --cidr-allow="10.0.0.1/24" --cidr-deny="10.0.0.33/32"

```

Также можно передавать списки через запятую:

```shell
tuna tcp 3389 --cidr-allow="10.0.0.1/24,192.168.0.1/24" --cidr-deny="10.0.0.33/32,192.168.0.33/32"

```

### Proxy Protocol

Позволяет передавать оригинальный IP и Port клиента, если ваше приложение поддерживает это. В аргументе нужно передать версию 1 или 2, что соответствует версии Proxy Protocol, 1 - текстовый , 2 - бинарный. Haproxy или Nginx поддерживают оба и определяют автоматически.

```shell
tuna tcp 8443 --proxy-protocol=1
tuna tcp 8443 --proxy-protocol=2

```
