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
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:
- Netlink socket (
AF_NETLINK,NETLINK_ROUTE): сообщенияRTM_NEWROUTE/RTM_DELROUTEс атрибутамиRTA_DST(адрес сети) иRTA_OIF(индекс интерфейса). Ожидание ACK от ядра черезpollс таймаутом 1с - Fallback:
ip route add/del <net>/<prefix> dev <ifname>черезsystem() tun_route_flush:ip route flush dev <ifname>, при неудаче — парсингip route showи удаление по одному
Windows:
netsh interface ip add/delete routeчерезsystem()(первичный метод)- Fallback: IP Helper API —
CreateIpForwardEntry/DeleteIpForwardEntryс заполнениемMIB_IPFORWARDROW tun_route_flush:GetIpForwardTable→ перебор записей поdwForwardIfIndex→DeleteIpForwardEntry
BSD/macOS:
- Routing socket (
PF_ROUTE,SOCK_RAW): сообщенияRTM_ADD/RTM_DELETE, адреса RTA_DST + RTA_NETMASK + RTA_IFP (sockaddr_dl) - Fallback:
route add/delete -net <net>/<prefix> -interface <ifname>черезsystem() tun_route_flush:route -n show -interface <ifname>→ парсинг awk →route delete