Валидация IP адреса

Как валидировать IP адреса для легального доступа? У меня есть следующий список:

185.71.76.0/27
185.71.77.0/27
77.75.153.0/25
77.75.156.11
77.75.156.35
77.75.154.128/25
2a02:5180::/32

Как видно тут есть разные маски и версии протокола. Доступ к некоторым методам API может осуществляться только с этих адресов, но я не знаю как мне узнать является ли текущий IP адресс легальным.

Я знаю, что есть класс IPNetwork из Microsoft.AspNetCore.HttpOverrides, но я не знаю как мне сохранить список выше для валидации.


Ответы (1 шт):

Автор решения: Vein

Есть удобная библиотека IpAddressRange, он же в NuGet Она умеет как в IpV4 так и в IpV6, включая маски и диапазоны.

И пример, как заблочить серые адреса. Можно по аналогии наполнить список своими адресами и настроить Middleware или любым другим удобным способом блокировку.

        /// <summary>
        /// Список частных "серых" адресов.
        /// </summary>
        private static readonly List<IPAddressRange> _privateIpAddresses =
            new List<IPAddressRange>()
            {
                IPAddressRange.Parse("0.0.0.0/8"),
                IPAddressRange.Parse("0.0.0.0/32"),
                IPAddressRange.Parse("10.0.0.0/8"),
                IPAddressRange.Parse("100.64.0.0/10"),
                IPAddressRange.Parse("127.0.0.0/8"),
                IPAddressRange.Parse("169.254.0.0/16"),
                IPAddressRange.Parse("172.16.0.0/12"),
                IPAddressRange.Parse("192.0.0.0/24"),
                IPAddressRange.Parse("192.0.0.0/29"),
                IPAddressRange.Parse("192.0.0.170/32"),
                IPAddressRange.Parse("192.0.0.171/32"),
                IPAddressRange.Parse("192.0.2.0/24"),
                IPAddressRange.Parse("192.168.0.0/16"),
                IPAddressRange.Parse("198.51.100.0/24"),
                IPAddressRange.Parse("198.18.0.0/15"),
                IPAddressRange.Parse("203.0.113.0/24"),
                IPAddressRange.Parse("255.255.255.255/32")
            };
        /// <summary>
        /// Проверяет, является ли IP адрес публичным
        /// (отсутствие в "сером" диапазоне адресов).
        /// </summary>
        /// <param name="ipString">IP адрес.</param>
        public static bool IsPublicIpAddress(string ipString)
        {
            var ipAddress = IPAddress.Parse(ipString);

            return _privateIpAddresses.All(range => !range.Contains(ipAddress));
        }

А вообще, блокировки или белые списки по IP обычно делаются на уровне инфраструктуры - например в Nginx прокси.

P.s. вариант в комментариях от @aepot тоже хорош

→ Ссылка