[Unit] Description=Policy routing — DNS ответы через балансировщики After=network-online.target Wants=network-online.target [Service] Type=oneshot RemainAfterExit=yes {% if policy_routing_balancers | length > 0 %} # Режим MAC-matching: отдельная таблица и правило для каждого балансировщика {% for balancer in policy_routing_balancers %} ExecStartPre=-/usr/sbin/ip rule del fwmark {{ balancer.fwmark }} table {{ balancer.table_id }} priority {{ 100 + loop.index0 }} ExecStartPre=-/usr/sbin/ip route flush table {{ balancer.table_id }} {% endfor %} {% for balancer in policy_routing_balancers %} ExecStart=/usr/sbin/ip rule add fwmark {{ balancer.fwmark }} table {{ balancer.table_id }} priority {{ 100 + loop.index0 }} ExecStart=/usr/sbin/ip route add default table {{ balancer.table_id }} via {{ balancer.ip }} {% endfor %} {% for route in policy_routing_local_routes %} {% for balancer in policy_routing_balancers %} ExecStart=/usr/sbin/ip route add {{ route }} table {{ balancer.table_id }} {% endfor %} {% endfor %} {% for balancer in policy_routing_balancers %} ExecStop=-/usr/sbin/ip rule del fwmark {{ balancer.fwmark }} table {{ balancer.table_id }} priority {{ 100 + loop.index0 }} ExecStop=-/usr/sbin/ip route flush table {{ balancer.table_id }} {% endfor %} {% else %} # Режим ECMP (обратная совместимость: один или несколько балансировщиков без MAC) ExecStartPre=-/usr/sbin/ip rule del fwmark {{ policy_routing_fwmark }} table {{ policy_routing_table_id }} priority 100 ExecStartPre=-/usr/sbin/ip route flush table {{ policy_routing_table_id }} ExecStart=/usr/sbin/ip rule add fwmark {{ policy_routing_fwmark }} table {{ policy_routing_table_id }} priority 100 ExecStart=/usr/sbin/ip route add default table {{ policy_routing_table_id }} \ {% for gw in policy_routing_gateways %} nexthop via {{ gw }} weight 1 {% if not loop.last %} \{% endif %} {% endfor %} {% for route in policy_routing_local_routes %} ExecStart=/usr/sbin/ip route add {{ route }} table {{ policy_routing_table_id }} {% endfor %} ExecStop=-/usr/sbin/ip rule del fwmark {{ policy_routing_fwmark }} table {{ policy_routing_table_id }} priority 100 {% for route in policy_routing_local_routes %} ExecStop=-/usr/sbin/ip route del {{ route }} table {{ policy_routing_table_id }} {% endfor %} ExecStop=-/usr/sbin/ip route flush table {{ policy_routing_table_id }} {% endif %} [Install] WantedBy=multi-user.target