:local wgInterface "wg0";
:local commentTag "GitHubRoute";
:local routeTable "main";
:local urls {
"https://raw.githubusercontent.com/lord-alfred/ipranges/main/openai/ipv4.txt";
"https://raw.githubusercontent.com/lord-alfred/ipranges/main/google/ipv4.txt";
"https://raw.githubusercontent.com/SecOps-Institute/FacebookIPLists/master/facebook_ip_list.lst"
};
# Удаляем старые маршруты
/ip route remove [find comment=$commentTag];
:foreach url in=$urls do={
:log info ("Обрабатываем: ".$url);
# Загружаем данные напрямую в переменную
:local result [/tool fetch url=$url as-value output=user];
:if ($result->"status" = "finished") do={
:local data ($result->"data");
:local line "";
:local pos 0;
:local len [:len $data];
:while ($pos < $len) do={
:local ch [:pick $data $pos];
:if ($ch = "\n" || $ch = "\r") do={
# Проверяем CIDR-формат (x.x.x.x/x)
:if ([:len $line] > 0 && [:pick $line 0 1] != "#") do={
:local slashPos [:find $line "/"];
:if ($slashPos > 0) do={
:local ipPart [:pick $line 0 $slashPos];
:local maskPart [:pick $line ($slashPos+1) [:len $line]];
# Проверяем что это валидный IP и маска
:if ([:len $ipPart] > 6 && [:len $maskPart] > 0 && [:tonum $maskPart] > 0 && [:tonum $maskPart] <= 32) do={
/ip route add dst-address=$line gateway=$wgInterface \
routing-table=$routeTable distance=20 comment=$commentTag;
}
}
};
:set line "";
} else={
:set line ($line.$ch);
};
:set pos ($pos + 1);
};
# Обработка последней строки
:if ([:len $line] > 0 && [:pick $line 0 1] != "#") do={
:local slashPos [:find $line "/"];
:if ($slashPos > 0) do={
/ip route add dst-address=$line gateway=$wgInterface \
routing-table=$routeTable distance=20 comment=$commentTag;
}
};
:log info ("Добавлено маршрутов из ".$url);
} else={
:log warning ("Ошибка загрузки: ".$url);
};
:delay 1s;
};
github-routes.rsc
/import file-name=github-routes.rsc