Задача: соединить две Linux-станции простейшим туннелем, поддерживающим инкапсуляцию в том числе и широковещательного трафика - это GRE (Generic Routing Encapsulation).
Возможно понадобится загрузить модуль поддержки GRE-протокола:
# modprobe ip_gre
Прежде чем приступать к добавлению нового туннеля, есть смысл просмотреть список уже установленных:
# ip tunnel list
Активируем виртуальный интерфейс GRE-туннеля, указывая при этом IP-адреса, между которыми передаётся инкапсулированный трафик:
# ip tunnel add tund0 mode gre local 123.45.67.89 remote 123.45.90.90
Задаём IP-адрес виртуальному интерфейсу GRE-туннеля:
# ip addr add 10.172.1.253/30 dev tund0
Активируем (поднимаем) виртуальный интерфейс GRE-туннеля:
# ip link set tund0 up
Очевидно, что на стороне принимающей туннельное соединение, потребуется провести аналогичные вышеприведённым операции, учитывая смену ролей "local" и "remote" адресов. Кроме того, не забываем про разрешающие правила для защитных экранов на пути туннеля.
Простейший способ проверить, установился ли GRE-туннель - пустить серию ICMP-пакетов на адреса виртуальных GRE-интерфейсов посредством утилиты "ping" (более информативный вывод у "mtr", но её потребуется инсталлировать отдельно).
Конечно же, туннель с поддержкой инкапсуляции широковещательного трафика и протоколов маршрутизации создают не для связи всего двух компьютеров. Мы соединяем межсетевые маршрутизаторы, на которых должна быть активирована функциональность пересылки пакетов между интерфейсами:
# sysctl net.ipv4.ip_forward=1
Добавляем правило маршрутизации, отправляющее в GRE-туннель трафик, адресованный удалённой сети:
# route add -net 192.168.123.0 netmask 255.255.255.0 gw 10.172.1.254
Важно знать, что нельзя задать GRE-туннелю напрашивающееся по началу имя "gre0", "tunl0" или "sit0" - они зарезервированы в коде модуля ядра как "base devices" и применяются по умолчанию для обработки пакетов протокола, не попавших в другие явно обозначенные интерфейсы. Эти вспомогательные интерфейсы автоматически создаются при работе с протоколом.