You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

3.8 KiB

TUN Route (tun_route)

1. Назначение

Модуль управления маршрутами в системной таблице маршрутизации. Добавляет маршруты к заданным подсетям через TUN-интерфейс, чтобы исходящий трафик на эти подсети направлялся в виртуальный интерфейс uTun. Удаляет их при завершении работы. Кроссплатформенный: использует разные механизмы ОС с fallback-стратегией.

2. Как пользоваться

// Добавить один маршрут
tun_route_add(ifindex, "tun0", 0x0A000000, 8);   // 10.0.0.0/8

// Добавить все маршруты из конфига
tun_route_add_all(ifindex, "tun0", cfg.routes);

// Удалить все маршруты из конфига
tun_route_del_all(ifindex, "tun0", cfg.routes);

// Удалить все маршруты через интерфейс (очистка)
tun_route_flush("tun0");

Network передаётся в host byte order (внутри конвертируется в network byte order). tun_route_add_all/tun_route_del_all проходят по связному списку CFG_ROUTE_ENTRY и вызывают tun_route_add/tun_route_del для каждого элемента.

Root-права: требуются для изменения системной таблицы маршрутизации.

3. API

Функции

  • tun_route_add(ifindex, ifname, network, prefix_len) — добавляет маршрут к подсети network/prefix_len через интерфейс ifindex. Пытается использовать нативный механизм платформы, при неудаче — fallback на shell-команду
  • tun_route_del(ifindex, ifname, network, prefix_len) — удаляет аналогичный маршрут
  • tun_route_add_all(ifindex, ifname, routes) — массовое добавление маршрутов из связного списка CFG_ROUTE_ENTRY. Возвращает количество успешно добавленных
  • tun_route_del_all(ifindex, ifname, routes) — массовое удаление. Возвращает количество удалённых
  • tun_route_flush(ifname) — удаление всех маршрутов, привязанных к интерфейсу ifname, без привязки к конфигу

Платформенные механизмы

Linux:

  1. Netlink socket (AF_NETLINK, NETLINK_ROUTE): сообщения RTM_NEWROUTE/RTM_DELROUTE с атрибутами RTA_DST (адрес сети) и RTA_OIF (индекс интерфейса). Ожидание ACK от ядра через poll с таймаутом 1с
  2. Fallback: ip route add/del <net>/<prefix> dev <ifname> через system()
  3. tun_route_flush: ip route flush dev <ifname>, при неудаче — парсинг ip route show и удаление по одному

Windows:

  1. netsh interface ip add/delete route через system() (первичный метод)
  2. Fallback: IP Helper API — CreateIpForwardEntry/DeleteIpForwardEntry с заполнением MIB_IPFORWARDROW
  3. tun_route_flush: GetIpForwardTable → перебор записей по dwForwardIfIndex → DeleteIpForwardEntry

BSD/macOS:

  1. Routing socket (PF_ROUTE, SOCK_RAW): сообщения RTM_ADD/RTM_DELETE, адреса RTA_DST + RTA_NETMASK + RTA_IFP (sockaddr_dl)
  2. Fallback: route add/delete -net <net>/<prefix> -interface <ifname> через system()
  3. tun_route_flush: route -n show -interface <ifname> → парсинг awk → route delete