Ground-Zerro/DomainMapper

Группировка по подсетям

sergeeximius opened this issue · 4 comments

Себе для роутера выбирал IP адрес куда идет запрос от YouTube, смотрел через whois кому принадлежит этот IP адрес и там же получал информацию о подсети. В маршрутизацию на роутере добавлял уже подсеть.
Это проще и меньше записей в маршрутах роутера. Если я вижу что вся подсеть принадлежит Google или конкретно YouTube, то логичнее всю ее добавить в маршрут, а не выбирать из нее конкретные адреса, которые завтра уже могут поменяться на другие.
Если сможете такую доработку сделать, то будет шикарно. Пока для себя попробую написать этот скрипт самостоятельно.

Вот такой шелл скрипт собирает в подсети. В моем случае для YouTube получилось совсем компактно. Хотя изначально было 193 адреса

for ip in $(cat domain-ip-resolve.txt); do whois $ip | grep CIDR | awk '{print $2}'; done > domain-cidr-resolve.txt
cat domain-cidr-resolve.txt | sort | uniq
108.177.0.0/17
142.250.0.0/15
172.217.0.0/16
173.194.0.0/16
209.85.128.0/17
216.239.32.0/19
64.233.160.0/19
74.125.0.0/16

Вот такой шелл скрипт собирает в подсети. В моем случае для YouTube получилось совсем компактно. Хотя изначально было 193 адреса

Вполне рабочий вариант.
Тоже заворачивал целыми подсетями, но выползли нюансы. Оказалось, что не то что в одной подсети, а на одном IP может вполне себе крутиться как запрещенный в РФ сервис так и какой-нибудь региональный портал не пускающий с зарубежных IP... Такой вот фокус ))

Работает и хорошо. Главное чтоб вас устраивало.

Большим недостатком варианта с предопределенными списками в их низкой кастомизации - что необходимо одному то может быть ненужным другому.
В планах добавить возможность пользователю работать с собственным списком где будет только необходимое ему лично.

Вообще надежнее резолвить интересующие DNS на лету и сразу заворачивать маршруты к их IP прямо на своем роутере. Жаль доступна такая "радость" не на всех устройствах. Пробовал это решить в [DNS-RouteSync-Navigator] (https://github.com/Ground-Zerro/DNS-RouteSync-Navigator).

Оформил в виде скрипта. Вдруг пригодится. Как вариант можно использовать его по завершению (run=)

convert_cidr_to_dotted.sh
`#!/bin/bash

function print_win_route() {
for ip_cidr in $(cat domain-cidr-resolve.txt | sort | uniq); do
ip="$(echo "${ip_cidr}" | cut -d '/' -f 1)";
netmask_dotted="$(cidr2netmask $ip_cidr)"
echo "route add $ip mask $netmask_dotted 0.0.0.0";
done
}

function cidr2netmask() {
local ip_cidr="${1}"
netmask_length="$(echo "${ip_cidr}" | cut -d '/' -f 2)"
host_length="$((32-netmask_length))"
ones="$(head -c "${netmask_length}" /dev/zero | tr '\0' '1')"
zeros="$(head -c "${host_length}" /dev/zero | tr '\0' '0')"
sequence="$(sed -E 's/(.{8})(.{8})(.{8})(.{8})/\1;\2;\3;\4/' <<< "${ones}${zeros}")"
echo "obase=10; ibase=2; ${sequence}" | bc | xargs | tr ' ' '.'
}

for ip in $(cat domain-ip-resolve.txt); do whois $ip | grep CIDR | awk '{print $2}'; done > domain-cidr-resolve.txt
print_win_route
`

Добавлена возможность объединить IP-адреса в подсеть до /24 (255.255.255.0).
Позже может сделаю до /16 (255.255.0.0).