Tinc — это открытый сетевой протокол и программная реализация, используемая для сжатых и зашифрованных виртуальных частных сетей. Это проект был начат в 1998 году Гусом Слипеном, Иво Тиммермансом и Весселем Данкерсом под лицензией GPL.

К его основным достоинствам относится:
1) Распределенная топология (нет необходимости в мощном сервере VPN).
2) Работет поверх сетей любой топологии, в том числе за NAT и поверх других VPN.
3) Поддерживает активное соединение даже после переключения сети (например с wi-fi на 4g) или при входе и выходе из других VPN.
4) Работет в большинстве операционных систем, в том числе Windows XP.

К этому можно добавить, что tinc входит во все дистирбутивы Linux, то есть его можно установить и сразу пользоваться.

При этом tinc у широкой публики не пользуется популярностью. Одна из причин — очень лаконичная документация, которая создавалась в университетской среде, и поэтому является скорее академической, чем доступной для быстрого прочтения.

В этом сообщении я опишу конфигурацию tinc VPN в операционной истеме Ubuntu.

Устанавливаем пакет sudo apt-get install tinc.

Поскольку сеть имеет ячеистую топологию — нет сереверного или клиентского варианта программного обеспечения.

В нашем примере будет две машины. Первую условно назовем «сервер» — будет открыта для доступа из интернет по имени alpha.example.com (или по ip адресу). Вторая машина будет в некоторой сети не имея открытого в интернет ip адреса (4g, wi-fi, условно назовем ее «домашний компьютер»)

Теперь нам нужно выбрать имя для сети. В нашем примере это будет alpha.

Сначла работем на «сервере» с адресом alpha.example.com. Создаем структуру каталогов для конфигов sudo mkdir -p /etc/tinc/alpha/hosts.

Создаем конфиг сети alpha /etc/tinc/alpha/tinc.conf:

Name = server_01
AddressFamily = ipv4
Interface = tun0


В каталоге /etc/tinc/alpha/hosts будут храниться открытые ключи текущей машины и других доступных в сети alpha машин. Создадим файл /etc/tinc/alpha/hosts/server_01:

Address = alpha.example.com
Subnet = 10.0.0.1/32
Subnet = 0.0.0.0/0


Address задается в случае если у машины есть доступный адрес (например публичный адрес в сети интернет) или доменное имя.
Subnet = 10.0.0.1/32 задает адрес машины в сети alpha.
Subnet = 0.0.0.0/0 включается только в том случае, когда неоходимо весь трафик от других машин в интернет направить через текущую машину (это не обязательно).

Сгенерируем открытый и закрытый ключ командой sudo tincd -n alpha -K 4096.

Создадим файлы, которые будут выполняться при старте и остановке сети
/etc/tinc/alpha/tinc-up:

#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.1/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE


/etc/tinc/alpha/tinc-down:

#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.1/32 dev $INTERFACE
ip link set $INTERFACE down


Сделаем эти файлы выполняемыми sudo chmod 755 /etc/tinc/alpha/tinc-*

Запустим сеть alpha на текущей машине sudo tincd -n alpha -D -d5

Теперь перейдем на «домашний компьютер» и повторим все действия (с небольшими изменениями):

sudo apt-get install tinc

sudo mkdir -p /etc/tinc/alpha/hosts

/etc/tinc/alpha/tinc.conf:

Name = client_01
AddressFamily = ipv4
Interface = tun0
ConnectTo = server_01


/etc/tinc/alpha/hosts/client_01:

Subnet = 10.0.0.2/32


sudo tincd -n alpha -K 4096.

/etc/tinc/alpha/tinc-up:

#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.2/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE


/etc/tinc/alpha/tinc-down:

#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.2/32 dev $INTERFACE
ip link set $INTERFACE down


sudo chmod 755 /etc/tinc/alpha/tinc-*

sudo tincd -n alpha -D -d5

Теперь неободимо обменяться публичными ключами в каталогах /etc/tinc/alpha/hosts, чтобы их содержимое на обоеих машинах было одинаковое.

Итак, сеть настроена. С компьютера 10.0.0.1 доступен компьютер 10.0.0.2 и наоборот.

Иногда необходимо, чтобы вест трафик с «домашнео компьютера» шел через «сервер» (то для чего сейчас VPN используется довольно часто).

Напомню, что для этого в конфиге сервера мы предусмотрели параметр Subnet = 0.0.0.0/0

Кроме этого, необходимо изменить скрипты конфигурирования сети на «домашнем компьютере:

/etc/tinc/alpha/tinc-up:

