Вопрос проверяет понимание работы подсетей, масок и алгоритмов проверки IP по диапазонам.
IP-адрес проверяют, применяя маску подсети и сравнивая сетевую часть адреса с сетевым префиксом. Обычно список подсетей хранится в виде CIDR, например 192.168.1.0/24. При проверке IP переводят в число, применяют маску и сравнивают результат. Такой подход используется в firewall, прокси и системах авторизации.
Проверка принадлежности IP подсети основана на работе сетевой маски.
Определение:
IP принадлежит подсети, если после применения маски его сетевая часть совпадает с сетевой частью подсети.
Формально:
(ip & mask) == network
Подсеть:
192.168.1.0/24
IP:
192.168.1.42
После применения маски 255.255.255.0 обе сетевые части совпадут.
ip := net.ParseIP("192.168.1.42")
_, subnet, _ := net.ParseCIDR("192.168.1.0/24")
if subnet.Contains(ip) {
// IP находится в подсети
}
В реальных системах:
список подсетей загружается в память
выполняется проверка по каждой подсети
при совпадении IP блокируется
При большом количестве подсетей:
используют префиксные деревья
сортируют диапазоны
используют специализированные структуры
Такой механизм используется:
firewall
API gateway
антифрод-системы
Проверка IP на принадлежность подсети основана на побитовом сравнении с маской и широко используется в сетевой фильтрации.