C# 比较c中的IPv4地址#

C# 比较c中的IPv4地址#,c#,firewall,C#,Firewall,如果数据包的子集与此规则匹配,则泛化一个或一组先前规则 规则也与前面的规则匹配,但采取不同的操作。例如,r5是上表中r4的推广。这两条规则表明,除了从10.1.1.*到192.168.1.*的端口25的TCP数据包外,允许从10.1.1.*发送所有数据包 我的问题是,我们如何在C#中实现这一点,如何找到广义规则?如何比较两个IP地址以及如何查找一个IP地址是否在另一个IP地址的范围内每当我需要比较/排序IP地址时,我总是先将其转换为(32位)数字表示形式,然后根据需要进行常规的数字比较/排序,而

如果数据包的子集与此规则匹配,则泛化一个或一组先前规则 规则也与前面的规则匹配,但采取不同的操作。例如,r5是上表中r4的推广。这两条规则表明,除了从10.1.1.*到192.168.1.*的端口25的TCP数据包外,允许从10.1.1.*发送所有数据包


我的问题是,我们如何在C#中实现这一点,如何找到广义规则?如何比较两个IP地址以及如何查找一个IP地址是否在另一个IP地址的范围内每当我需要比较/排序IP地址时,我总是先将其转换为(32位)数字表示形式,然后根据需要进行常规的数字比较/排序,而不是试图将每个八位字节作为字符串进行比较

转换本身可以通过以下方式完成:

uint ipAsNum = BitConverter.ToUInt32( IPAddress.Parse( ipAsString ).GetAddressBytes(), 0 );

您的问题似乎分为两部分:

首先是支持ACL样式规则的算法

第二,如何比较ip地址以查看它们是否符合规则

要构建这种类型的规则检查,您需要根据每个规则按降序检查此数据的实例,同时跟踪条件是通过还是失败。因为您是按降序进行的,所以顶部的规则将覆盖底部的规则。如果实例数据与条件匹配,则应将状态设置为“Action”值


若要查看ip地址是否与您的ip格式匹配,请将通配符转换为0。然后将ip地址转换为数字格式,如szr的另一个答案所示。然后,您可以使用位数学来查看ip是否符合该通配符。这还具有支持CIDR网络范围而不仅仅是A、B、C类的优势。

我建议使用IPNetwork库。 从版本2开始,它还支持IPv4和IPv6

包含

IPNetwork ipnetwork1 = IPNetwork.Parse("10.1.0.0/16");    // 10.1.*.*
IPNetwork ipnetwork2 = IPNetwork.Parse("192.168.1.0/24"); // 192.168.1.*

IPAddress ipaddress1 = IPAddress.Parse("192.168.1.1");
IPAddress ipaddress2 = IPAddress.Parse("192.168.2.100");
IPAddress ipaddress3 = IPAddress.Parse("10.1.2.3");
IPAddress ipaddress4 = IPAddress.Parse("10.4.5.6");


bool contains1 = IPNetwork.Contains(ipnetwork2, ipaddress1);
bool contains2 = IPNetwork.Contains(ipnetwork2, ipaddress2);
bool contains3 = IPNetwork.Contains(ipnetwork1, ipaddress3);
bool contains4 = IPNetwork.Contains(ipnetwork1, ipaddress4);


Console.WriteLine("{0} contains {1} : {2}", ipnetwork1, ipaddress1, contains1);
Console.WriteLine("{0} contains {1} : {2}", ipnetwork1, ipaddress2, contains2);
Console.WriteLine("{0} contains {1} : {2}", ipnetwork2, ipaddress3, contains3);
Console.WriteLine("{0} contains {1} : {2}", ipnetwork2, ipaddress4, contains4);
输出

10.1.0.0/16 contains 192.168.1.1 : True
10.1.0.0/16 contains 192.168.2.100 : False
192.168.1.0/24 contains 10.1.2.3 : True
192.168.1.0/24 contains 10.4.5.6 : False
玩得开心