#!/bin/sh
REMOTEADDRESS=X.X.X.X
VPN_GATEWAY=10.0.0.1
ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`

ip link set $INTERFACE up
ip addr add 10.0.0.2/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE
ip route add $REMOTEADDRESS $ORIGINAL_GATEWAY
ip route add $VPN_GATEWAY dev $INTERFACE
ip route add 0.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
ip route add 128.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE


/etc/tinc/alpha/tinc-down

#!/bin/sh
REMOTEADDRESS=X.X.X.X
VPN_GATEWAY=10.0.0.1
ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`

ip route del $REMOTEADDRESS $ORIGINAL_GATEWAY
ip route del $VPN_GATEWAY dev $INTERFACE
ip route del 0.0.0.0/1 dev $INTERFACE
ip route del 128.0.0.0/1 dev $INTERFACE
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.1/32 dev $INTERFACE
ip link set $INTERFACE down


После этого весь Ваш трафик будет направлен на „сервер“. Но это еще не означает что сервер будет его пересылать на другие адреса. Для этого нужно еще дополнительно настроить сеть на „сервере“. Дальнейшие действия будут сильно зависеть от конфигурации сети. В наиболее простом случае помогут команды, которые можно выполнять только если Вы знаете что они делают:

###   Этот код может нанести вред Вашему компьютеру   ###

sudo iptables -P FORWARD DROP
sudo iptables -I FORWARD -i tun0 -o enp35s0 -j ACCEPT
sudo iptables -I FORWARD -o tun0 -i enp35s0 -j ACCEPT
sudo iptables -t nat -I POSTROUTING -o enp35s0 -j MASQUERADE


Полезные ссылки

1. www.digitalocean.com/community/tutorials/how-to-install-tinc-and-set-up-a-basic-vpn-on-ubuntu-18-04-ru
2. www.tinc-vpn.org/examples/windows-install
3. www.tinc-vpn.org/examples/redirect-gateway
4. zingmars.info/2018/07/14/Tinc-1.1-setup-instructions

apapacy@gmail.com
30 января 2022 года

