如果由此匹配的数据包的子集,则推广一个或一组先前规则 规则也与前面的规则匹配,但采取不同的行动。例如,r5是上表中r4的推广。这两条规则表明允许来自10.1.1。*的所有数据包,除了从10.1.1。*到192.168.1的端口25的TCP数据包。*。
所以我的问题是我们如何在C#中实现这一点,如何找到通用规则?如何比较两个IP地址以及如何查找一个IP地址是否落在另一个IP地址的范围内
答案 0 :(得分:2)
当我需要比较/排序IP地址时,我总是首先将它们转换为它们的(32位)数字表示,然后根据需要进行常规的数字比较/排序,而不是尝试将每个单独的八位字节进行比较一个字符串。
转换本身可以通过以下方式完成:
uint ipAsNum = BitConverter.ToUInt32( IPAddress.Parse( ipAsString ).GetAddressBytes(), 0 );
答案 1 :(得分:1)
看来你的问题分为两部分:
首先支持ACL样式规则的算法
和
其次,如何比较IP地址以查看它们是否符合规则。
要构建此类规则检查,您可以按降序对每个规则检查此数据的实例,同时跟踪条件是否通过。由于您按降序排列,因此顶部的规则将覆盖底部的规则。如果实例数据与条件匹配,则应将状态设置为“Action”值。
要查看ip地址是否与您的ip格式匹配,请将通配符转换为0.然后将ip地址转换为数字格式,如szr中的其他答案所示。然后你可以使用按位数学来查看ip是否适合该通配符。这也有支持CIDR网络范围的优势,而不仅仅是A,B,C类。
答案 2 :(得分:0)
我建议使用IPNetwork Library https://github.com/lduchosal/ipnetwork。 从版本2开始,它也支持IPv4和IPv6。
<强>包含强>
eval
输出
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);
玩得开心!