Comment vérifier une adresse IP d’entrée dans une plage d’adresses IP spécifique

Si nous permettons aux utilisateurs de saisir quelques plages ip, par exemple 172.16.11.5 – 100, comment pourrais-je écrire une fonction pour vérifier si une adresse IP (172.16.11.50) se trouve dans les plages?

Existe-t-il une bibliothèque existante dans .NET?

Il n’y a rien dans le framework, mais créer une classe IPAddressRange pas beaucoup d’efforts.

Vous comparez les plages en appelant IPAddress.GetAddressBytes sur l’adresse inférieure, l’adresse supérieure et l’adresse de comparaison. À partir du premier octet, vérifiez si l’adresse de comparaison est dans la plage de l’adresse supérieure / inférieure.

Cette méthode fonctionne pour les adresses IPv4 et IPv6.

 public class IPAddressRange { readonly AddressFamily addressFamily; readonly byte[] lowerBytes; readonly byte[] upperBytes; public IPAddressRange(IPAddress lowerInclusive, IPAddress upperInclusive) { // Assert that lower.AddressFamily == upper.AddressFamily this.addressFamily = lowerInclusive.AddressFamily; this.lowerBytes = lowerInclusive.GetAddressBytes(); this.upperBytes = upperInclusive.GetAddressBytes(); } public bool IsInRange(IPAddress address) { if (address.AddressFamily != addressFamily) { return false; } byte[] addressBytes = address.GetAddressBytes(); bool lowerBoundary = true, upperBoundary = true; for (int i = 0; i < this.lowerBytes.Length && (lowerBoundary || upperBoundary); i++) { if ((lowerBoundary && addressBytes[i] < lowerBytes[i]) || (upperBoundary && addressBytes[i] > upperBytes[i])) { return false; } lowerBoundary &= (addressBytes[i] == lowerBytes[i]); upperBoundary &= (addressBytes[i] == upperBytes[i]); } return true; } } 

NB: Le code ci-dessus pourrait être étendu pour append des méthodes de fabriques statiques publiques FromCidr(IPAddress address, int bits)

Vous voudrez peut-être considérer cette bibliothèque par @jsakamoto, ce qui vous permet d’parsingr une plage d’adresses IP telle que “192.168.0.0/24” et “192.168.0.0/255.255.255.0” et “192.168.0.0-192.168.0.255” , et peut conatins vérifier. Cette bibliothèque prend en charge à la fois IPv4 et IPv6.

https://github.com/jsakamoto/ipaddressrange

Il peut également être installé via NuGet:

http://www.nuget.org/packages/IPAddressRange/

 using NetTools; ... // rangeA.Begin is "192.168.0.0", and rangeA.End is "192.168.0.255". var rangeA = IPAddressRange.Parse("192.168.0.0/255.255.255.0"); rangeA.Contains(IPAddress.Parse("192.168.0.34")); // is True. rangeA.Contains(IPAddress.Parse("192.168.10.1")); // is False. rangeA.ToCidrSsortingng(); // is 192.168.0.0/24 // rangeB.Begin is "192.168.0.10", and rangeB.End is "192.168.10.20". var rangeB1 = IPAddressRange.Parse("192.168.0.10 - 192.168.10.20"); rangeB1.Contains(IPAddress.Parse("192.168.3.45")); // is True. rangeB1.Contains(IPAddress.Parse("192.168.0.9")); // is False. // Support shortcut range description. // ("192.168.10.10-20" means range of begin:192.168.10.10 to end:192.168.10.20.) var rangeB2 = IPAddressRange.Parse("192.168.10.10-20"); // Support CIDR expression and IPv6. var rangeC = IPAddressRange.Parse("fe80::/10"); rangeC.Contains(IPAddress.Parse("fe80::d503:4ee:3882:c586%3")); // is True. rangeC.Contains(IPAddress.Parse("::1")); // is False. 
 public static bool IsInRange(ssortingng startIpAddr, ssortingng endIpAddr, ssortingng address) { long ipStart = BitConverter.ToInt32(IPAddress.Parse(startIpAddr).GetAddressBytes().Reverse().ToArray(), 0); long ipEnd = BitConverter.ToInt32(IPAddress.Parse(endIpAddr).GetAddressBytes().Reverse().ToArray(), 0); long ip = BitConverter.ToInt32(IPAddress.Parse(address).GetAddressBytes().Reverse().ToArray(), 0); return ip >= ipStart && ip <= ipEnd; //edited } Console.WriteLine(IsInRange("100.0.0.1", "110.0.0.255", "102.0.0.4"));//true 

Le mieux est de convertir ces adresses en un entier et d’effectuer ensuite des comparaisons.

Exemple d’ici: IP vers Integer

Pour convertir une adresse IP en entier, divisez-la en quatre octets. Par exemple, l’adresse IP que vous avez fournie peut être divisée en:

 First Octet: 217 Second Octet: 110 Third Octet: 18 Fourth Octet: 206 

Pour calculer l’adresse décimale à partir d’une chaîne pointillée, effectuez le calcul suivant.

  (first octet * 256³) + (second octet * 256²) + (third octet * 256) + (fourth octet) = (first octet * 16777216) + (second octet * 65536) + (third octet * 256) + (fourth octet) = (217 * 16777216) + (110 * 65536) + (18 * 256) + (206) = 3647869646 

Considérant IPv6, vous pouvez également les convertir en entiers (128 bits vs IPv4 32 bits). Jetez un coup d’oeil à cette question: Formater IPv6 en tant qu’int en C # et le stocker dans SQL Server

La voie la plus simple est d’obtenir le cadre pour le faire pour vous. Utilisez IPAddress.Parse pour parsingr l’adresse, puis IPAddress.GetAddressBytes pour obtenir le “numéro” en tant byte[] .

J’ai utilisé ce code sur codeproject avant, ce qui peut vous être utile.

http://www.codeproject.com/KB/IP/ipnumbers.aspx

Vous avez la possibilité d’append à IPList une plage de numéros IP définie par un numéro From IP et un numéro IP. La méthode divise la plage en plages IP standard et trouve leurs masques. La plage “10.0.0.5” à “10.0.0.20” sera donc répartie dans les plages suivantes: 10.0.0.5, 10.0.0.20, 10.0.0.6/31, 10.0.0.16/30 et 10.0. 0.8 / 29 et vous aurez la possibilité de vérifier par rapport à cela.

Clause de non-responsabilité: la classe est uniquement testée avec des ensembles de données simples, et la classe ne dispose pas de la validation des numéros IP et des masques IP fournis. Cela doit être corrigé avant son utilisation dans les environnements de production.

republiant ma réponse d’ ici

Il y a quelque temps, je devais trouver l’emplacement d’une adresse IP donnée. Nous avons l’IP de la demande. Il existe des bases de données gratuites qui nous ont donné cette cartographie. Dans IPv4, quand on dit l’IP comme “abcd” c’est essentiellement a * (256^3) + b * (256^2) + c * (256) + d .

http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp

Donc, quand vous dites que vous voulez une adresse IP commençant par “a”, vous recherchez des adresses IP comsockets entre * 256 ^ 3 et * 256 ^ 3 + 256 * (256 ^ 2) (b = 256) + 256 * (256 ) (c = 256) + 256 (d = 256) (la limite inférieure / supérieure peut varier légèrement selon que vous souhaitez inclure / exclure les limites).

Cela dit, il existe des adresses IP spécifiques réservées à des fins spécifiques (comme 127.0.0.1 qui est localhost, 0.0.0.0 ne peut pas être une adresse IP, etc.).

Donc votre requête linq serait

 from i in iList where i >= MIN && i <= MAX select i; 

où iList est votre liste initiale MIN est votre valeur minimale pour votre plage MAX est votre valeur maximale pour votre plage

Pouvez-vous déterminer le masque de sous – réseau de votre plage IP?

Si oui, alors peut-être que vous pourriez utiliser cette méthode IsInSameSubnet .