Маршрутизация
Раздел про то, как 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 вы потеряете связь с этим сервером.