Маршрутизация

Раздел про то, как relay-узел в роли шлюза заворачивает трафик локальной сети в туннель, и как при этом не сломать пробросы портов и не допустить утечки реального адреса при сбое relay. Все параметры задаются в секции edge файла /etc/ololo-relay/node.yaml.

Перехват трафика с интерфейса (capture_iifs)

Параметр capture_iifs направляет весь трафик с указанного сетевого интерфейса через relay-туннель. Используется, когда на той же машине поднят отдельный сетевой интерфейс — например внутренний интерфейс корпоративной или домашней сети, либо интерфейс стороннего VPN (Pritunl / WireGuard).

edge:
  tun:
    name: ololo0
  capture_iifs:
    - tun0

Трафик к локальным адресам (RFC1918: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16; CGNAT: 100.64.0.0/10) через relay не пойдёт — приложение автоматически добавляет правила маршрутизации, которые оставляют эти диапазоны в основной таблице. Через relay уйдёт только трафик к публичным адресам. Все правила удаляются при остановке сервиса (если не включён режим fail_closed, см. ниже).

Пробросы портов на шлюзе (capture_wan_iface)

Если на том же шлюзе настроен проброс портов (внешний клиент → WAN_IP:порт → внутренний сервис через DNAT) и включён capture_iifs по локальному интерфейсу, ответ проброшенного сервиса по умолчанию уйдёт в relay вместо обратного пути через внешний канал — проброс перестанет работать. Причина: ответный пакет приходит на шлюз с локального интерфейса и попадает под то же правило перехвата, а адрес внешнего клиента публичный и под исключение для локальных сетей не подпадает.

Укажите внешний (uplink) интерфейс шлюза — приложение пометит входящие снаружи соединения и вернёт их ответы по основному маршруту:

edge:
  capture_iifs:
    - eth1             # локальная сеть, трафик которой заворачивается в relay
  capture_wan_iface: eth0    # внешний интерфейс — для корректных пробросов

Исключения по адресу назначения (capture_exclude_dst)

Адреса и подсети, которые шлюз обслуживает сам и которые не нужно заворачивать в relay (публичный адрес самого шлюза, в том числе плавающий VRRP/keepalived-адрес; соседние шлюзы). Эти адреса всегда остаются в основной таблице маршрутизации:

edge:
  capture_exclude_dst:
    - 203.0.113.10/32        # ваш публичный WAN-адрес/VIP

Защита от утечки при сбое relay (fail_closed)

По умолчанию (fail_closed: false), если relay на шлюзе остановился или упал, перехват снимается и трафик клиентов за шлюзом уходит в интернет напрямую с реального адреса шлюза — в обход relay. Для части сценариев это нежелательная утечка.

Режим fail_closed: true включает «глухую блокировку» (kill-switch): в таблицу маршрутизации relay добавляется blackhole-маршрут. Пока relay работает, трафик идёт через него; как только relay падает или перезапускается — не-локальный трафик клиентов отбрасывается, а не утекает напрямую. Локальная сеть при этом продолжает работать.

edge:
  fail_closed: true

Внимание. Это намеренно «жёсткий» режим, и обращаться с ним надо аккуратно:

  • При штатной остановке сервиса (systemctl stop) правила перехвата и blackhole-маршрут не снимаются — клиенты за шлюзом останутся без интернета до повторного запуска relay либо до ручного снятия правил. Это сделано специально (в этом и смысл kill-switch), но об этом легко забыть и «положить» канал целому сегменту.

  • Снять блокировку вручную и вернуть прямой доступ:

    ip route flush table 100
    ip rule del iif <iif> lookup 100 priority 99      # для каждого iif
    ip rule del to 10.0.0.0/8 lookup main priority 98 # и прочие RFC1918
    
  • Не включайте fail_closed на шлюзе, через который идёт ваш собственный управляющий доступ (SSH) из не-локальной сети: при сбое relay вы потеряете связь с этим сервером.