Комментарии (11)


  1. aborouhin
    30.01.2022 03:15
    +1

    Судя по датам последних новостей на сайте и активности в репозитории - проект выглядит скорее мёртвым, чем живым.

    Я для этой задачи тогда уж на Tailscale / Headscale или Nebula лучше смотрел бы (собственно, на первый и смотрю).


    1. LeshiyUrban
      30.01.2022 05:01

      Я склонен с вами согласиться, хотя и долгое время был поклонником tinc (даже статьи писал). Однако, я так и не нашёл аналогичную систему, которая умела бы автоматически пересылать трафик между узлами через посредников. Nebula , Tailscasle, ZeroTier полагаются во многом на пробив NATa, что не всегда возможно. TS, ZT хотя бы умеют использовать свои сервера при недоступности оконечных узлов, однако идея пускать траффик через сервера третьих лиц меня пугает.


      1. aborouhin
        30.01.2022 06:13
        +1

        Так Headscale - это и есть реализация "своего сервера" Tailscale, которую можно поставить у себя, а не полагаться на них. Помимо бесплатности, обеспечивает и конфиденциальность. Ну и если РКН до серверов Tailscale тоже теоретически может добраться, то своей инсталляции Headscale это не грозит.

        Хотя сразу скажу, что именно в этом аспекте, как организован mesh в разных решениях, глубоко не разбирался. Мне в моём сценарии другие фишки Tailscale более актуальны (SSO, например).


      1. asterroth
        30.01.2022 10:36

        У Zerotier есть возможность поднять свой standalone контроллер.


    1. fk0
      30.01.2022 15:47
      +1

      И что теперь, обязательно нужна (наверняка бажная) распоследняя версия? Ежедневно, каждый из нас пользуется тысячами "мёртвых" проектов. Зато есть пакет в типичном линуксе, и работает "из коробки", и без особенных проблем.

      И главное проект простой, понятный, вплоть до того, что реально самостоятельно что-то подправить и втолковать мантейнеру пакета из дебиана необходимость принять изменения, если официальный репозиторий совсем заброшенный. А он совсем не заброшенный, последние изменения -- неделю назад. Мёртвый проект? Он просто делается физическими лицами, у которого работа и вся остальная жизнь. Странно там ожидать активности как в коммерческом проекте.

      А всё названное (Tailscale, Headscale, Nebula) -- это как раз какие-то стрёмные новомодные "технологии", в кавычках, т.к. как правило за модными интерфейсами технологии в лучшем случае те же самые:

      • Tailscale (Headscale) is a modern VPN built on top of Wireguard;

      • Nebula is a... based on the Noise Protocol FrameworkNoise Protocol Framework (на котором базируется тот же Wireguard).

      Т.е. названное -- лишь лишний слой абстракций. Который может только добавить проблем. Может проще Wireguard тогда?

      PS: по-факту tinc -- это сейчас максимально просто/быстро поднимаемый "из коробки" VPN на любом практически линуксе. Остальное, кроме может быть wireguard, требует больше усилий. И при этом каких-то характерных проблем tinc не имеет. Он просто работает. И он использует "классическую" криптографию (RSA/OpenSSL), а от новомодных решений можно получить сюрпризы (там свой heardbleed будет ещё 10 раз...)


      1. apapacy Автор
        30.01.2022 16:00

        Благодаря обсуждению посмотрел эти проекты. Кругом крме всего прочего проят сразу денег. Конечно дают и ограниченный бесплатный вариант.
        Пытаюсь сейчас установить SelfHosted ZeroTier который выглядит как бесплатный вариант (хотя еще нужно внимательно изучать лицензии все).


        1. fk0
          30.01.2022 16:29

          Использование коммерческого продукта с закрытым кодом или их сервером в VPN я бы сразу отвергал, по очевидным соображениям. На мой взгляд допустимо только ПО имеющееся в пакетах крупных дистрибутивов Linux и только исключительно свои сервера.

          И, кстати, забыли DNS... Нормального решения с ним нет. Удалённо -- медленно и часть локальных хостов не резолвится (например провайдерских). Локально -- весь траффик виден. Хотелось бы решения, которое бы имело fallback с резолвом через провайдерский сервер.


          1. aborouhin
            30.01.2022 20:01

            Использование коммерческого продукта с закрытым кодом или их сервером в VPN я бы сразу отвергал, по очевидным соображениям

            Ну тут у каждого своя матрица рисков. Любой облачный сервис российской компании или компании с российским представительством для меня, скажем, неприемлем, по очевидным причинам :) В отношении зарубежных юрисдикций сценарий, при котором это может создать мне реальные проблемы, представляется скорее фантастическим.


      1. aborouhin
        30.01.2022 19:46

        Может проще Wireguard тогда?

        Так у меня, собственно, сейчас WireGuard и есть везде. Но людей в компании и устройств у них становится всё больше, не всем можно доверять, вручную распространять ключи и раздавать айпишники уже несколько геморройно. Хочется SSO с 2FA, гибких настроек прав доступа, интеграций с внешними системами и т.д. и т.п. И чтобы оно не только под Linux (между серверами-то и вручную всё настроить несложно), но и под Windows/Mac/Android/iOS. Так что начал искать WireGuard, но с централизованным управлением, - вот и нашёл Tailscale / Headscale. Пока нравится, но только начал изучать.

        В поиске других альтернатив натолкнулся на ZeroTier и Nebula (последняя, насколько я понял, как раз основана на tinc). Но моим требованиям они пока не отвечают (хотя у ZeroTier в roadmap есть почти всё, что мне нужно, но когда это будет реализовано - непонятно).

        Ну и по поводу от обновлений и пр. - не буду спорить, конечно. Но, во-первых, проект, который заточен на безопасность, и при этом последняя стабильная версия 2 года назад, - ну вот вызывает сомнения и всё. А во-вторых, если мне сейчас не во всех продуктах хватает функций, - то хочется выбрать то ПО, у которого прогресс в их добавлении прослеживается.


        1. apapacy Автор
          31.01.2022 16:07

          Развернул ZeroTier. Если внимательно почитать лицензию то даже self-hosted решение можно юзать только в домашних целях. И конечно напрягает что регистрация новой сети или нового клинета всега связана с из сервером, разрешающим идентификаторы сети в адреса self-hosted серверов.


          Nebula же полностью бесплатна. И не использует tinc прямо (скорее построена на его идеях).


      1. edo1h
        31.01.2022 05:10

        Т.е. названное — лишь лишний слой абстракций. Который может только добавить проблем. Может проще Wireguard тогда?

        функциональность wireguard весьма ограничена.


        есть, например, у нас сеть из сто нод, мы хотим добавить сто первую.
        в случае с tinc нам достаточно прописать новую ноду на одной из существующих (ну и наоборот, прописать на новой эту ноду). после этого начинает работать связь между всеми 101 нодами.
        чтобы реализовать подобное на wg нужна обвязка.


        и это только один из примеров.


        так что удивительного в том, что появляются надстройки над wg, реализующие дополнительный функционал?