Перейти к основному содержимому

Туннель не подключается из-за IPv6

Если у хоста есть IPv6, клиент tuna может подключаться к нам по нему. Обычно это незаметно, но у некоторых хостов IPv4 и IPv6 принадлежат разным сетям, и по IPv6 туннель не может подключиться. Мы встречали такое на VPS.

Симптомы​

Скорее всего, дело в IPv6, если у хоста есть IPv6 и:

  • туннель постоянно переподключается или падает по таймауту при подключении к ноде;
  • через туннель заметно выросла задержка.

Диагностика​

Проверьте, с каких адресов хост выходит в интернет и в какой стране они числятся:

curl -4 https://ifconfig.co/country
curl -6 https://ifconfig.co/country

Если вторая команда вернула ответ, значит, у хоста есть IPv6. Если страны различаются, это почти наверняка ваш случай.

Подробный лог подключения покажет, к каким адресам идёт клиент и на чём обрывается соединение:

tuna http 8080 --log-level=debug

Общая проверка сети — команда tuna diagnose.

Решение​

Задайте переменную окружения TUNA_FORCE_IPV4=1. С ней клиент подключается к API и к нодам только по IPv4, а если не работает системный DNS, использует запасные публичные DNS-серверы. Переменная есть в tuna-cli начиная с 0.31.0.

TUNA_FORCE_IPV4=1 tuna http 8080

Сервис systemd​

Если туннель установлен сервисом, добавьте переменную в drop-in. Имя сервиса по умолчанию — tuna, своё имя задаётся флагом --name:

sudo systemctl edit tuna
[Service]
Environment=TUNA_FORCE_IPV4=1
sudo systemctl restart tuna

Docker​

Передайте переменную флагом -e TUNA_FORCE_IPV4=1 в docker run или в environment в Docker Compose:

services:
tuna:
image: yuccastream/tuna:latest
command: http app:8080
environment:
TUNA_API_KEY: tak_***
TUNA_FORCE_IPV4: "1"

Не помогло — напишите в поддержку и приложите вывод tuna diagnose и лог с --log-level=debug.